论文部分内容阅读
【摘 要】Erlang语言是一种函数式语言,使用面向并发的编程方法。Erlang与分布式系统天性互相吻合,决定了使用Erlang开发分布式系统具有得天独厚的优势。本文主要介绍了Erlang语言的来源和特性,以及如何使用Erlang进行分布式编程,并分析了Erlang语言的应用前景。
【关键词】Erlang 分布式 并发 编程
一、引言
在计算机多核化发展日新月异、“云计算”“云存储”异常火爆的今天,一些主流语言面向对象的程序设计语言(C++、JAVA、C#等)对并发和分布式程序的支持不是那么得心应手。越来越多的锁、信号量、线程、同步、互斥之类的概念让程序日益复杂,出错概率大增。
为了适应并行计算和分布式应用的大趋势,Java 5.0引入了concurrency库,C++有了标准化的OpenMP和MPI,微软发布了Parrallel FX和MPI.NET等一系列产品。然而,这些亡羊补牢的手段却不能弥补它们的“先天不足”——即这些语言在创作时就没有把并行化的问题放到优先的位置上去考虑。而天生面向并发的Erlang语言很好地解决了这个问题。
二、Erlang语言简介
Erlang是一种“函数式语言(Functional programming,FP)”,使用的是面向并发编程(COP,Concurrency Oriented Programmi ng)的方法。
1987年,Erlang语言创始人Joe Armstrong在在爱立信做电话网络方面的开发工作时,出于对高性能和并发的需求,在Prolog的基础上增加了并发处理和错误恢复,从而诞生了Erlang语言。
Erlang语言非常有特色,并发、分布、容错贯穿于程序的始终,具有许多与其它语言不同的特性:
(一)跨平台性
Erlang运行时环境是一个虚拟机,类似Java虚拟机,这样的代码一经编译,同样可以随处运行。当然,如果你需要更高效的话,字节代码也可以编译成本地代码运行。
(二)并发性
Erlang可以非常快地创建和销毁进程,一个Erlang程序可以由多达几百万个超轻量级的进程组成,这些进程可以运行于单处理器、多核处理器或者处理器网络上。Erlang进程之间高度隔离,没有共享任何数据,只能通过消息传递来进行交互,并且这种消息传递也是非常迅捷的。
消除了共享内存以及进程之间通过消息进行通信是Erlang最明显的优势之一,这一特点为进行并行与分布式应用的开发提供了非常好的基础。
(三)分布式
Erlang被设计用于运行在分布式环境下。一个Erlang虚拟机作为一个Erlang节点。一个分布式Erlang系统是由多个Erlang节点组成的网络。使用Erlang来编写分布式应用要简单的多,因为它的分布式机制是透明的:对于程序来说并不知道自己是在分布式运行。
(四)健壮性
Erlang可以说是一门为健壮而生动语言。它不像其它语言一样假设不会发生错误,而是假定错误随时可能发生,并随时准备修正错误。
在一个分布式系统中,如果一个进程出错,让这个进程自己修复错误有时并不可行,有时节点可能彻底崩溃(死机),因此将错误交给其他进程去处理是更恰当的选择。
Erlang错误侦测的工作机制正是如此,通过进程间的相互“链接”来实现进程监控(这些进程可以运行于不同节点之上)机制,将错误进行分层处理,从而实现构造“容错系统”。Erlang引入了“速错(Fail fast)”的理念,在一个进程出错时不会试图自行处理,而是直接退出,并发出错误消息让其他进程进行错误处理、故障恢复等工作。
(五)软实时性
Erlang支持可编程的“软”实时系统,这种系统需要反应时间在毫秒级。而在这种系统中,长时间的垃圾收集(garbage collection)延迟是无法接受的,因此Erlang使用了递增式垃圾收集技术。
(六)热部署(Hot swap)
有些系统是不能够由于软件维护而停止运行的。Erlang允许程序代码在系统运行中被修改。旧第代码能被逐步淘汰而后被新代码替换。在此过渡期间,新旧代码是共存的。这也使得安装bug补丁、系统升级而不干扰系统运行成为了可能。
(七)递增式代码装载
用户能够控制代码如何被装载的细节。在嵌入式系统中,所有代码通常是在启动时就被完全装载。而在开发系统中,代码是按需装载的,甚至在系统运行时被装载的。如果测试到了未覆盖的bug,那么只有具有bug的代码需要被替换。
(八)外部接口
Erlang进程与外部世界之间的通讯机制与Erlang进程之间相同的消息传送机制相同。这种机制被用于和操作系统通讯、与其它语言编写的程序交互。如果出于高效率的需要,这种机制的一个特殊版本也允许例如C程序这样的代码直接链接到Erlang运行时系统中来。
三、Erlang语言的分布式编程
(一)分布式系统的特性
George Coulouris认为:分布式系统是由位于网络中的一些计算机组成的系统,这些网络中的计算机之间只能通过传递消息来进行沟通和协调。Andrew S.Tanenbaum说:一个分布式系统是一些独立计算机的集合,但是对这个系统的用户来说,系统就像一台计算机一样。
尽管分布式系统还没有一个公认令人满意的定义,但是所有分布式系统都有以下两个特点:一、系统的各个节点(计算机)是相互独立的;二、各个节点之间只能通过消息传递来进行沟通和协调。可以看到,分布式系统的这两个特点也正是Erlang程序的特点:各进程相互独立,且只能通过消息传递来进行交互。 Erlang与分布式系统天性互相吻合,决定了使用Erlang开发分布式系统具有得天独厚的优势。Erlang天生面向并发,在Erlang开发的分布式系统增加和删除节点非常简便,具有良好的伸缩性。
(二)Erlang语言分布式编程的两种基本模型
1. 分布式Erlang
这种模型用于在一个紧密耦合的计算机集群上编写程序,几乎不需要额外操作,一切就像在单节点编程时一样:可以在任何一个节点创建进程,所有的消息传递和错误处理原语都可以照搬。分布式Erlang运行于一个可信任的环境中——因为任何节点都可以运行其他节点上的操作,这就需要一个高度信任的网络环境。
2. 基于套接字的分布式应用
使用TCP/IP套接字,可以编写运行在非信任环境中的分布式应用程序。这种编程模型的功能比分布式Erlang要弱一些,但是却更加可靠。
四、Erlang语言应用前景
Erlang已经有二十多年历史,利用它也成功地实现了一批项目,例如:Facebook用它重写了超大型聊天系统;Amazon用它开发了SimpleDB云存储系统;Yahoo!用它开发了Deliciou2.0……但是,Erlang迄今为止还是一门小众语言。
Erlang至今未能广泛应用既有传统程序员固有的面向对象编程思维难以适应COP编程模式的原因,也有Erlang语言本身语法“怪异”,难以学习和理解等方面的原因。
除了Erlang,还有其它一些面向并发的编程语言,例如Scala、Go、F#等。这些语言各有特点,很难分出高下。尽管不能断定Erlang是不是在并行领域是最优的语言,但至少目前来说Erlang是比较好的选择。Erlang凭借20多年的发展经验,在支持高并发、浓缩性和数据的持续性存储都有相当多的成熟库(OTP)和开源软件,使得它有极高的实用价值。此外,Erlang还有非常活跃和成熟的社区为开发者解疑释惑。
目前,随着对高并发、分布部署、持续服务的需求日益增加,以及多核CPU的全面普及,Erlang必将得到越来越多广泛的应用。
参考文献:
[1]Armstrong Joe. Programming erlang [M]. Pragmatic Bookshelf, 2007.
[2]Armstrong Joe. A history of erlang [C]. Proceedings of the third ACM SIGPLAN conference on History of programming languages. ACM, 2007:6-1.
[3]Vinoski Steve. Concurrency and message passing in erlang [J]. 2012.
[4]Armstrong Joe, Virding Robert, Wikstr Claes, Williams Mike. Concurrent programming in erlang [J]. 1996.
[5]J?rleberg Anders, Nilsson Kim. Go, f# and erlang [J]. 2012.
[6]陈寅秋. Erlang——一种支持大规模并发处理的高可靠性编程语言 [J]. 电脑与电信, 2009, 11: 030.
【关键词】Erlang 分布式 并发 编程
一、引言
在计算机多核化发展日新月异、“云计算”“云存储”异常火爆的今天,一些主流语言面向对象的程序设计语言(C++、JAVA、C#等)对并发和分布式程序的支持不是那么得心应手。越来越多的锁、信号量、线程、同步、互斥之类的概念让程序日益复杂,出错概率大增。
为了适应并行计算和分布式应用的大趋势,Java 5.0引入了concurrency库,C++有了标准化的OpenMP和MPI,微软发布了Parrallel FX和MPI.NET等一系列产品。然而,这些亡羊补牢的手段却不能弥补它们的“先天不足”——即这些语言在创作时就没有把并行化的问题放到优先的位置上去考虑。而天生面向并发的Erlang语言很好地解决了这个问题。
二、Erlang语言简介
Erlang是一种“函数式语言(Functional programming,FP)”,使用的是面向并发编程(COP,Concurrency Oriented Programmi ng)的方法。
1987年,Erlang语言创始人Joe Armstrong在在爱立信做电话网络方面的开发工作时,出于对高性能和并发的需求,在Prolog的基础上增加了并发处理和错误恢复,从而诞生了Erlang语言。
Erlang语言非常有特色,并发、分布、容错贯穿于程序的始终,具有许多与其它语言不同的特性:
(一)跨平台性
Erlang运行时环境是一个虚拟机,类似Java虚拟机,这样的代码一经编译,同样可以随处运行。当然,如果你需要更高效的话,字节代码也可以编译成本地代码运行。
(二)并发性
Erlang可以非常快地创建和销毁进程,一个Erlang程序可以由多达几百万个超轻量级的进程组成,这些进程可以运行于单处理器、多核处理器或者处理器网络上。Erlang进程之间高度隔离,没有共享任何数据,只能通过消息传递来进行交互,并且这种消息传递也是非常迅捷的。
消除了共享内存以及进程之间通过消息进行通信是Erlang最明显的优势之一,这一特点为进行并行与分布式应用的开发提供了非常好的基础。
(三)分布式
Erlang被设计用于运行在分布式环境下。一个Erlang虚拟机作为一个Erlang节点。一个分布式Erlang系统是由多个Erlang节点组成的网络。使用Erlang来编写分布式应用要简单的多,因为它的分布式机制是透明的:对于程序来说并不知道自己是在分布式运行。
(四)健壮性
Erlang可以说是一门为健壮而生动语言。它不像其它语言一样假设不会发生错误,而是假定错误随时可能发生,并随时准备修正错误。
在一个分布式系统中,如果一个进程出错,让这个进程自己修复错误有时并不可行,有时节点可能彻底崩溃(死机),因此将错误交给其他进程去处理是更恰当的选择。
Erlang错误侦测的工作机制正是如此,通过进程间的相互“链接”来实现进程监控(这些进程可以运行于不同节点之上)机制,将错误进行分层处理,从而实现构造“容错系统”。Erlang引入了“速错(Fail fast)”的理念,在一个进程出错时不会试图自行处理,而是直接退出,并发出错误消息让其他进程进行错误处理、故障恢复等工作。
(五)软实时性
Erlang支持可编程的“软”实时系统,这种系统需要反应时间在毫秒级。而在这种系统中,长时间的垃圾收集(garbage collection)延迟是无法接受的,因此Erlang使用了递增式垃圾收集技术。
(六)热部署(Hot swap)
有些系统是不能够由于软件维护而停止运行的。Erlang允许程序代码在系统运行中被修改。旧第代码能被逐步淘汰而后被新代码替换。在此过渡期间,新旧代码是共存的。这也使得安装bug补丁、系统升级而不干扰系统运行成为了可能。
(七)递增式代码装载
用户能够控制代码如何被装载的细节。在嵌入式系统中,所有代码通常是在启动时就被完全装载。而在开发系统中,代码是按需装载的,甚至在系统运行时被装载的。如果测试到了未覆盖的bug,那么只有具有bug的代码需要被替换。
(八)外部接口
Erlang进程与外部世界之间的通讯机制与Erlang进程之间相同的消息传送机制相同。这种机制被用于和操作系统通讯、与其它语言编写的程序交互。如果出于高效率的需要,这种机制的一个特殊版本也允许例如C程序这样的代码直接链接到Erlang运行时系统中来。
三、Erlang语言的分布式编程
(一)分布式系统的特性
George Coulouris认为:分布式系统是由位于网络中的一些计算机组成的系统,这些网络中的计算机之间只能通过传递消息来进行沟通和协调。Andrew S.Tanenbaum说:一个分布式系统是一些独立计算机的集合,但是对这个系统的用户来说,系统就像一台计算机一样。
尽管分布式系统还没有一个公认令人满意的定义,但是所有分布式系统都有以下两个特点:一、系统的各个节点(计算机)是相互独立的;二、各个节点之间只能通过消息传递来进行沟通和协调。可以看到,分布式系统的这两个特点也正是Erlang程序的特点:各进程相互独立,且只能通过消息传递来进行交互。 Erlang与分布式系统天性互相吻合,决定了使用Erlang开发分布式系统具有得天独厚的优势。Erlang天生面向并发,在Erlang开发的分布式系统增加和删除节点非常简便,具有良好的伸缩性。
(二)Erlang语言分布式编程的两种基本模型
1. 分布式Erlang
这种模型用于在一个紧密耦合的计算机集群上编写程序,几乎不需要额外操作,一切就像在单节点编程时一样:可以在任何一个节点创建进程,所有的消息传递和错误处理原语都可以照搬。分布式Erlang运行于一个可信任的环境中——因为任何节点都可以运行其他节点上的操作,这就需要一个高度信任的网络环境。
2. 基于套接字的分布式应用
使用TCP/IP套接字,可以编写运行在非信任环境中的分布式应用程序。这种编程模型的功能比分布式Erlang要弱一些,但是却更加可靠。
四、Erlang语言应用前景
Erlang已经有二十多年历史,利用它也成功地实现了一批项目,例如:Facebook用它重写了超大型聊天系统;Amazon用它开发了SimpleDB云存储系统;Yahoo!用它开发了Deliciou2.0……但是,Erlang迄今为止还是一门小众语言。
Erlang至今未能广泛应用既有传统程序员固有的面向对象编程思维难以适应COP编程模式的原因,也有Erlang语言本身语法“怪异”,难以学习和理解等方面的原因。
除了Erlang,还有其它一些面向并发的编程语言,例如Scala、Go、F#等。这些语言各有特点,很难分出高下。尽管不能断定Erlang是不是在并行领域是最优的语言,但至少目前来说Erlang是比较好的选择。Erlang凭借20多年的发展经验,在支持高并发、浓缩性和数据的持续性存储都有相当多的成熟库(OTP)和开源软件,使得它有极高的实用价值。此外,Erlang还有非常活跃和成熟的社区为开发者解疑释惑。
目前,随着对高并发、分布部署、持续服务的需求日益增加,以及多核CPU的全面普及,Erlang必将得到越来越多广泛的应用。
参考文献:
[1]Armstrong Joe. Programming erlang [M]. Pragmatic Bookshelf, 2007.
[2]Armstrong Joe. A history of erlang [C]. Proceedings of the third ACM SIGPLAN conference on History of programming languages. ACM, 2007:6-1.
[3]Vinoski Steve. Concurrency and message passing in erlang [J]. 2012.
[4]Armstrong Joe, Virding Robert, Wikstr Claes, Williams Mike. Concurrent programming in erlang [J]. 1996.
[5]J?rleberg Anders, Nilsson Kim. Go, f# and erlang [J]. 2012.
[6]陈寅秋. Erlang——一种支持大规模并发处理的高可靠性编程语言 [J]. 电脑与电信, 2009, 11: 030.