Erlang vs TNSDL

 

    TNSDL是Nokia内部用于开发电信交换软件的私有语言,是在SDL语言的基础上加以修改而成,TNSDL需翻译成C语言得以编译执行,TNSDL语言中实现了异步并行的特点,当然要完整实现异步并行还需要运行时动态库的支持,异步并行类似于Erlang的process(轻量级进程),TNSDL中则称之为hand,Erlang是基于vm(beam)开发,而TNSDL则没有vm的支持,那么这个基于C为中间语言的TNSDL是如何实现轻量级进程并发的呢?答案是stack快速切换,程序维护着一定数量的空闲"stack",当需要执行一个hand时就在stack pool中选取一个stack,然后发送Linux signal使当前的stack切换至刚选中的临时stack,在执行hand代码是如遇到异步等待点(如正在等待消息),就再一次执行stack切换去执行其他hand代码,如刚才的hand收到了消息后,则程序又切换到第一个stack继续执行第一个hand的代码,这样就实现了用“C+动态库”实现异步并行的框架,和Erlang的process执行基本类似,但也不完全相同,相比而言erlang在vm的支持下实现的更好。

    Erlang的process有reduction,原理类似于kernel的time slice,用于统计每个process占用CPU的时间,这是scheduler的工作核心,具体说就是Erlang可以在任何时间点切换到其他process执行,而无需等到异步等待点,但TNSDL则无法做到这一点,因为TNSDL是基于C的,C程序的调度是由kernel控制,Erlang的调度则是beam控制的,同时TNSDL的smp与多线程效率无法与Erlang相比。

    TNSDL基于C语言,当然免不了coredump,Erlang则不会出现coredump(但是会有erlang级别的dump产生),除非erlang程序中包含NIF或driver这种自实现模块。

    TNSDL的消息通信是私有的消息发送机制(基于RDS),类似于Ericsson的TIPC,总的来说与Erlang有几分相似,对节点分布完全透明,每个hand都有一个PID标识,Erlang process也是如此。

    Erlang的OTP包含有分布式数据库mnesia,TNSDL则整合与私有的内存分布式数据库MFS,MFS相比与mnesia相差太远,不作讨论

    Erlang有着强大的otp支持,otp对erlang的最用可相比与JDK对java的作用,而TNSDL则没有相对完善丰富库的支持。

    TNSDL中带有built-in的FSM:State(S) x Event(E) -> Actions(A), State(S'),

Erlang中则无built-in的状态机特性,但OTP中gen_fsm却把FSM表现的非常好。

 

    从可靠性的角度而言,Erlang有built-in的可靠性支持,TNSDL也有类似的机制,相差不大。

 

    个人认为TNSDL比Erlang的性能好得多,毕竟TNSDL可看做是native language,也没有gc,但开发效率则完全比不上Erlang,Erlang编程的otp,动态类型,模式匹配,escript,process无共享等特性使编程人员更加快速的专注于业务逻辑,而不是语言本身,当然Erlang也有一定的学习成本,精通Erlang的人则是少之又少,中国的学院式软件教育过多的关注面向对象,使得大部分学生不知道什么是函数式编程语言。

 

    附上Erlang编程圣经: programming_erlang.pdf 

 

你可能感兴趣的:(erlang)