You are on page 1of 3

提起 Erlang 语言,相信许多人都会挠头,因为它实在是太陌生了。在 2007 年 6 月由 TIOBE Programming

Community 提供的程序语 言排名中,Erlang 占有率仅为 0.08%,排名第 49 位。与之形成鲜明对比的是,


Java 以 20.025%的占有率高居榜首,紧随其后的是 C(15.967%)、C++(11.118%)、VB
(9.332%)、PHP(8.871%)、Perl(6.177%)、C#(3.483%)、Python(3.161%)、JavaScript
(2.616%)和 Ruby(2.132%)。相对于传统老牌“大佬”语言相比,Erlang 语言绝对算得上是一种“小
众”语言,但其未来的发展前景却是无法估量的,因为它可以解决传统语言很难解决在并行计算中的难题,
甚至有专家预言可能成为下一个 Java,在正在迅猛发展的并行计算时代,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 运行环境是一个虚拟机,有点类似于 Java 虚拟
机,代码一经编译,同样可以随处运行。它的运行时系统甚至允许代码在不被中断的情况下更新。另外如果
需要更高效的话,字节代码也可以编译成本地代码运行。

Erlang 的结构图

  相较于其它语言,Erlang 有很多天生的适应现代网络服务需求的特性:
◆并发性,Erlang 具有超强的轻量级进程,这种进程对内存的需求是动态变化的,并且它没有共享内存和
通过异步消息传送的通讯。Erlang 支持超大量级的并发线程,并且不需要操作系 统具有并发机制。

◆分布式,Erlang 被设计用于运行在分布式环境下。一个 Erlang 虚拟机被成为 Erlang 节点。一个分布式


Erlang 系统是多个 Erlang 节点组成的网络(通常每个处理器被作为一个节点)。一个 Erlang 节点能够创
建运行在其它节点上的并行线程,而其它节点可以使用其余的操作系统。线程依赖不同节点之间的通讯,
这完全和它依赖于单一节点一样。

◆ 软实时性 Erlang 支持可编程的“软”实时系统,这种系统需要反应时间在毫秒级。而在这种系统中,


长时间的垃圾收集(garbage collection)延迟是无法接受的,因此 Erlang 使用了递增式垃圾收集技术。

◆ 热代码升级 一些系统不能由于软件 维护而停止运行。Erlang 允许程序代码在运行系统中被修改。旧代码


能被逐步淘汰而后被新代码替换。在此过渡期间,新旧代码是共存的。这也使得安装 Bug 补丁、在运行系统
上升级而不干扰系统操作成为了可能。

◆ 递增式代码装载 用户能够控制代码如何被装载的细节。在嵌入式系统中,所有代码通常是在启动时就
被完全装载。而在开发系统中,代码是按需装载的,甚至在系统运行时被装载。如果测试到了未覆盖的
Bug,只需替换具有 Bug 的代码即可。

  Erlang 应用 场合

  未来的计算是并发计算。现今甚至桌面 CPU 也是多核的,当用户给服务器购买了越来越多的 CPU 时,


他们更期望能最大限度地利用他们的新投资,但是今天的许多软件系统并不能很好地做到这一点。

  整个软件行业也在发生重大变革,由卖工具软件转向卖服务(软件免费,这也是开源 软件 兴起的过
程),由单纯客户端向 B/S 或 C/S 转化,相应的存储和计算向服务器端转移,由原来的 PC 客户端向客户
端多元化(如手机 、PDA、电视机顶盒等)转化。这些变革趋势,使得用户可以更方便地访问到服务的同时,
服务器也要承受越来越高的负荷,并行/分布的需求逐渐增加。

  Erlang 语言不是用来解决所有问题的语言,至少现在还不是。Erlang 最初专门为通信应用设计的,比


如控制交换机或者变换协议等,非常适合于构建分布式,实时软并行计算系统。它是一门专注的语言,可
以适应现代服务器要求高负荷、高可靠、持续服务的需求。它要解决的问题域包括:高并发、分布式、持续服务、
热升级和高可靠等问题。

  Erlang 应用 实例

  典型的 Erlang 应用是由很多被分配不同任务的“节点(Node)”组成的“集群 (Cluster)”。一个 Erlang


节点就是一个 Erlang 虚拟机的实例,用户可以在一台机器(服务器、台式机或者笔记本)上运行多个节点。
Erlang 节点自动跟踪所有连接着的其他节点。要添加一个节点仅仅需要将其指向任何一个已建节点就可以
了。只要这两个节点建立了连接,所有其他节点马上就会感应到新加入的节点。Erlang 进程使用进程 ID 向
其他进程传递报文,进程 ID 包含着运行此进程的节点信息。因此进程不需要理会正在与其交流的其他进程
实际在何处运行。一组相互连接的 Erlang 节点可以看作是一个网格计算体或者一台超级计算机。
erlang 的 odbc 应用程序结构图

  Yaws 是一个 Erlang 写的 Web 服务器。ErLang 本身带有一个 HTTP Server,叫做 inet。Yaws 对于


inet,就相当于 Servlet 对于 Http Server。Yaws 也可说是一个 Web 开发框架,Yaws 的 ehtml 类似于 jsp、
php、ruby template。Yaws 并发能力是 Apache 的 15 倍,有人利用 16 台集群服务器所做的显示,Yaws 可
以承受超八万并发活动,Apache 在四千就宕机了。

erlang 和 ruby 的简单测试

  Ejabberd 也是 Erlang 很好的应用实例,也是目前可扩展性最好的一种 Jabber/XMPP 服务器,支持


分布多个服务器,并且具有容错处理,单台服务器失效不影响整个集群运作。 Ejabberd 基于 ErLang+
Mnesia 构 建 , 项 目 已 成 功 发 展 5 年 , 占 据 30% 左 右 Jabber 服 务 器 市 场 。

  Tsung 则是多协议分布式压力测试工具,可用于测试 Http、Soap、Postgresql 和 Jabber/XMPP 服务器。


而 Wings 则是一个 3D 建模程序,软件支持 Windows、Mac OSX 和 Linux 等操作系统,这两个项目都基
于 Erlang 构建。

You might also like