第一篇正式介绍CERL的文章:CERL SDL 语法及类型系统

1 view
Skip to first unread message

shiwei xu

unread,
Aug 14, 2009, 1:23:05 AM8/14/09
to ECUG~erlang中文用户组, erlang-china, dev4s...@googlegroups.com, pon...@googlegroups.com
还是有不少人问及CERL,希望了解更详细的资料。这篇可以算是个开头。
更精彩的内容,会在今年10-24~25日的CN Erlounge IV上介绍。关于CN Erlounge IV,请浏览 http://ecug.org/
 
 
---

我们目前有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 文法介绍完毕,下面是提问时间。

莫华枫

unread,
Aug 14, 2009, 1:49:49 AM8/14/09
to pon...@googlegroups.com
还是把问题搬到这儿来吧:貌似条件类型象variant的扩展,或者说可自定义的variant?

shiwei xu

unread,
Aug 14, 2009, 1:54:34 AM8/14/09
to pon...@googlegroups.com
翻译成 C/C++ 和 variant 看起来有点像。不过定位上完全不同的,在 SDL 中,条件类型和结构体类似,是语言定义(或者说描述)复合类型的基础设施。你可以拿条件类型和结构体、联合体(union)相比,但是和variant是不同的东西。因为variant只是一个类型,而条件类型是一种复合类型的构成方式。

2009/8/14 莫华枫 <longsh...@gmail.com>

shiwei xu

unread,
Aug 14, 2009, 1:59:55 AM8/14/09
to pon...@googlegroups.com, ECUG~erlang中文用户组, erlang-china, dev4s...@googlegroups.com

其实把条件类型:

{ok, Char a, UInt32 b, Char[] c, String[32] d} | code1 | {code2, Char e, String[32] f}

翻译成:

struct   
{  
    int code;  
    union 
    {  
        struct {  
            Char a;  
            UInt32 b;  
            DynamicArray<Char> c;  
            String d[32];  
        } ok;  
        struct {  
            Char e;  
            String f[32];  
        } code2;  
    }  
}; 

是有信息损失的,C/C++ 的代码需要配合上辅助文档,才能够说得清楚这个结构体的含义。而SDL中的描述是自完善的,不需要任何补充说明。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xushiweizh/archive/2009/08/14/4444942.aspx

2009/8/14 shiwei xu <xushi...@gmail.com>

up duan

unread,
Aug 14, 2009, 2:41:29 AM8/14/09
to pon...@googlegroups.com


2009/8/14 shiwei xu <xushi...@gmail.com>

翻译成 C/C++ 和 variant 看起来有点像。不过定位上完全不同的,在 SDL 中,条件类型和结构体类似,是语言定义(或者说描述)复合类型的基础设施。你可以拿条件类型和结构体、联合体(union)相比,但是和variant是不同的东西。因为variant只是一个类型,而条件类型是一种复合类型的构成方式。

推荐:《类型程序语言》。你对Variant似乎有点偏见。

shiwei xu

unread,
Aug 14, 2009, 2:43:37 AM8/14/09
to pon...@googlegroups.com
哦?我在什么地方表现出了对variant的偏见呢?

2009/8/14 up duan <fix...@gmail.com>

up duan

unread,
Aug 14, 2009, 2:52:21 AM8/14/09
to pon...@googlegroups.com


2009/8/14 shiwei xu <xushi...@gmail.com>
哦?我在什么地方表现出了对variant的偏见呢?

:),或许没有。我说的是似乎。 

up duan

unread,
Aug 14, 2009, 2:53:42 AM8/14/09
to pon...@googlegroups.com


2009/8/14 up duan <fix...@gmail.com>



2009/8/14 shiwei xu <xushi...@gmail.com>
哦?我在什么地方表现出了对variant的偏见呢?

:),或许没有。我说的是似乎。 

variant其实并不“只是一个类型”。variant其实就是条件类型。

shiwei xu

unread,
Aug 14, 2009, 5:03:59 AM8/14/09
to pon...@googlegroups.com
嗯,我明白了,你所说的variant是boost variant,确实它不只是一个类型。我说的variant是windows sdk中的variant,所指不同。

莫华枫

unread,
Aug 14, 2009, 8:53:46 AM8/14/09
to pon...@googlegroups.com


2009/8/14 shiwei xu <xushi...@gmail.com>

嗯,我明白了,你所说的variant是boost variant,确实它不只是一个类型。我说的variant是windows sdk中的variant,所指不同。

阿,那应该是我的错,如果我写成Variant,或许就不会误会了。:)

shiwei xu

unread,
Aug 15, 2009, 1:14:34 AM8/15/09
to erlang...@googlegroups.com, ECUG~erlang中文用户组, dev4s...@googlegroups.com, pon...@googlegroups.com
目前有sdlc,以后会增加 sdlpy (for python), sdlj (java), etc.

2009/8/15 Hou Ming Yuan <houmi...@gmail.com>
许老大,
我们的服务器集群,c++语言写核心服务,python整合监控系统日志系统配置管理,客户端可能是多种的c++,actionscript
这套定义语言是否公布编码方案,可以开发的增加其他语言的映射?

2009/8/14 shiwei xu <xushi...@gmail.com>:

莫华枫

unread,
Aug 15, 2009, 10:07:50 AM8/15/09
to pon...@googlegroups.com
异步的function调用如何从server获得反馈呢?

shiwei xu

unread,
Aug 15, 2009, 11:00:40 AM8/15/09
to pon...@googlegroups.com
server 向调用者发送异步(或同步)消息。

2009/8/15 莫华枫 <longsh...@gmail.com>
Reply all
Reply to author
Forward
0 new messages