一、高可靠性的Erlang,有望取代Java
Erlang将成为一个非常重要的语言。它也许就是下一代的Java语言。目前Erlang发展的主要问题就在于没有一个大的公司来支持它,作为它强大的后盾。结果,Erlang被推动成为一个开源的项目。Erlang语言最大优势就是它非常适合多核,web服务的特点。事实上,Erlang是唯一成熟的,非常稳定可靠,适合开发运行在多核机器上的高伸缩性的系统。
Erlang最为并行的Prolog,始于20年前。Joe Armstrong发明了它,并成为推动它发展的主要人物。Joe Armstrong在Erickson公司工作,Erickson是一家瑞典的科技公司。最大的第一个Erlang项目是开发一个电子开关系统,此系统有几百人开发,他们写了几百万行的代码。这个系统的要求重点就是可靠性,不专门是速度,最终,这个项目具备了令人难以置信的优良可靠性。Joe声称他们取得了“9个9的可靠性”。
“9个9的可靠性”意识是什么了?意思就是说在一百万秒钟,只有一秒出现故障时间,或者说在一百万分钟,只出现一分钟的故障时间。然而,一百万秒大约就是30年。一百万分钟大约是2000年。这个系统生产出来已经有上10年了,但是我认为少于15年。该公司已经卖出来上百个该系统,或许有上千个。200个系统运行10年的话,加起来就有2000年来了,如果所有的系统加起来总的故障时间少于1分钟的话,那么他们就可以说该系统达到了“9个9的可靠性”。
“5个9的可靠性”是指一年中只有5分钟的故障时间,能达到这个水平就已经很不错了。人们非常热衷追求6个9,或者7个9。要说达到9个9是简直前所未有的。但是,Erlang开发的系统达到了这个空前的水平。
优良的可靠性还不能说明问题,并不能使得Erlang伟大。并不是有足够的人关注稳定性。“顺序的Erlang”作为一个函数型的编程语言也不是使得Erlang伟大的原因。“并行的Erlang'”作为一种面向对象的语言也不是Erlang指的推崇的原因。值得我们称道的是Erlang'是唯一一个成熟的语言,带有可靠的实现工具,和一组非常好的库,能让你的软件无缝的伸缩,从单个处理器系统到使用多个处理器系统使得你的应用程序运行的更快。
二、丰富的多处理器的支持,使Erlang如虎添翼
当使用Erlang构建一个系统的时候,你只能在进程间通过传递消息,来使得一组进程间通信。在Erlang里面没有共享的状态,唯一的方式就是通过发送消息和进程通信。不像Java 或者 Smalltalk,只是在并发操作的时候,写一些线程/进程,Erlang程序员使用进程来模块化,提高可靠性,重用性。以后它们就能自发的并行运行。理论上说,你可以在一个处理器上构建你的系统,但是实际中没有这样的Erlang程序员这么做。他们更喜欢当作有上千个处理器来开发系统。当在一个处理上运行的时候并不影响性能。但是最好利用多处理器,来提高系统的性能。接着,把应用程序放在10个处理器的系统上,你的应用程序就会运行快了十倍(或许八九倍,但是还是不错的)。
当然,因为你写你的应用程序时候,写了上千个的进程并不能说有伸缩性。像任何一个系统一样,你也有瓶颈的。在等待另外一个进程的时候,你要浪费很多的等待时间,希望得到其它进程提供的结果。为了实现Erlang系统的伸缩性,有许多的设计模式供你选择。
Erlang自带了很多程序库。大多数的程序库是为了构建应用程序,或者使用不同种类的网络服务。Erlang有web服务和数据库的功能。Erlang社区将Erlang定位为构建可靠性web服务和web服务应用程序的语言。但是自带的程序库名字大多称为OTP,即开源电信平台。毫不奇怪名字为什么这么起,虽然它与电信没有任何关系。但是Erlang构建运行几十年,在需要每天更新软件,或者周期更换硬件而不中断的开发框架和平台。这正是电信应用程序所需要的,同时是在线银行,在线商店等等所需要的。
Joe Armstrong已经完成了一本关于Erlang的书,已经由Pragmatic Programmers.出版了。Joe还写了一篇关于这本书的文章。这是一本非常好的书,任何对Erlang有兴趣的人应该去读一读。对于这本书,令我很发疯的是它展现的更多的是Erlang最为函数式的语言,而没有很多的关于面向对象的方面。事实上,它否认Erlang是面向对象的。
三、另类的设计,将会带给Erlang程序员更多的思想圣宴
Erlang里面的进程就是一个对象。最初我在讲述面向对象的设计的课程上,我从三个角度解释面向对象编程。从表面的角度说,一个面向对象的系统就是它的开发者要认识到程序设计是一个模拟。从更深的角度来说,面向对象的系统就是它有对象构成,通过对象之间的发送消息来通信,通过对象间传来传去的消息来完成计算。从软件工程的角度看面向对象的系统就是它支持数据抽象化,通过函数调用后期绑定,和继承完成多态。
Erlang是行为驱动模型的完美例子,也是从更新的角度来看的例子。进程当然支持数据抽象多多态。一个Erlang进程就是一个函数,它从消息队列中读取消息,找到自己相匹配的消息,接着做出响应。这种函数式结构处理方法很像Smalltalk中的类。更有甚者,好几个线程共同遵照一个协议,有一些共同的东西,很容易分析出他们有一些相同的函数可以调用。这就很像类的继承性了。因此,你可以说Erlang支持继承的,虽然它和Java 和Smalltalk有很大的区别。我能想象的出很多的Erlang开发者认为程序设计就是模型化。因此,Erlang适合所有的具有面向对象特征的系统,虽然说顺序的Erlang是函数式的语言,不是一种面向对象的语言。
Erlang唯一和面向对象的语言不同的是它强调失败故障。任何消息的发送可能失败。进程不能引发异常,它们出现失败故障。系统构造出工作进程,在底层有可能出现失败故障,而在它们上面有管理进程,能够重启失败的进程,因为开发者能够预期到失败的进程。
Joe讲述了Erlang太多的函数式语言特性,他认为Erlang缺乏易变的状态,也就是暗示没有加锁。但是,它的确是缺乏SHARED状态。你可以用Basic, perl, 或者C写进程。我能肯定许多的人会学习Erlang,然后说:“我能把Erlang的优秀特点引入到我们的语言中去”。但是依照我的观点,Erlang的并发程序设计的特点,为并行和可靠性而设计的成熟的实现方法和强大的程序库是它的特别之处。
相信任何一个其它的语言能追上Erlang。其它的语言也许会增加一些和Erlang相似的语言特点。但是需要它们花很长的时间取构建如此一个高质量的虚拟机和为并发和可靠性开发的程序库。因此,我认为Erlang将会取得成功,并在10年内成为现在Java语言的替代者。如果你想在将来的构建多核的应用程序,你应该学习Erlang。