`
mryufeng
  • 浏览: 982429 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

程序语言的新星:走近Erlang的世界

阅读更多
开发者在线 Builder.com.cn 更新时间:2008-06-12作者:顾宏军 来源:软件世界
本文关键词: Erlang 并行计算 面向过程语言 程序语言 函数式 面向对象语言

(文章写的相当不错 很好的介绍了erlang的优点)

   提起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构建。

  Erlang将会成为一个非常重要的语言。如果有了大公司的支持,它甚至可能成为下一个Java。因为它是个开源项目,非常适合多核处理、Web服务等领域。事实上,它也是编写在多核机器上运行的高可靠性系统的唯一成熟语言。

  Erlang始于20年前,是一个并发性Prolog,Joe Armstrong创造了它。第一个大型Erlang项目是一个由几百人创建的电信交换系统,系统有数百万行代码。系统主要关注的就是可靠性,并且系统有难以置信的可靠性历史。据Joe介绍,“它有99.9999999%的可靠性”。

  这意味着每10亿秒才有1秒宕机时间,或者说10亿分钟有1分钟宕机时间。十亿秒大概是30年,10亿分钟大概有2000年。99.999%的可靠性大概是每年宕机5分钟,这已经是很好的了。了解可靠性的人都知道,可靠性系统有 99.9999%的,甚至99.99999%的,但是估计没听过有99.9999999%可靠性的,可基于Erlang的系统实现了。

  但这还不是令Erlang壮大的理由,因为不是什么人都关注可靠性。也不是因为 Erlang是一个函数式语言,更不是并行Erlang是个面向对象语言。其发展迅速的主要原因是唯一一个有可靠实现和完善类库的成熟的并行开发语言,在不久的将来所有的桌面系统、笔记本电脑都将是多核的,而要让程序在多核上更快的运行就要使程序能充分利用多核处理的能力。

  Erlang带有一组类库。多数类库是用于构建各类Internet服务的。 Erlang有Web服务器和数据库。Erlang社区认为它是构建可靠Web服务器和Web服务的首选语言。Erlang是一个构建可靠系统的框架/平台,它构建的平台可以持续运行而无需关闭,可以每天更新软件,甚至可以定期的更换硬件。这些特性是电信应用所需要的,它还是在线银行、在线商城等各类在线应用所迫切需要的。

  Joe Armstrong最近写了本书《Programming.Erlang》,所有关注Erlang的人都值得一读。Erlang符合所有面向对象语言特性,虽然它是个函数式语言,而不是面向对象语言。Erlang区分与面向对象语言的一个方面就是它的错误处理。在某消息出错时,进程不是抛出出错的部分,而是直接进程纠错。系统结构被设计为底部是工作进程(它们可能会失败),上层是管理进程,它们可以重新启动失败的进程。

  我不相信其它语言能迅速赶上Erlang。对其它语言而言,加入像Erlang这样的语言特征是很容易的。但这将花费他们大量的时间构建一个高质量的VM和成熟的并发性与可靠性类库。因此Erlang很自然会成功。如果将来要在多核系统上进行开发,Erlang是非常理想的选择。

  Erlang在中国

  目前,Erlang在全球都还是个小众语言,其在中国影响力就更小了,好在有国内的 Erlang爱好者已经组织起来,在进行相关的工作,成立了Erlang-china.org,发布了部分Erlang相关中文文档,并且组织了两次 Erlang爱好者聚会,Erlang-China.org将继续为对Erlang感兴趣的中文用户提供便利,促进用户彼此之间的交流,推动对这一语言的深入研究,促成一些Erlang开源项目,帮助中文用户为整个Erlang社区做出贡献。

  Erlang没有类似Java、C++的语法,它不是面向对象语言,它是函数编程语言(Functional programming Language)。大量程序员并不熟悉函数式编程,我们的计算机教育里也都是基于面向对象和面向过程语言的,这会是所有想尝试Erlang的用户遇到的首要问题,这会使得培训成本加大,决策人员也需要足够勇气来选择一个新语言来构建应用。

  另外,Erlang虽然内建了并行、分布的支持,但是程序员还需要学习和掌握并行的思维模式,并行的思维模式也许是更加难以跨越的门槛。

  要解决计算时代,可伸缩性、容错性以及运行时可更新系统需求,就目前而言,只有 Erlang语言可以很好的解决。Erlang语言也正面临这一场大的变革,从默默无闻走向更多人视野,会向更广的网络应用领域渗透。也许,不久的将来,当你听到Erlang时,就如同听说Java一样平常。
分享到:
评论
1 楼 techabc 2009-03-17  
文中“1992年,Erlang迎来更多用户,如RACE项目等”,这个RACE与ACE是否有关系?搜索erlang RACE得到的结果也都是race,只好人肉发问了~

相关推荐

    并行编程语言Erlang:Erlang OTP框架及其应用开发指南

    内容概要:本文档详细介绍了Erlang编程语言及其并行编程模型,并重点阐述了Erlang OTP框架的特性和应用场景。首先,文档简述了Erlang语言的特点,包括轻量级进程、模式匹配和热代码升级等特性,以及它在构建高可用、...

    图书:Erlang和OTP实战

    4. 并发编程:探讨Erlang进程间的同步和异步通信,以及避免竞态条件和死锁的方法。 5. 容错与恢复:了解Erlang的故障检测和恢复机制,以及如何利用OTP库来实现系统的高可用性。 6. 热代码升级:学习如何在不中断服务...

    erlang 语言程序设计

    正如书中引用Joe Armstrong(Erlang语言的主要设计者之一)的话:“Erlang程序模拟了我们思考和互动的方式。”这意味着Erlang的设计原则与现实世界中的对象行为相一致,通过编写能够并行运行的程序来模拟现实世界的...

    Erlang编程

    这本书内容浅显易懂,非常适合初学者,目的是让读者能够快速理解并开始编写Erlang程序。 #### 关键标签 - **Erlang编程**:指的是使用Erlang语言进行软件开发的整个过程。 - **编程**:指的是编写代码、软件开发的...

    某流水过千W的erlang游戏后端

    Erlang是一种面向并发的、函数式编程语言,特别适合构建高可用性和容错性的分布式系统,如游戏后端。某流水过千W的erlang游戏后端项目,揭示了Erlang在处理大规模并发、实时性以及稳定性方面的强大能力。 1. **并发...

    erlang资源

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,用于构建高可用性、分布式和实时系统。这个“erlang资源”包含两本PDF书籍——《Erlang并发编程》和《Erlang入门手册》,它们是深入...

    并行编程语言:Erlang.zip

    史上最全编程语言全套教程,共99门编程语言,包括: 函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 逻辑编程语言 面向对象编程语言 等所有常见...

    函数式编程语言:Erlang.zip

    史上最全编程语言全套教程,共99门编程语言,包括: 函数式编程语言 壳编程语言 常见编程语言 并行编程语言 数据分析编程语言 数据库查询语言 系统编程语言 脚本编程语言 逻辑编程语言 面向对象编程语言 等所有常见...

    Erlang and OTP in Action MEAP May 2010

    Erlang and OTP in Action Martin Logan, Eric Merritt, and Richard Carlsson MEAP Began: August 2008 Softbound print: May 2010 (est.) | 500 pages ISBN: 1933988789 Part One: Getting Past Pure Erlang; ...

    rabbitmq - erlang

    RabbitMQ的核心实现是用Erlang编程语言编写的,这得益于Erlang的并发特性、分布式能力和容错性,使得RabbitMQ能够处理大量并发连接并保证高可用性。 Erlang是一种静态类型、函数式编程语言,由爱立信在20世纪80年代...

    erlang-24.3.3-1.el9.x86_64.rpm

    erlang-24.3.3-1.el9.x86_64.rpm centos

    Erlang程序设计[英文版]

    ### Erlang程序设计知识点概述 #### 一、Erlang编程语言简介 Erlang是一种通用的、函数式编程语言,特别适用于构建高并发、容错性高的分布式系统。其核心设计理念是支持大规模并发处理,这使得Erlang在电信、互联网...

    Erlang游戏程序学习完整PDF手册

    Erlang是一种面向并发的、函数式编程语言,特别适合于构建高可靠性、分布式系统,尤其是在游戏开发领域中表现出色。这份"Erlang游戏程序学习完整PDF手册"是一份全面介绍Erlang在游戏开发中应用的学习资料,包含了...

    awesome-erlang:精选的Erlang库,资源和闪亮内容的精选列表

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,用于构建高可用性、容错性和分布式系统。"awesome-erlang"是一个精心收集的Erlang库、资源和优质内容的列表,旨在帮助开发者更好地理解...

    Erlang并发编程,Erlang程序设计,Erlang中文手册

    Erlang并发编程,Erlang程序设计,Erlang中文手册。 学习erlang的好资料。  Erlang是一个结构化,动态类型编程语言,内建并行计算支持。最初是由爱立信专门为通信应用设计的,比如控制交换机或者变换协议等,因此...

    Erlang编程语言

    **Erlang编程语言** Erlang是一种专为构建大规模并发服务系统而设计的编程语言,尤其在电信和云计算领域有着广泛的应用。由于其独特的设计理念和能力,它在处理高并发、分布式计算以及容错性方面表现出色,使得它...

    图书:Erlang编程

    《Erlang编程》是一本深入探讨Erlang语言的图书,主要面向对并发处理、分布式系统和高可用性有需求的开发者。Erlang是一种为构建大规模并发系统而设计的函数式编程语言,它源自爱立信,以其在电信行业的成功应用而...

    基于Erlang VM的语言

    Erlang虚拟机(Erlang VM,也称为BEAM虚拟机)是Erlang编程语言的核心组成部分,它为Erlang提供了强大的并发特性和故障容错能力。基于Erlang VM的语言充分利用了这些优势,同时也引入了不同语法和编程范式的创新。 ...

    程序员开发erlang的资料

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson为了实现分布式高可用系统而设计。在IT行业中,Erlang因其在处理大规模并发连接和容错能力上的优秀表现,被广泛应用于通信、金融以及互联网等...

Global site tag (gtag.js) - Google Analytics