粗粗看了一下erLang的语言介绍。发现其真正做到了改善的其实只有错误与隔离。通过以进程为单位进行错误隔离及在语言中加入更方便的错误处理元素,它的确提供了比java更好的错误机制。至少,从系统整体上说,它已经建立起这样的概念。比起java作为一门语言还只停留在错误表示却把错误处理丢给程序员不同,erLang果断地揽过了责任。这当然跟它本身就是发源于通信技术环境有关系。。。Anyway, 有比没有好。只是相比于它的错误处理,它的其它特性并不象其推荐者所宣称的那样扔有普遍的适应性或可应用性。
比如首先,其并发特性仍然存在与普通有状态应用中锁机制相同的问题。很多人可能没想到,一个没有共享状态的并发系统也有可能死锁!。。事实上,在一个基于消息的系统中进行大规模并发要求的技巧或理解能力比锁机制多多了。与它相比,JAVA中的同步操作看起来就象小儿科。
隔离绝不是一个小话题。事实上,它是现行编程体系中存在的最大隐患。现行的编程体系大多走的是一条乐观路线,对于错误或者状态管理很难看到任何正式的研究工作或者甚至是非学术化的实现方案。
然后就是,它也一直没有解决一直存在的在所有顺序式编程语言中共同存在的问题,即:优先级问题。因为,在顺序式编程模式下在执行时间上优先的语句比后面所有语句的优先级都要高。比如,如果在一个语句块以内位于第一行的语句执行失败,那么其后的第二行以及所有其它后续程序都将失败!。。。这就是为什么前面只说它“改善”了错误与隔离处理的问题而不是“解决”了问题的原因。因为它没有在语言中提供时间停止机制。在这个时间点上,所有的操作被应该按照相同的优先级被执行,而不是按照由其相对顺序决定的“优先级”被执行。
至于内存事务,则因为它根本没有变量所以不太好因为这个减它的分。但是,内存事务的目的本身其实并不是因为变量而存在的,它本质上是作为一种(共享数据)正确性服务而存在(或应该存在)于语言中的。所以虽然它没有共享,这里仍然还是要减它的分。因为在erLang中,正确性服务只不过换成以另一种形式存在罢了。在erLang中,前文提过的死锁只是正确性服务不够的一种表现。erLang中正确性的表现还包括进程间消息发送顺序的正确性。只要是最终影响系统正确性的因素,都可以视为其正确性服务的缺失。因为在共享数据的状态型系统中,事务所提供的正确性其实是非常高的。状态型系统虽然可能仍然存在诸多的问题,但是无论如何它都已经是一个比较成熟的系统。就算有问题也不太可以有太大的问题。存在的都只不过是一些小问题或者语义学层次的问题。比如同步元素的存在。但从上面的分析可以看出,消息机制显然也不是解决方案。
erLang也许还有另一个亮点那就是它的消息机制是异步的。如果标准放宽松一点的话,完全可以把这种异步也看成是一种语言级的服务。因为它显然已经在某个程度上构在并发部件间的调用模式。而异步显然是比同步更优的调用机制。
至于其它的服务级语义,目前还没有发现。
所以综合起来,使用erLang相对于使用java,程序员能从中得到的新东西包括:
1,天然的即语言级的异步消息服务。这意味着在上面构建流水式作业更加方便。事实上这正是它作为一门语言的立足点---它是天然的异步系统;
2,虽仍不够用,但还是比java稍好的错误处理系统;
3,天然的分布式服务。java里面可以使用hadoop的map/reduce替换它,但已经不是语言级的“天然”服务了。
其它如它所宣称的快速低成本创建大量进程的能力,我不觉得这个功能有用。因为在本地创建大于CPU数量的进程对于系统性能并没有什么实质性提高,因为此其低成本的创建能力或速度也变得没用。而在异地创建大量进程的速度显然不可能快于I/O的速度。Then how is it valuable?
我现在在想的是,把一个针对电信领域设计的语言推广到企业级或互联网应用中去是否一个好主意?电信应用与企业级或互联网应用到底有什么区别?
企业级因为需求特征也许可以先排除在讨论范围以外。但是互联网的确与电信服务有很多相似的东西。甚至在某个程度上讲,互联网对应用的稳定性、可伸缩性与吞吐量有着更高的要求。这使得要否定erLang好象变得很难!因为看起来所有互联网应用的要求正好全是它的设计目标。
其实erLang适合电信行业是因为它正好提供了电信所需要的全部。它所提供的某些特性java可能没有,但是可以通过库实现其中的大部分。这样看的话,java语言的能力集就比erLang要大了。因为java除了erLang提供的这些特性,它还提供了很多别的东西如同步(虽然我不赞成它在语言中的出现,但我赞成它作为一种服务的存在。我不赞成的只是它的服务形式)和面向对象。也就是说,erLang的能力其实只是java能力的一个子集。
“无状态”不但不是什么很光彩的事情,反而是一件很愚蠢的事情。因为它使得面向对象不可能。它逼迫所有人走上愚蠢且老式的“计算”式道路。。。
上面有miss掉任何erLang有但java没有或不能提供的特性吗?有吗?
如果你是电信人,那么就大胆地使用erLang。但如果你不是,使用它就是开玩笑了。
科学家的话总是错的比对的多。不然怎么会需要那么多科学家呢?