Erlang
瑞典爱立信公司推出的编程语言
Erlang在1991年由爱立信公司向用户推出了第一个版本,经过不断地改进完善和发展,在1996年爱立信又为所有的Erlang用户提供了一个非常实用且稳定的OTP软件库并在1998年发布了第一个开源版本。Erlang同时支持的操作系统有Linux,windows,unix等,可以说适用于主流的操作系统上,尤其是它支持多核的特性非常适合多核CPU,而分布式特性也可以很好融合各种分布式集群。
简要介绍
Erlang是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种可以应对大规模并发活动的编程语言和运行环境。Erlang问世于1987年,经过十年的发展,于1998年发布开源版本。Erlang是运行于虚拟机的解释性语言,但是也包含有乌普萨拉大学高性能Erlang计划(HiPE)开发的本地代码编译器,自R11B-4版本开始,Erlang也开始支持脚本式解释器。在编程范型上,Erlang属于多种范型编程语言,涵盖函数式、并发式及分布式。顺序执行的Erlang是一个及早求值,单次赋值和动态类型的函数式编程语言。
Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此非常适合于构建分布式,实时软并行计算系统。
使用Erlang来编写分布式应用要简单得多,因为它的分布式机制是透明的:对于程序来说并不知道自己是在分布式运行。Erlang运行时环境是一个虚拟机,有点像Java虚拟机,这样代码一经编译,同样可以随处运行。它的运行时系统甚至允许代码在不被中断的情况下更新。另外如果需要更高效的话,字节代码也可以编译成本地代码运行。
历史
Erlang得名于丹麦数学家及统计学家AgnerKrarupErlang,同时Erlang还可以表示EricssonLanguage。
Erlang并非一门新语言,它出现于1987年,只是当时对并发、分布式需求还没有这么普遍,当时可谓英雄无用武之地。Erlang语言创始人JoeArmstrong当年在爱立信做电话网络方面的开发,他使用smalltalk,可惜那个时候Smalltalk太慢,不能满足电话网络的高性能要求。但Joe实在喜欢Smalltalk,于是定购了一台TektronixSmalltalk机器。但机器要两个月时间才到,Joe在等待中百无聊赖,就开始使用Prolog,结果等Tektronix到来的时候,他已经对Prolog更感兴趣,Joe当然不满足于精通Prolog,经过一段时间的试验,Joe给Prolog加上了并发处理和错误恢复,于是Erlang就诞生了。这也是为什么Erlang的语法和Prolog有不少相似之处,比如它们的List表达都是[Head|Tail]。
1987年Erlang测试版推出,并在用户实际应用中不断完善,于1991年向用户推出第一个版本,带有了编译器和图形接口等更多功能。1992年,Erlang迎来更多用户,如RACE项目等。同期Erlang被移植到VxWorks、PC和麦金塔等多种平台,两个使用Erlang的产品项目也开始启动。1993爱立信内部独立的组织开始维护和支持Erlang实现和Erlang工具。
特点
区别于传统的面向对象语言,它有着自己的优点:首先它是基于进程并发的,这些进程是轻量级的并且互相协作有条理的处理着事务,用户不用担心具体的PV操作,这些进程对于操作系统而言是透明的,对操作系统来说只有一个进程在运行。其次,每个进程拥有自己的独立内存,在进程间通信中完全依赖于消息传递,每个进程都拥有自己独立的邮箱并通过模式匹配的方式来查找要处理的消息,然后分别进行异步处理。这减轻了进程之间的耦合度,提高了独立性。Erlang还具有可靠的容错机制,由于进程之间相对独立,于是Erlang里可以用一些进程去链接或监视另外一些进程,当这些被监视的进程因为错误而产生异常退出的时候,负责监视的程序就会收到这些进程退出的消息并对这些进程进行相应的处理。在OTP中Erlang可以利用监控树执行一对一或者一对多的监控。最重要的是,对多核CPU的支持,在Erlang中对于多核的操作不需要开发人员来管理,对开发人员来说是完全透明的,我们只需要和往常一样编写程序就可以。最后Erlang是支持热代码升级的,在Erlang中可以实现不停机就进行代码的升级,来实现软件运行中的热升级。Erlang的版本管理中,可以保留一个模块的2种不同的版本,支持对版本的回滚。
Erlang语言专注于某方面的需求,并不是完全适合所有情况,在它有很多诱人的特性的同时也有一些缺点:它的语言的抽象能力不强,Erlang是一种弱类型语言,在匹配的时候可以较为方便的调整消息的内容或者模式的要求,但发生错误的时候,这些错误的隐蔽性较强。另外,当项目规模比较大的时候会发现由于语言的特性各部分出现扁平化的特征,程序中有非常多的元组和记录程序结构混乱。其次,函数式编程与传统语言有差别,目前主流的编程语言都是c语言系和面向对象,目前函数式编程缺乏成熟的编程理论,相关方面的人才和资料也较少这增加了学习的难度,另外面向对象的思想已经深入人心,这使得在学习函数式编程的时候思维难以转变。最重要的是,Erlang是属于IO密集型的语言,适合分布式特征明显的项目,对于计算密集型的要求,会比较吃力,但是仍然有优化提升的空间。
分布式
代码示例如下:
% create process and call the 函数 web:start_server(Port,MaxConnections)
ServerProcess=spawn(web,start_server,[Port,MaxConnections]),
% create a remote process and call the function web:start_server(Port,MaxConnections) on machine
RemoteNodeRemoteProcess=spawn(RemoteNode,web,start_server,[Port,MaxConnections]),
% send the{pause,10}message(a tuple with an atom"pause"and a number"10")to ServerProcess(asynchronously)
ServerProcess!{pause,10},
% receive messages sent to this process
receive
a_message-\u003edo_something;
{数据,DataContent}-\u003ehandle(DataContent);
{hello,Text}-\u003eio:format("Got hello message:~s",[Text]);
{goodbye,Text}-\u003eio:format("Got goodbye message:~s",[Text])
end.
函数式
Erlang函数大致写法如下,以一个求整数阶乘的模块为例:
-module(FACT).
-export([fac/1]).
fac(1)-\u003e1;
fac(N)whenN\u003e1-\u003eN*fac(N-1).
注:该文件要保存成"fact.erl",文件名必须和模块名一致才能编译通过。
下面是快速排序算法的一个Erlang实现:
%% quicksort:qsort(List)
%% Sort a list of items
-module(quicksort).
-export([qsort/1]).
qsort([])-\u003e[];
qsort([Pivot|Rest])-\u003e
qsort([X||X\u003c-Rest,X=\u003cPivot])++[Pivot]++qsort([Y||Y\u003c-Rest,Y\u003ePivot]).
注:该文件要保存成“quicksort.erl”文件名必须和模块名一致才能编译通过。
开发工具
文本编辑器
Linux下有全套的IDE环境插件可用完善的如SublimErl,windows下只能自己简单的集成一部分基础功能。对比于eclispse的erlide的优势是大项目时操作响应速度快,体验流畅错误少。
Emacs
可以使用任何你喜欢的编辑器编写Erlang程序,但如果你使用Emacs编辑可以支持很多功能,比如:代码缩进、语法高亮、验证模块名称、支持段落的注释、模块骨架、标签和更多的支持。
有关详细信息请参阅Erlang Tools
文档。
Erlide
这是一个基于Eclipse的Erlang图形界面插件(ErlIDE),ErlIDE正在积极开发新特性,同时它也是开源的。
流量单位
指测量电话呼叫流量的单位。一个厄朗等于一个小时的中继负荷,或3600秒中继负荷。如果将CCS(百秒呼叫)转换成厄朗值,则需先乘以100,然后再除以3600(或直接除以36)。因此,呼叫中心可使用厄朗值来反映中继线路负荷,即一个小时满负荷的平均中继线路有多少数量。例如,在一个小时中,呼叫中心呼叫流量为12.35厄朗时,就意味着在该时段中,平均有12条线多一些都处于全负荷状态。据此可以大致推算出需要多少座席人员。
指一种数学计算方法,这种方法是基于已知的信息,如平均通话时长,来预测无规则的工作负荷,如电话呼叫量。它是呼叫中心人员和中继线路数量的决策参考方法。
厄朗公式有两类,厄朗B用于呼叫量随机状态,同时没有排队的情况;厄朗C用于呼叫量随机状态,同时有排队的情况,它假设所有来电者将无限期地进入队列等待被接通。因此,呼叫量不可能比可用的中继线路数量还大,如果那样的话,将造成排队无限期地延迟。
爱尔兰分布是另一个常用的车头时距分布,分布的密度函数为:
(15)
式中:k和为参数对于对于给定参数k,(15)式对应着一种分布,而随着k取不同的值,可以得到不同的分布函数。因此,爱尔兰分布适用范围较广。特别地,当k=1时,(15)对应着车头时距为负指数分布的情形,当k=时,(15)对应着车头时距为均匀分布的情形。研究表明,随着k值的增大,说明交通越拥挤,驾驶员行为的随机性越小。
对于单条车道上行驶的车辆,车头时距不能小于最小车头时距,因此,需要对模型(15)修改,引入带移位的爱尔兰分布,分布密度为:
(16)
对于(15)式,有:
(17)
(18)
式中,-样本均值;S-样本方差。因此,由(17),(18)两式可得到参数k和的估计:
(19)
(20)
对于式(16)而言,参数k和仍可分别由(19)和(20)估计,对于参数i由(10)估计。
功能
使用Erlang编写出的应用运行时通常由成千上万个轻量级进程组成,并通过消息传递相互通讯。进程间上下文切换对于Erlang来说仅仅只是一两个环节,比起C程序的线程切换要高效得多得多了。
使用Erlang来编写分布式应用要简单的多,因为它的分布式机制是透明的:对于程序来说并不知道自己是在分布式运行。
Erlang运行时环境是一个虚拟机,有点像Java虚拟机,这样代码一经编译,同样可以随处运行。它的运行时系统甚至允许代码在不被中断的情况下更新。另外如果你需要更高效的话,字节代码也可以编译成本地代码运行。
发展前景
Erlang近些年在国内的发展十分迅速,主要用于游戏服务器系统开发。Erlang上手容易,容错率高,快速迭代等优点非常适用于页游和手游的开发。尤其以广州市,深圳等一些中,小型的游戏公司几乎都是用Erlang。以C++为基础语言的游戏服务器系统需要长时间的技术积累,并且c++的开发效率不如Erlang,高额的招人成本对新兴公司也是巨大的挑战。但中小型公司注重产品大于技术,这对Erlang在于国内的发展是不利的,大部分公司都用着同一套已经成型的Erlang框架,着重于处理具体的业务逻辑忽视了底层优化。这对于Erlang的发展是极其不利的。
Erlang在国外发展的时间较长作为一种成熟的语言已经得到了证实,目前应用于包括爱立信的宽带,GPRS和ATM交换解决方案系统等几百个重大的开发项目,有着丰富的项目经验,编程框架(OTP)为Erlang系统的提供了一套实现健壮性和容错性的工具和类库和完整的结构化框架。但相较于国内用于游戏开发,国外主要用于web服务,计算机电话,消息系统和商业银行等领域。在本世纪初Erlang.org网站总共有36000个网页左右,十年之后,这一数字上升到了280万,这说明Erlang社区地地的在扩大,包括商业,研究与开源项目,病毒营销,书籍和博客的组合,当然这些都源自于Erlang最初的设计用于解决特定领域难题的需求和推动。
参考资料

Warning: Invalid argument supplied for foreach() in /www/wwwroot/newbaike1.com/id.php on line 362
目录
概述
简要介绍
历史
特点
分布式
函数式
开发工具
文本编辑器
Emacs
Erlide
流量单位
功能
发展前景
参考资料