我们目前有3篇很朦胧的文章介绍到了CERL:
本文打算深入一点,谈谈CERL的一个核心内容:SDL语法及其类型系统。
我们知道,CERL中是以SDL(Server Description Language)这样一门语言来描述服务器接口的。其实,从最真实的历史角度来说,SDL是先于CERL这个框架出来的,有了完整的SDL语法设计(我个人认为非常优雅的结合了Erlang与静态语言的长处),才促使我确定要实现CERL。可以明确地说,SDL语言是我认为CERL库中最重要的成就。
SDL语言中全局可以定义3种元素:code,type,server。样例:
其中code就是一般语言中的常量,或者对应为枚举值。SDL内置有一些code,如:ok,true,false,error 等。
type则为类型别名。上面这个样例过于简单,其实远没有体现出SDL的类型系统的复杂性出来。完整来讲,SDL的类型系统是这样的:
- 内置类型:Char, UInt32/Int32, UInt16/Int16, String, etc.
- 定长数组:Char[16], String[32], etc.
- 不定长数组:Char[], String[], etc.
- 结构体:{Char a, UInt32 b, Char[] c, String[32] d}
- 枚举类型:code1 | code2 | code3
- 条件类型:{ok, Char a, UInt32 b, Char[] c, String[32] d} | code1 | {code2, Char e, String[32] f}
所有类型都可以定义别名,如:
- type A = Char;
- type MD5 = Char[16];
- type Reason = code1 | code2 | code3;
- type AStruc = {Char a, UInt32 b, Char[] c, String[32] d};
- type Foo = {ok, Char a, UInt32 b, Char[] c, String[32] d} | code1 | {code2, AStruc value};
这里有几个值得注意的关键点:
- 从概念上来讲,type语句并不是产生新的类型,只是为了给某个类型定义别名。理论上说,类型 {Char a, {Int32 b, String c} v} 是一个合法的类型,它有两个成员a和v,其中v是一个结构体。但是这样的语法很难阅读,所以我们在编译器中做了限制,禁止了这种写法。而是要求写成 type SubStruct = {Int32 b, String c}; 然后再定义 {Char a, SubStruct v}。
- 枚举类型其实是条件类型的一个特殊情况。
对应到其他语言,可能除了条件类型外,其他都比较容易找到相应的概念。对于这样的一个条件类型:
- {ok, Char a, UInt32 b, Char[] c, String[32] d} | code1 | {code2, Char e, String[32] f}
在C/C++中可能翻译成类似以下这种结构(只是表意,并非SDLC真实的翻译结果):
介绍完 SDL 的类型系统,再介绍 server 就简单了。和一般语言的 class 一样,server 有构造函数,有成员。成员可以是 code, type, function。其中,code,type 比较简单,只是说这些常量和类型在本 server 名字空间内而已。function 则类似一般语言的成员函数(member function),只是有几个特别的地方:
- 这些 function 有 id。
- function 默认为同步方法,但可以显式申明为异步的(async),异步方法没有返回值。
- 同步方法的语法为 funcName(Type1 arg1, ...) -> RetType;
- 异步方法的语法为 funcName(Type1 arg1, ...);
- 和一般语言的 function 很不一样的是,SDL server 的 function 参数全部为输入参数,没有 out 参数的概念。所有的输出都通过 RetType 返回。
注意,同步方法的 RetType 我们要求必须是条件类型。其实道理很简单:因为 server 之间的通讯是不可靠的,可能会因为机器、网络或软件故障等原因导致信息不能抵达。要求 RetType 为条件类型的好处是,系统可以返回一些 SDL 中没有描述的 code。如:
- [id=2] get(KeyT key) -> {ok, ValueT value} | false;
这样的一个定义,相当于是这样的:
- [id=2] get(KeyT key) -> {ok, ValueT value} | false | timeout | ioerror | ...;
后面有多少种可能的错误码并不确定,和 CERL 的实现有关。
至此,CERL 的 SDL 文法介绍完毕,下面是提问时间。
分享到:
相关推荐
CERL,全称为C-Erlang,是一个面向C语言的并发编程框架,...通过深入学习CERL2.0,开发者可以掌握一种在C语言环境中实现高并发、高可用、分布式系统的有效方法,这对于构建高性能的服务器软件和物联网应用非常有价值。
从 Erlang 到 CERL 到 Golang
Lotus Domino 是一款历史悠久的企业级协同办公和应用开发平台,起源于1973年的伊利诺伊州立大学Computer-based Education Research Laboratory(CERL)的PLATO Notes系统。随着时间的推移,PLATO Notes发展成为...
针对地图的Erlang QuickCheck测试 在我们的代码库中,地图正变得越来越根深蒂固。 该存储库包含用于针对地图操作运行QuickCheck的完整套件,希望它可以发现或提供稳定的...## Replace with ${ERL_TOP}/bin/cerl -debug
Loris是CERL声音小组的Kelly Fitz和Lippold Haken开发的用于声音分析,合成和变体的库。 Loris包括C ++类库,Python模块,C可链接接口,命令行实用程序和文档。
Loris 是一个用于声音分析、合成和变形的库,由 CERL Sound Group 的 Kelly Fitz 和 Lippold Haken 开发。 Loris 包括一个 C++ 类库、Python 模块、C-linkable 接口、命令行实用程序和文档。