标题：Erlang
简介
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 Smalltalk机器。但机器要两个月时间才到，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用于呼叫量随机状态，同时有排队的情况，它假设所有来电者将无限期地进入队列等待被接通。因此，呼叫量不可能比可用的中继线路数量还大，如果那样的话，将造成排队无限期地延迟。爱尔兰爱尔兰分布是另一个常用的车头时距分布，分布的密度函数为：
（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）估计。