首页>参考读物>计算机科学与技术>综合

Erlang编程指南
作者 : (美)Francesco Cesarini, Simon Thompson 著
译者 : 慕尼黑Isar工作组 等译
出版日期 : 2011-02-25
ISBN : 978-7-111-30325-1
定价 : 79.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 458
开本 : 16
原书名 : Erlang Programming
原出版社: OReilly Associates
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

Erlang是一种集函数式编程、轻量级并发性、异步消息传递和独特的故障处理方法等功能于一身的编程语言。它可以通过优雅且极其有效的方式解决实际和复杂的问题。本书分为两部分:第一部分为前11章,主要介绍Erlang的特性、基本数据类型、串行程序设计、分布式程序设计;第二部分为剩下的章节,主要介绍Erlang系统,Erlang分布式中的一些应用,如Mnesia数据库和wxErlang图形界面库,使用套接字进行程序设计,Erlang与其他语言编写的系统交互,Erlang系统跟踪,单元测试和EUnit支持。
  本书适用于已经有Java、C等编程语言经验或未接触过函数式编程语言的学生、开发人员、测试人员、项目和技术经理。

图书特色

Erlang是我们提供的解决方案,用于解决高并发和分布式“软实时系统”编程中三个方面的问题:
能够快速且高效地开发软件。
能够应对各种软件错误和硬件故障。
能够实现软件的热升级,也就是不停止运行而完成升级。 
Erlang刚“发明”的时候主要应用于电信系统。但是,今天大量的应用系统也有这样的需求,并且Erlang已经应用于各种系统,比如各种不同的分布式数据库、财务系统和聊天服务器等。最近由于适合在多核处理器上使用,人们对Erlang的兴趣再次被点燃。当整个世界还在苦苦努力寻找方法以提高使用多核处理器效率的时候,使用Erlang的应用实际上不需要任何改动就可以享受到多核处理器的好处。 
一开始Erlang的影响扩展得比较缓慢,也许是因为Erlang一下就大胆引进了函数式编程、轻量级并发性、异步消息传递和独特的故障处理方法等,并且集所有这些功能于一身。显而易见,这就是为什么Java作为一种和C++比较相近的语言,却可以相对容易地被大众接受。然而,因为已经达到了前面提到过的目标,我们认为我们的方法经受住了时间的考验。所以目前Erlang的用户也在迅猛增长。
这本书对Erlang进行了精彩和实用的讲解,并结合了大量逸闻趣事来阐述Erlang语言的发展背景和理念。
我相信,这会是一次愉快的、收获颇丰的阅读。
—— Mike Williams
Director of Traffic and Feature Software
Product Development Unit WCDMA, Ericsson AB
Erlang语言发明人之一

图书前言

促使我们写这本书的主要原因是出于对分享Erlang的热衷。希望我们的工作能对Erlang的学习者有所帮助,这也是我们对Erlang社区给予的一点儿回报。虽然我们两个是出于不同目的而开始学习Erlang的,但结果都是一样:通过付出比学习其他语言更多的努力而获得了更多的乐趣。最妙的是,它不仅仅是以娱乐为目的的工具,而是每天我们工作时都在使用它!
Francesco: 为什么使用Erlang
那是在1994年,我正在Uppsala大学学习计算机科学,我参加的课程之一是并行程序设计。讲师举着“Erlang并行程序设计”(Prentice Hall)第1版,说道:“阅读它吧。”然后他举起讲义又说道,“还有做练习。”之后Erlang就很少被提及。它很快隐没在线程、内存共享、信号量和死锁的理论中。
该课程的主要练习是设计一个模拟胡萝卜、兔子和狼共同居住的环境。在这个环境中,兔子随机在土地上寻找生长的胡萝卜。如果它们吃了足够多的胡萝卜,就会变胖并且由一只分裂为两只。在这个环境中,狼搜寻兔子,如果狼吃了足够多的兔子,也会变胖并且由一只分裂为两只。如果兔子和狼靠近到了一定的距离,就会彼此发布食物和掠食者的消息。如果一只兔子发现了一片生长胡萝卜的土地,其他兔子也会很快知道这个地方。如果狼一旦发现了兔子,马上就开始追逐它。
最后的结果很有趣。一只古怪的兔子直接跑进了狼群,而其他的兔子跑向了其他方向,有时在发现胡萝卜的地方停下来进食。每一块胡萝卜地、每一只兔子和狼都代表了一个Erlang进程,它们之间通过消息传递进行通信。
这个练习花了我大约40个小时。虽然当时我就很喜欢使用Erlang,并且惊讶于Erlang并发模型的简易性和每个进程对操作系统线程极少的占用,但是当时并没有很重视它。毕竟Erlang也只是我为了得到学位而学习的几门语言之一。我在函数式编程中使用了机器语言,并且在实时程序设计中使用了ADA。Erlang对于我来说只是众多语言中的一种。在几个月后,当我开始学习面向对象程序设计时,这一观点得到了改观。
在面向对象程序设计课程中,我们需要模拟同一个环境,不过这一次用Eiffel语言 —— 一种面向对象语言,我们的新讲师认为它极其适合此类模拟。尽管我已经解决过这个问题,可以直接重用其中某些算法,但我还是花费了大约120个人-时来解决它。
这使我惊讶地意识到Erlang的声明性语言和并行处理的特性是软件开发的新方向。当时,我并不确定编程语言是否会向Erlang模式转移,但是我相信,不管是哪种编程语言,将来一定会深受Erlang和它的先驱者的影响。于是我拿起电话打给Joe Armstrong ——
Erlang的创造者之一。一个星期之后,我拜访了爱立信的计算机科学实验室,从此我再没有回头。
Simon:为什么使用Erlang
我是在20世纪80年代早期开始进行函数式编程工作的,而在Erlang问世20年后才知道它的存在。Erlang最吸引我的地方是,它是为解决实际和复杂问题而设计的,并且通过一种优雅且极其有效的方式解决它们。这也正是近几年人们越来越多地把Erlang应用到的各种系统上的原因。
与Java、C++或Haskell语言相比,Erlang还是一种规模较小的语言,这也使得在Erlang上编写工具更具实用价值。这一点,还有我们在工作中所使用的库的质量,帮助在Kent工作的函数式程序设计组更加有效地为Erlang实现Wrangler重构工具。
谁应该阅读本书
我们写这本书的目的是向你介绍如何使用Erlang进行程序设计。我们并不要求你曾经使用过Erlang,或者熟悉其他函数式编程语言。
我们的确希望你已经拥有Java、C、Ruby或其他编程语言的经验,并且会特别指出Erlang与你所使用的其他语言的不同之处。
怎样阅读本书
我们把这本书分成两部分,第一部分需要顺序阅读,第二部分可以并行(或按照你喜欢的顺序)阅读,因为后一部分各章之间互相独立。
前11章包含了Erlang的核心部分:
第1章概括介绍了这门语言,其中包含Erlang 对于建立高效、健壮的并发系统的关键特性。我们还介绍了Erlang是如何发展到今天这种形式的,并且指出应用Erlang的成功实例,这些实例也就解释了为什么你也许会在你的项目中使用Erlang。
第2章和第3章包含了在Erlang中的顺序编程的基础知识。在这两章中,我们介绍了Erlang程序设计的核心之一 —— 递归,并且还介绍了Erlang中的单一赋值与C和Java等语言中的变量处理的不同。
在包含顺序编程的同时,我们也介绍了Erlang的基本数据类型 —— 数字、基元、字符串、列表和元组 —— 并与其他语言的相似类型进行了比较。其他类型的介绍包含在稍后的各章中:记录类型在第7章,函数类型和二进制类型在第9章,ETS表中的大规模的存储在第10章中介绍。
Erlang的特殊性质出现在第4~6章中,Erlang的并发性也是通过消息传递,引发在各自独立的内存中运行的并行进程之间的通信来实现。
系统可能实现代码的“热切换”,即支持在运行系统中的“软件升级”,这是第8章的主题。
这一部分的总结包含在第11章的分布式程序设计中。Erlang允许运行在同一个或不同主机上的Erlang运行时系统(或节点)协同工作,并且组成一个分布式系统。
在其余的章节中,我们将介绍互相独立的多个不同主题。这些包含以下几个方面:
开放电信平台(Open Telecom Platform,OTP)提供一系列库和设计原理来支持建立健壮和可扩展的Erlang系统,这是第12章的内容。
Erlang分布式包含一些标准的应用,我们将在第13章介绍Mnesia数据库,在第14章介绍wxErlang图形用户界面程序设计库。
Erlang分布式提供了把Erlang系统链接在一起的机制。第15章介绍了Erlang如何使用套接字设计跨越Internet的程序,第16章包含Erlang与其他语言(如C、Java、Ruby等)编写的系统进行交互的多种方式。
标准Erlang发布中包含许多有用的工具,我们将介绍其中的一部分。第17章深度解释了如何进行Erlang系统跟踪而不降低系统性能,第18章介绍了检验程序正确性和建立Erlang系统文档的工具,第19章介绍了如何通过EUnit来支持单元测试。
第20章介绍如何编写优美、可读性强和高效的Erlang程序,以及一些在Erlang社区中积累的经验。
附录包括如何启动Erlang,如何使用Erlang终端,比较流行的Erlang工具和如何查找关于Erlang更多的信息。
每章末尾均附有练习,你可以从以下网站下载本书中的所有代码:
http://www.erlangprogramming.org
该网站还包含其他更进一步的相关阅读材料,还有一些主要的Erlang社区的支持网站的链接。
本书是保持和Erlang Release 13(R13-B)版本兼容。本书所描述的大部分特性也适用于Erlang早期版本,已知的和近期版本冲突的细节会在网站详细说明。
本书的约定
本书应用了如下一些印刷排版上的约定:
斜体(Italic)
用于文件名、文件扩展名、URL、应用程序名称、强调以及关键词。
等宽字体(Constant width)
用于表明广义上的计算机代码,包括命令、选项、变量、属性、键、请求、函数、方法、数据类型、类、模式、参数、对象、事件、事件处理器、XML和XHTML标签、宏和关键词。
等宽粗体(Constant width bold)
用于表明命令或者其他的用户需要逐字输入的文本内容。
等宽斜体(Constant width italic)
用于表示需要使用用户提供的值或者由上下文决定的值来替代的文本内容。
使用代码示例
本书试图帮助读者在Erlang中编写程序和系统。你可以在自己的程序和文档中使用本书的代码。
你不必联系出版社即可获得使用本书代码的授权,除非你重写本书中大量的代码。比如说,如果你在编写程序时使用本书几个代码片段,那么你不需要获得我们的许可。引用本书的内容和示例代码来回答问题,同样不需要获得我们的许可。
在你的产品文档中包含大量我们的代码时需要获得我们的许可。出售或分发在O’Reilly书籍CD-ROM中的代码需要获得我们的授权。
如果你引用了本书的内容,我们对此表示感谢,但并不要求在引用时包含书的版权归属。这些版权归属通常包括标题、作者、出版社和ISBN,例如“Erlang Programming, by Francesco Cesarini and Simon Thompson. Copyright 2009 Francesco Cesarini and Simon Thompson, 978-0-596-51818-9”。
如果你对是否需要获得示例代码的授权还不清楚,请随时联系我们:permissions@oreilly.com。
如何联系我们
请将对本书的评价和存在的问题通过如下地址告知出版者:
美国:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
O’Reilly的每一本书都有专属网站,你可以在那找到关于本书的相关信息,包括勘误列表、示例代码以及其他的信息。本书的网站地址是:
http://www.oreilly.com/catalog/9780596518189/
或者:
http://www.erlangprogramming.org
对于本书的评论和技术性的问题,请发送电子邮件到:
bookquestions@oreilly.com
关于本书的更多信息、会议、资料中心和O’Reilly网络,请访问以下网站:
http://www.oreilly.com/
http://www.oreilly.com.cn/
致谢
我们感谢所有帮助本书出版的人。首先是Jan“Call Me Henry”Nystr m,他帮助我们启动了这个项目。
整个O’Reilly Media团队给予了我们无尽的帮助,特别是编辑Mike Loukides,他耐心地指导并鼓励我们,以确保每一章持续进行。在此特别感谢Audrey Doyle的审稿,还有Rachel Monaghan、Marlowe Shaeffer、 Lucie Haskins、Sumita Mukherji和所有制作团队的工作人员。
然后是OTP团队,特别是Bjorn Gustavsson、Sverker Eriksson、Dan Gudmundsson、Kenneth Lundin、H kan Mattsson、Raimo Niskanen和Patrik Nyblom,他们不仅帮助我们确保缺少文档和没有发布的特性跟最新的发行版本保持一致,同时保证其准确并正确。
其他需要特别提及的审阅人包括Thomas Arts、Zvi Avraham、Franc Bozic、 Richard Carlsson、Dale Harvey、Oscar Hellstr m、Steve Kirsch、Charles McKnight、Paul Oliver、Pierre Omidyar、Octavio Orozio、Rex Page、Michal Ptaszek、Corrado Santoro、Steve Vinoski、David Welton、Ulf Wiger和Mike Williams。
即使我们在此并没有具体提及每个人的贡献,但正是由于他们每个人的贡献,才使得这本书更加出色。谢谢他们。
Francesco需要特别感谢Alison对她的支持和耐心。我并没有意识到在我同意写这本书后会遭遇到什么,我想她也没有。我保证在写下一本书之前,她会有一个摆脱笔记本电脑和手机的假期。还要感谢每一个Erlang培训和咨询部门的人对我的鼓励,还有Simon,他真是个极好的合作者。我们将来一定还会一起合作,因为结果是如此美妙。但是现在 —— 休息!
Simon需要特别感谢Jane、Alice和Rory在这几个繁忙月份里对他的支持和耐心:如果没有他们的鼓励,就没有这本书。同时感谢Francesco让我参加这个项目,与他合作非常愉快。我希望还有机会一起合作,只是别在近期……

上架指导

计算机\程序设计

封底文字

我已经使用Erlang很多年了,在看过这本手册后,我总喜欢把它的某些章节留在我的显示器上,这样可以更方便在编程时作为参考。所有层次的Erlang程序员都会在这本书中发现无穷的价值。
                    ——SteveVinoski,《IEEE Internet Computing》的
                             “The Functional Web”专栏作家
 
本书全方面深入地介绍了Erlang语言,对于任何一个系统,如果并发性、容错性和快速反应能力对它来说是很重要,那么使用Erlang是很合适的。阅读本书,不管你的编程背景或者经验如何,你都可以学习到如何编写复杂的Erlang并发程序。
本书由Erlang社区带头人撰写,而且内容基于他们的培训材料。本书的重点集中在解释Erlang语言的语法和语义,同时讲述了模式匹配、规范列表、递归、调试、网络和并发性等。

这本书可以帮助你
理解Erlang的优势及其特殊功能
了解并发背后的概念及其Erlang处理问题的方法
编写有效率和代码具有整洁性和可读性的Erlang程序
探究Erlang如何满足分布式系统的要求
非常容易地添加简单的图形用户界面
学习Erlang调试并发和分布式系统的跟踪机制
使用内置的Mnesia数据库和其他表存储功能

本书使用简单易懂的实例阐述深奥的理论知识,方便我们更好地理解每一个知识点。在每一章的结束部分都提供了练习,用于巩固提升对知识点的理解。

作者简介
Francesco Cesarini有14年针对学生、开发人员、测试人员、项目和技术经理传授Eralng/OTP的经验。他协助建立了爱尔兰、美国和英国的Erlang研发中心。
 
Simon Thompson是一位肯特大学计算实验室关于逻辑和计算学的教授,过去25年里他在那里教授本科生和研究生的计算学课程。

作者简介

(美)Francesco Cesarini, Simon Thompson 著:暂无简介

译者简介

慕尼黑Isar工作组 等译:暂无简介

译者序

译者序
  伴随着并发多核CPU计算机系统近年来的迅速发展,作为有20多年历史的成熟系统语言,由于Erlang在语言级别上就提供的并发性和分布性等特性,所以它受到了大众越来越多的关注。
  由于Web 2.0的爆炸式发展,以及Web 3.0的初步显现,网站已经开始由一个单纯提供信息的平台逐渐发展演变为一个错综复杂的交互软件系统平台。而云计算和NoSQL等新概念的一再升温也预示着并发系统时代的到来。这也对传统的软件开发方式提出新挑战。
  很多曾经只有在计算机教科书中提到的概念,比如同步、线程、死锁、抢占和信号量等,现在越来越多地可以在现实系统中找到它们的影子。由于历史及其各种原因,传统编程语言在创建的初期并没有把并发性放到核心位置,它们并非在语言级别原生支持并发和多核系统。所以,用它们实现多核系统相当复杂且容易产生错误。而Erlang一开始就是为高并发性(一开始应用于电信系统中的高并发系统)设计的,所以它的并发特性是与生俱来的,并且在长达20多年的发展中其理论和实践都得到了不断完善。由此可见,Erlang语言能在多核并发系统中脱颖而出,绝对不是偶然。
  并发系统中一个很重要的概念是进程通信。传统语言的处理方法是通过共享数据和内存实现的。而Erlang中的进程通信则采用其专有的进程消息模型,从而完全避免锁的使用,这避免了传统语言进程通信中会碰到的很多让人头疼的问题。这一点对于并发系统来讲可以说是具有革命性的意义。
  本书由慕尼黑Isar工作组翻译,我们在翻译本书的过程中尽量忠实于原文,力求做到通俗易懂和言简意赅。自从翻译本书以来,我们感觉Erlang系统越来越棒了。由于介绍Erlang的中文资源相当匮乏,所以我们向大家推荐这本经典著作。我们希望本书对那些想了解现代并发系统和Erlang语言的朋友有所帮助。
  本书第1 ~ 4章由刘姗姗翻译,第5 ~ 9章由张军翻译,第10 ~ 12章及附录由姜凯翻译,第13 ~ 16章由骆古道翻译,第17 ~ 20章由程帆翻译。杨剑负责最后全书校稿通读,并做了细致修改和调整工作。由于时间仓促,加之水平有限,翻译过程中难免有不妥或错误之处,敬请广大读者批评指正。
刘姗姗
于德国慕尼黑

图书目录

序 1
前言 3
第1章 引言 9
为什么我应该使用Erlang 9
Erlang语言的历史及发展 11
Erlang的特性 12
Erlang和多核 17
案例研究 18
应该如何使用Erlang 21
第2章 Erlang基础 22
整数 22
Erlang终端 23
浮点数 23
基元 25
布尔类型 27
元组 28
列表 29
项元比较 34
变量 36
复杂数据结构 38
模式匹配 40
函数 44
模块 46
练习 50
第3章 Erlang顺序编程 52
条件评估 52
保护元 57
内置函数 60
递归 66
运行时错误 75
处理错误 77
模块库 84
调试器 87
练习 90
第4章 并发编程 95
创建进程 96
消息传递 98
接收消息 100
注册进程 107
超时 110
性能基准测试 111
进程架构 112
尾递归和内存泄漏 113
面向并发程序设计的个案研究 115
竞争条件、死锁和饥饿进程 116
进程管理器 118
练习 119
第5章 进程设计模式 121
客户端/服务器模型 122
进程模式实例 128
有限状态机 130
事件管理器和句柄 134
练习 141
第6章 进程错误处理机制 143
进程链接和退出信号 143
健壮性系统 152
练习 158
第7章 记录和宏 161
记录 162
宏 168
练习 172
第8章 软件升级 175
升级模块 175
幕后 178
升级过程 184
.erlang文件 188
练习 188
第9章 更多数据类型和高级别构造 190
实践中的函数式编程 190
Funs和高阶函数 191
列表解析 198
二进制类型和序列化 202
引用 211
练习 212
第10章 ETS和Dets表 214
ETS表 214
Dets表 228
移动用户数据库实例 231
练习 242
第11章 Erlang中的分布式编程 244
Erlang中的分布式系统 244
Erlang中的分布式计算:基础 246
epmd进程 259
练习 260
第12章 OTP行为包 261
OTP行为包介绍 261
通用服务器 264
监控进程 274
应用 278
版本发行的处理 284
其他行为包和更多阅读资源 287
练习 288
第13章 Mnesia介绍 290
何时使用Mnesia 290
配置Mnesia 292
事务处理 296
分区网络 301
扩展阅读 302
练习 303
第14章 图形用户界面编程wxErlang 305
wxWidgets 305
wxErlang:wxWidgets绑定到Erlang 306
第一个实例:MicroBlog 309
MiniBlog实例 313
获取和运行wxErlang 316
练习 317
第15章 套接字编程 319
用户数据报协议 319
传输控制协议 323
inet模块 328
扩展阅读 329
练习 330
第16章 Erlang与其他编程语言接口 332
交互运作概况 332
与Java交互运作 334
C节点 339
Unix终端的Erlang调用:erl_call 343
端口程序 343
通信支持库 347
内联驱动程序和FFI 349
练习 350
第17章 跟踪内置函数,dbg跟踪器以及匹配规则 351
引言 351
跟踪内置函数 352
用trace_pattern内置函数跟踪调用 358
dbg跟踪器 362
匹配规则:fun语法 370
匹配规则:螺母和螺栓 379
扩展阅读 387
练习 388
第18章 类型和文档 390
Erlang中的类型 390
TypEr: 成功类型和类型推断 394
使用EDoc生成文档 397
练习 405
第19章 EUnit和测试驱动开发 406
测试驱动开发 406
EUnit 407
EUnit的基础架构 411
测试基于状态的系统 413
在Erlang中测试并发程序 414
练习 415
第20章 风格和效率 417
应用和模块 417
进程和并发 422
格式约定 425
编码策略 431
效率 433
最后 437
附录 使用Erlang 439

教学资源推荐
作者: 吕云翔 王洋 肖咚 编著
作者: (美)M. Morris Mano加州大学洛杉矶分校 Charles R.Kime威斯康星大学麦迪逊分校 著
作者: [美]查克·伊斯特姆(Chuck Easttom)著
参考读物推荐
作者: (美)Osamu Takagiwa 等
作者: 文·新浪微博(编) 漫画·DOMI (绘)
作者: 吉普生 编著