Erlang/OTP并发编程实战引  言_Erlang/OTP并发编程实战引  言试读-查字典图书网
查字典图书网
当前位置: 查字典 > 图书网 > 编程 > Erlang/OTP并发编程实战 > 引  言

Erlang/OTP并发编程实战——引  言

Erlang是一门以进程为核心概念的语言。什么是进程?电脑上同时运行着的多个程序,比方说文字处理软件和Web浏览器,彼此便运行在各自的进程之中。文字处理软件若崩溃,通常不会影响浏览器——反之亦然,崩溃的浏览器也不会弄丢你正在编辑的文档。进程就像是某种在并行执行流程间起隔离保护作用的隔膜,Erlang便是完全围绕进程来构建起来的。 在Erlang中创建进程易如反掌——这就像是在Java等语言中创建对象一样简单。进程变得如此廉价,使得我们得以从不同的视角来看待系统。Erlang程序中的任何独立活动都可以被视作单独的进程。没有晦涩的事件循环,也没有线程池,所有这些烦人的实现细节统统都可以抛开。即便程序需要同时运行10 000个进程来完成某个任务,也可以轻松搞定。阅读本书时你会发现,Erlang可以极大地改变我们看待系统的方式。我们希望让你看到,系统可以以更直观(也更高效)的方式得以呈现。 Erlang还是一门函数式编程语言。别害怕,Erlang完全可以设计得更贴近你所熟悉的那些主流语言;即便不借助函数式编程,这里记述的各种特性也一样可以实现。但函数式编程所具有的引用透明性、高阶函数、不可变数据结构等几大特点,它们本身就很值得引入Erlang。函数式编程简洁优雅地融合并呈现了这些特点。要不是引入了函数式编程,Erlang只会变得更为复杂,也不可能那么令人愉悦。 Erlang诞生记 你头一回听说Erlang时,它多半是被定性为一门“函数式并发编程语言”,而你大概也会觉得它听起来更像是某种学院派的、不实用的玩具语言。但我们要强调的是,Erlang从一开始就致力于解决真实的大规模软件工程问题。为了把话说清楚,我们得先好好聊聊这门语言背后的历史。 与C比较 Erlang和C语言的背景颇为相似。首先,二者都源自大型电信公司,都是由某个环境相对轻松的研发部门里的几个人创造出来的。两门语言的创造者都是自在之人,但他们同时也都是试图去解决具体问题的务实的工程师。对于C来说,要解决的问题是如何在硬件资源受限(相对那时而言)的情况下,用比汇编更高级的语言来开发系统软件。对于Erlang来说,问题则在于如何让程序员开发超大规模、高并发和强容错的软件,并彻底改善生产效率、减少软件缺陷的数量——这可真不是闹着玩儿的。 两种语言的第一批追随者都来自公司内部,这些人在各种内部项目和实际产品中使用它们,并就各种务实的细节向语言的缔造者们提出了宝贵的前期反馈。二者都花了大约十年时间才为公众所知,而在此之前,它们都出色地经受住了实战的检验。C诞生于1972年左右,流行于20世纪80年代。同样,Erlang成形于1988年,直到1998年才以开源的形式对外发布。在公司外部,两种语言先点燃的都是研究机构和大学的兴趣。当然,出于历史原因它们各有各的缺点,但一般来说我们并不在乎,因为也只有它们真正地解决了问题。 让我们把目光转向过去。 20世纪80年代中期,斯德哥尔摩:那个自由散漫的英国人 Erlang诞生自一个研究项目,该项目旨在寻求一种更好的编程方式,用以开发当时电信业内那些大流量、高并发、猛龙一般永生不死的控制系统。Joe Armstrong 于1985年加入这个项目,来到了位于瑞典斯德哥尔摩的爱立信计算机科学实验室。 这个项目的主要任务就是用尽可能多的编程语言来实现同一类通话控制系统。涉及的语言包括Ada、CLU、Smalltalk等。最终的结果结论性并不强,虽然很明显上上之选是用函数式和逻辑语言并采取高级的声明式风格来进行开发,但当时还没有哪种语言具备合适的并发模型。 但谁知道好的并发模型是个什么样呢?那时(以及之后近二十年间),并发方面的主要研究要么集中在CSP、pi演算这样的纯抽象进程模型和并发逻辑语言上,要么就集中在信号量(semaphore)、监视器(monitor)和信号(signal)这类底层机制上。 与此同时,工程师们仍然要解决各种大规模并发容错通信系统的实际问题。当时的爱立信已经有了独门秘籍,那是一套专有的揉合了编程语言和操作系统的混合解决方案,名为PLEX,AXE电话交换机的成功就要归功于它。 让人抓狂的需求 PLEX是一门相对常规的命令式编程语言,但它为后继者立下了一系列标杆: 进程必须是语言的核心; 任何进程不得损坏其他进程的内存空间,不得遗留悬空指针; 由于要同时跑数万乃至数十万个进程,进程创建和任务切换的速度必须要快,单个进程的内存占用量必须非常小; 必须能够隔离单个进程的故障; 必须能够在运行时对系统进行代码升级; 必须能够同时检测和处理软硬件错误。 与此最相近的语言当属Parlog和Strand等并发逻辑语言,但它们对进程有着不同的定义,进程的粒度更细,对单个进程的控制力也很弱。 Erlang的诞生 一天,Joe发现Prolog基于规则的编程风格可以很好地匹配他之前为描述通话控制问题而发明的手写标记法,于是他开始编写一个Prolog的元解释器 。通过这种方式,他扩展了Prolog,模拟出进程切换,用以并发运行多个电话呼叫。 很快,解释器所能识别的表达式形成了一个支持进程和消息传递的小型语言;虽然是用Prolog实现的,但它更简单,而且是函数式的,也没有用上Prolog的合一 和回溯特性。没多久,便有人一语双关地提议将之命名为Erlang(一方面指丹麦数学家A. K. Erlang,他因在通信系统统计领域的贡献而为电信工程师们所熟知;一方面它也是Ericsson Language的简写)。 就这样,开发小型但可工作的通话控制系统的需求驱动着早期Erlang的演化。特别是消息传递原语的设计,完全是出于大型电信系统的实际需要,绝非为了迎合某个特定的并发理论。这里所说的消息传递原语,指的是异步的消息发送操作符、自动消息缓存和乱序的选择性消息接收机制(这一设计深受用于规范复杂通信系统协议的CCITT SDL标记法的影响)。 1988年,一群真正的用户进行了初期实验,开发了一个全新的电信架构,事实证明该语言极大地提升了生产效率,但当时的实现实在是太慢了。于是从1990年起,Joe、Mike Williams和Robert Virding开始实现Erlang的第一个抽象机。这个抽象机名叫JAM,是一个用C写成的堆栈机,比起最初的Prolog实现要快上70倍。 1993年,第一本Erlang书籍出版,并于1996年再版。直到这时,Erlang才终于可以算得上是一门真正的语言了。 发展壮大 在后来的年月里,Erlang又累积了许多特性,如分布式、记录语法、预处理器、Lambda表达式(fun语句)、列表速构、Mnesia数据库、二进制数据类型以及比特位语法等。整个系统也被移植到了Windows、VxWorks和QNX等非UNIX平台上。 1995年,随着一个巨型C++项目的分崩离析,Erlang在爱立信内部获得了空前的发展。该项目被推倒重来,这回用的正是Erlang以及“不过60个”程序员;另外还有一个靠谱的语言支持部门——OTP团队——来给他们做后盾。最终的成果便是取得了巨大成功的AXD301系统,整个系统由一百多万行Erlang代码锻造而成。 与此同时,1998年,乌普萨拉大学的一群学生正将Erlang本地代码编译作为他们的硕士论文课题,并以此成立了高性能Erlang研究组;最终,HiPE(High Performance Erlang)本地代码编译器被整合进标准Erlang/OTP发行版。此外,爱立信的一个内部项目曾试图将Erlang编译为C来提高执行效率,终因生成的代码过大而失败。然而该项目却衍生出了BEAM,一个更快的、基于寄存器的多线程代码抽象机,一举取代了老旧的JAM。 但在20世纪90年代晚期,随着Java兴起,爱立信公司高层认为不该把人力投入到自创的编程语言的开发维护中去,而应该采用“全世界通用的语言”。因此,Erlang被禁止用于新项目。最终管理层被说服将Erlang开源,以便造福爱立信以外的用户。事情发生于1998年12月,很快,为数不少的核心开发者选择离职并共同创建了一家小公司,借由Erlang和丰富的电信经验,这批人很快就赚到了第一桶金。 大获成功 渐渐地,外部用户越来越多。随着时间的流逝,爱立信的人们也开始将禁令抛到脑后,Erlang的作用大得令人难以抗拒,现存的系统也不再被要求用别的语言重写了。OTP团队继续开发和维护Erlang,爱立信也持续资助着HiPE项目,以及EDoc和Dialyzer等许多衍生应用。 在学术界,Erlang则被公认为一门成熟且有价值的函数式编程语言。自2002年起,ACM SIGPLAN开始资助一年一度的Erlang Workshop,使之成为与ICFP(国际函数式编程会议)平起平坐的年度盛会。而最令人自豪的则是Erlang的并发模型成为了许多其他编程语言争相实验和效仿的对象;不过正如许多人所见,这马后炮也不是那么容易放的哟。 2006年,当硬件产业开始承认自身已然触及单核处理器的性能瓶颈时,Erlang发布了第一个支持SMP的版本,这是爱立信的OTP团队和HiPE团队通力合作的成果。接着,在2007年,Joe的新书Programming Erlang(《Erlang程序设计》)面世(此时距Erlang的第一本书出版已10年有余)——一时之间,Erlang变成了全球瞩目的焦点。大大小小的公司都争相用它创建各种不可思议的应用。 本书的故事便从这里开始了。

展开全文

推荐文章

猜你喜欢

附近的人在看

推荐阅读

拓展阅读

《Erlang/OTP并发编程实战》其他试读目录

• 序
• 译 者 序
• 前  言
• 引  言 [当前]
• 第一章:Erlang/OTP平台