您的位置:首页 > 编程语言

面向并发的编程语言Erlang

2012-09-20 10:20 176 查看

Erlang是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种可以应对大规模并发活动的编程语言和运行环境。

简介

  Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此非常适 合于构建分布式,实时软并行计算系统。

  使用Erlang编写出的应用运行时通常由成千上万个轻量级进程组成,并通过消息传递相互通讯。进程间上下文切换对于Erlang来说仅仅 只是一两个环节,比起C程序的线程切换要高效得多得多了。

  使用Erlang来编写分布式应用要简单的多,因为它的分布式机制是透明的:对于程序来说并不知道自己是在分布式运行。

  Erlang运行时环境是一个虚拟机,有点像Java虚拟机,这样代码一经编译,同样可以随处运行。它的运行时系统甚至允许代码在不被中断 的情况下更新。另外如果你需要更高效的话,字节代码也可以编译成本地代码运行。

  Yaws: 一个Erlang写的服务器,据说并发能是apache的15倍。[1]

发展历史

  Erlang得名于丹麦数学家及统计学家Agner Krarup
Erlang,同时Erlang还可以表示Ericsson Language。

  Erlang问世于1987年,经过十年的发展,于1998年发布开源版本[2]。Erlang是运行于虚拟机解释性语言,但是现在也包含有乌普萨拉大学高性能Erlang计划(HiPE)开发的本地代码编译器,自R11B-4版本开始,Erlang也开始支持脚本式解释器。在编程范型上,Erlang属于多重范型编程语言,涵盖函数式、并发式及分布式。顺序执行的Erlang是一个及早求值,
单次赋值和动态类型的函数式编程语言。

  Erlang并非一门新语言,它出现于1987年,只是当时对并发、分布式需求还没有今天这么普遍,当时可谓英雄无用武之地。Erlang语言创始人Joe Armstrong当年在爱立信做电话网络方面的开发,他使用Smalltalk,可惜那个时候Smalltalk太慢,不能满足电话网络的高性能要求。但Joe实在喜欢Smalltalk,于是定购了一台Tektronix
Smalltak机器。但机器要两个月时间才到,Joe在等待中百无聊赖,就开始使用Prolog,结果等Tektronix到来的时候,他已经对Prolog更感兴趣,Joe当然不满足于精通Prolog,经过一段时间的试验,Joe给Prolog加上了并发处理和错误恢复,于是Erlang就诞生了。这也是为什么Erlang的语法和Prolog有不少相似之处,比如它们的List表达都是[Head | Tail]。

  1987年Erlang测试版推出,并在用户实际应用中不断完善,于1991年向用户推出第一个版本,带有了编译器和图形接口等更多功能。1992年,Erlang迎来更多用户,如RACE项目等。同期Erlang被移植到VxWorks、PC和 Macintosh等多种平台,两个使用Erlang的产品项目也开始启动。1993爱立信公司内部独立的组织开始维护和支持Erlang实现和Erlang工具。

  目前,随着网络应用的兴起,对高并发、分布部署、持续服务的需求增多,Erlang的特性刚好满足这些需求,于是Erlang开始得到更多人的关注

语言特点

  Erlang特性:

  ● 并发性 - Erlang支持超大量级的并发进程,并且不需要操作系统具有并发机制。

  ● 分布式 - 一个分布式Erlang系统是多个Erlang节点组成的网络(通常每个处理器被作为一个节点)

  ● 健壮性 - Erlang具有多种基本的错误检测能力,它们能够用于构建容错系统。

  ● 软实时性- Erlang支持可编程的“软”实时系统,使用了递增式垃圾收集技术。

  ● 热代码升级-Erlang允许程序代码在运行系统中被修改。旧代码能被逐步淘汰而后被新代码替换。在此过渡期间,新旧代码是共存的。

  ●递增式代码装载-用户能够控制代码如何被装载的细节。

  ●外部接口-Erlang进程与外部世界之间的通讯使用和在Erlang进程之间相同的消息传送机制。

  ●Fail-fast(中文译为速错),即尽可能快的暴露程序中的错误。

  ●面向并发的编程(COP concurrency-oriented programming)

  ●函数式编程

  ●动态类型

  ●及早求值或严格求值

  ●脚本语言

并发及分布式编程

  代码示例如下:

  % create process and call the function 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 -> do_something;

  {data, DataContent} -> handle(DataContent);

  {hello, Text} -> io:format("Got hello message: ~s", [Text]);

  {goodbye, Text} -> io:format("Got goodbye message: ~s", [Text])

  end.

函数式编程

  Erlang函数大致写法如下,以一个求整数阶乘的模块为例:

  -module(fact).





-export([fac/1]).

  fac(1) -> 1;

  fac(N) when N > 1 -> N * fac(N-1).

  注:该文件要保存成"fact.erl",文件名必须和模块名一致才能编译通过。

  其运行结果如右图:

  下面是快速排序算法的一个Erlang实现:

  %% quicksort:qsort(List)

  %% Sort a list of items

  -module(quicksort).

  -export([qsort/1]).





qsort([]) -> [];

  qsort([Pivot|Rest]) ->

  qsort([ X || X <- Rest, X =< Pivot]) ++ [Pivot] ++ qsort([ Y || Y <- Rest, Y > Pivot]).

  注:该文件要保存成“quicksort.erl”文件名必须和模块名一致才能编译通过。其运行结果如右图。

电信流量的单位

  指测量电话呼叫流量的单位。一个厄朗等于一个小时的中继负荷,或3600秒中继负荷。如果将CCS(百秒呼叫)转换成厄朗值,则需先乘以100,然后再除以3600(或直接除以36)。因此,呼叫中心可使用厄朗值来反映中继线路负荷,即一个小时满负荷的平均中继线路有多少数量。例如,在一个小时中,呼叫中心呼叫流量为12.35厄朗时,就意味着在该时段中,平均有12条线多一些都处于全负荷状态。据此可以大致推算出需要多少座席人员。

  指一种数学计算方法,这种方法是基于已知的信息,如平均通话时长,来预测无规则的工作负荷,如电话呼叫量。它是呼叫中心人员和中继线路数量的决策参考方法。

  厄朗公式有两类,厄朗B用于呼叫量随机状态,同时没有排队的情况;厄朗C用于呼叫量随机状态,同时有排队的情况,它假设所有来电者将无限期地进入队列等待被接通。因此,呼叫量不可能比可用的中继线路数量还大,如果那样的话,将造成排队无限期地延迟。

爱尔兰(Erlang)分布

  爱尔兰分布是另一个常用的车头时距分布,分布的密度函数为:

  (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)估计。

参考资料

1._765701] 编程语言
Erlang .开源社区网[引用日期 2012-08-18].

2._765701]

扩展阅读:

1
http://www.iccso.net/mcsy/E/2009/0223/35559.html

2
http://hi.baidu.com/xml2/blog/item/6dab521d7214801c304e15d5.html

文章来自百度百科:http://baike.baidu.com/view/765701.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: