Erlang程序设计(图灵程序设计丛书)(Programming Erlang software for a concurrent world)
分類: 图书,计算机与互联网,程序语言与软件开发,语言与开发工具,综合,
品牌: 阿姆斯特朗
基本信息·出版社:人民邮电出版社
·页码:427 页
·出版日期:2008年
·ISBN:9787115188694
·条形码:9787115188694
·包装版本:1版
·装帧:平装
·开本:16
·正文语种:中文
·丛书名:图灵程序设计丛书
·外文书名:Programming Erlang software for a concurrent world
产品信息有问题吗?请帮我们更新产品信息。
内容简介《Erlang程序设计》是讲述下一代编程语言Erlang 的权威著作,主要涵盖顺序型编程、异常处理、编译和运行代码、并发编程、并发编程中的错误处理、分布式编程、多核编程等内容。《Erlang程序设计》将帮助读者在消息传递的基础上构建分布式的并发系统,免去锁与互斥技术的羁绊,使程序在多核CPU 上高效运行。《Erlang程序设计》讲述的各种设计方法和行为将成为设计容错与分布式系统中的利器。
作者简介Joe Armstrong,Erlang最初的设计者和实现者,也是Erlang OTP系统项目的首席架构师。他拥有瑞典皇家理工学院博士学位,是容错系统开发领域的世界级专家。此外,他还在开发旨在替代XML的标记语言ML9。现任职于爱立信公司。
赵东炜,(Jackyz)独立软件顾问,一直专注于Web应用开发,曾负责设计和维护某大型门户网站的多个核心应用,对高并发大容量的分布式应用领域有独到见解。曾担任过软件开发工程师、系统架构师、技术经理、产品经理、创业者等多种不同的角色。闲暇时以思考技术问题为乐,从事软件行业10余年来,从最初的ASP/PHP到之后的Java/.NET以及现在的Ajax和Erlang,一直都活跃在技术的最前沿。2006年作为主要译者参与了AjaxcincAction(中译本《Ajax实战》,由人民邮电出版社出版)的翻译工作。之后为Erlang强大的并发能力所吸引,是国内学习和传播Erlang技术的第一批人,迄今已有2年多的实际开发经验。在2007年3月创建了Erlang中文社区(erlang-china.org),现在是国内Erlang爱好者聚集和分享资料的主要网站。
金尹,长期从事电信行业的大规模语音通信程序的研发,有丰富的并发/分布式网络系统的开发经验。业余从事于数学与编程语言理论,以及并行计算方面的研究。致力于在国内推广函数式语言的发展,分别在2001年和2006年在《程序员》杂志上介绍Python、Erlang等前卫的编程理念。
媒体推荐“Erlang让我有醍醐灌顶之感,它促使我开始以完全不同的方式思考问题。Amstrong能够亲自写作本书,实乃社区之福。”
——Dave Thomas,软件开发大师,《程序员修炼之道》艺术作者
“向所有程序员强烈推荐本书,我们都将从中获益匪浅。”
——Gary Pollice,IBM Rational开发团队前核心成员,Worcester理工学院教授
“Erlang是目前唯一成熟可靠的能够开发高扩展性并发软件系统的语言,它将成为下一个Java。”
——Ralph Johnson,软件开发大师,《设计模式》作者之一
编辑推荐在多核、并发、分布为王的时代,谁将成为下一个主流编程语言?来自全世界的众多专家都认为,Erlang最有可能在竞争中胜出。
Erlang开源语言系出名门,通信巨头爱立信公司用它开发出了可靠性惊人的交换机系统AXD301。它天生就是面向并发、分布和高容错的,兼有函数式语言和脚本语言的各种优点,而且已经用于商业开发多年,具有稳定性极高的虚拟机和平台库。有了这些天时地利,无怪乎Erlang能够迅速成为热门的开发语言,除了广泛应用于通信行业之外,它已经进入了各个领域:Facebook用它实现了聊天系统,Yahoo用它重写了Delicious,Amazon用它开发了云计算数据服务SimpleDB,还有多人游戏、测试工具、电子支付、数据采集与监控、企业消息、电子邮件、空中交通管制……
《Erlang程序设计》由Erlang之父Joe Armstrong编写,是毋庸置疑的经典著作。书中兼顾了顺序编程、并发编程和分布式编程,较深入地讨论了开发Erlang应用中至关重要的文件和网络编程、OTP、MNesia、Ets和Dets等主题,更为精彩的是,大师亲自操刀,构建了MapReduce实例和多人聊天实例,一定让你大呼过瘾。
Erlang之父权威著作
领先一步,精通下一代主流编程语言
从这里开始,拥抱未来
目录
第1章引言1
1.1路线图1
1.2正式起航3
1.3致谢3
第2章入门5
2.1概览5
2.1.1阶段1:茫然无绪5
2.1.2阶段2:初窥门径5
2.1.3阶段2.5:观其大略,不求甚解6
2.1.4阶段3:运用自如6
2.1.5重中之重6
2.2Erlang安装7
2.2.1二进制发布版7
2.2.2从源代码创建Erlang8
2.2.3使用CEAN8
2.3本书代码8
2.4启动shell9
2.5简单的整数运算10
2.6变量11
2.6.1变量不变12
2.6.2模式匹配13
2.6.3单一赋值为何有益于编写质量更高的代码14
2.7浮点数15
2.8原子16
2.9元组17
2.9.1创建元组18
2.9.2从元组中提取字段值18
2.10列表19
2.10.1术语20
2.10.2定义列表20
2.10.3从列表中提取元素20
2.11字符串21
2.12再论模式匹配22
第3章顺序型编程24
3.1模块24
3.2购物系统——进阶篇28
3.3同名不同目的函数31
3.4fun31
3.4.1以fun为参数的函数32
3.4.2返回fun的函数33
3.4.3定义你自己的抽象流程控制34
3.5简单的列表处理35
3.6列表解析38
3.6.1快速排序39
3.6.2毕达哥拉斯三元组40
3.6.3变位词40
3.7算术表达式41
3.8断言41
3.8.1断言序列42
3.8.2断言样例43
3.8.3true断言的使用44
3.8.4过时的断言函数44
3.9记录44
3.9.1创建和更新记录45
3.9.2从记录中提取字段值45
3.9.3在函数中对记录进行模式匹配46
3.9.4记录只是元组的伪装46
3.10case/if表达式46
3.10.1case表达式47
3.10.2if表达式47
3.11以自然顺序创建列表48
3.12累加器48
第4章异常50
4.1异常50
4.2抛出异常51
4.3try...catch51
4.3.1缩减版本53
4.3.2使用try...catch的编程惯例53
4.4catch54
4.5改进错误信息55
4.6try...catch的编程风格55
4.6.1经常会返回错误的程序55
4.6.2出错几率比较小的程序56
4.7捕获所有可能的异常56
4.8新老两种异常处理风格56
4.9栈跟踪57
第5章顺序型编程进阶58
5.1BIF58
5.2二进制数据58
5.3比特语法60
5.3.116bit色彩的封包与解包60
5.3.2比特语法表达式61
5.3.3高级比特语法样例62
5.4小问题集锦67
5.4.1apply68
5.4.2属性68
5.4.3块表达式71
5.4.4布尔类型71
5.4.5布尔表达式72
5.4.6字符集72
5.4.7注释72
5.4.8epp73
5.4.9转义符73
5.4.10表达式和表达式序列74
5.4.11函数引用74
5.4.12包含文件75
5.4.13列表操作符++和——75
5.4.14宏76
5.4.15在模式中使用匹配操作符77
5.4.16数值类型78
5.4.17操作符优先级79
5.4.18进程字典79
5.4.19引用80
5.4.20短路布尔表达式80
5.4.21比较表达式81
5.4.22下划线变量82
第6章编译并运行程序83
6.1开启和停止Erlang shell83
6.2配置开发环境84
6.2.1为文件加载器设定搜索路径84
6.2.2在系统启动时批量执行命令85
6.3运行程序的几种不同方法86
6.3.1在Erlang shell中编译运行86
6.3.2在命令提示符下编译运行86
6.3.3把程序当作escript脚本运行88
6.3.4用命令行参数编程89
6.4使用makefile进行自动编译90
6.4.1makefile模板90
6.4.2定制makefile模板92
6.5在Erlang shell中的命令编辑93
6.6解决系统死锁93
6.7如何应对故障93
6.7.1未定义/遗失代码94
6.7.2makefile不能工作94
6.7.3shell没有响应95
6.8获取帮助96
6.9调试环境96
6.10崩溃转储97
第7章并发98
第8章并发编程101
8.1并发原语101
8.2一个简单的例子102
8.3客户/服务器介绍103
8.4创建一个进程需要花费多少时间107
8.5带超时的receive109
8.5.1只有超时的receive109
8.5.2超时时间为0的receive109
8.5.3使用一个无限等待超时进行接收110
8.5.4实现一个计时器110
8.6选择性接收111
8.7注册进程112
8.8如何编写一个并发程序113
8.9尾递归技术114
8.10使用MFA启动进程115
8.11习题115
第9章并发编程中的错误处理116
9.1链接进程116
9.2on_exit处理程序117
9.3远程错误处理118
9.4错误处理的细节118
9.4.1捕获退出的编程模式119
9.4.2捕获退出信号(进阶篇)120
9.5错误处理原语125
9.6链接进程集126
9.7监视器126
9.8存活进程127
第10章分布式编程128
10.1名字服务129
10.1.1第一步:一个简单的名字服务130
10.1.2第二步:在同一台机器上,客户端运行于一个节点而服务器运行于第二个节点131
10.1.3第三步:让客户机和服务器运行于同一个局域网内的不同机器上132
10.1.4第四步:在因特网上的不同主机上分别运行客户机和服务器133
10.2分布式原语134
10.3分布式编程中使用的库136
10.4有cookie保护的系统136
10.5基于套接字的分布式模式137
10.5.1lib_chan137
10.5.2服务器代码138
第11章IRC Lite141
11.1消息序列图142
11.2用户界面143
11.3客户端程序144
11.4服务器端组件147
11.4.1聊天控制器147
11.4.2聊天服务器148
11.4.3群组管理器149
11.5运行程序150
11.6聊天程序源代码151
11.6.1聊天客户端151
11.6.2Lib_chan配置154
11.6.3聊天控制器154
11.6.4聊天服务器155
11.6.5聊天群组156
11.6.6输入输出窗口157
11.7习题159
第12章接口技术160
12.1端口161
12.2为一个外部C程序添加接口161
12.2.1C程序162
12.2.2Erlang程序164
12.3open_port167
12.4内联驱动167
12.5注意170
第13章对文件编程172
13.1库的组织结构172
13.2读取文件的不同方法172
13.2.1从文件中读取所有Erlang数据项174
13.2.2从文件的数据项中一次读取一项174
13.2.3从文件中一次读取一行数据176
13.2.4将整个文件的内容读入到一个二进制数据中176
13.2.5随机读取一个文件176
13.2.6读取ID3标记177
13.3写入文件的不同方法179
13.3.1向一个文件中写入一串Erlang数据项179
13.3.2向文件中写入一行181
13.3.3一步操作写入整个文件181
13.3.4在随机访问模式下写入文件183
13.4目录操作183
13.5查询文件的属性184
13.6复制和删除文件185
13.7小知识185
13.8一个搜索小程序186
第14章套接字编程189
14.1使用TCP189
14.1.1从服务器上获取数据189
14.1.2一个简单的TCP服务器192
14.1.3改进服务器195
14.1.4注意196
14.2控制逻辑197
14.2.1主动型消息接收(非阻塞)197
14.2.2被动型消息接收(阻塞)198
14.2.3混合型模式(半阻塞)198
14.3连接从何而来199
14.4套接字的出错处理199
14.5UDP200
14.5.1最简单的UDP服务器和客户机201
14.5.2一个计算阶乘UDP的服务器201
14.5.3关于UDP协议的其他注意事项203
14.6向多台机器广播消息203
14.7SHOUTcast服务器204
14.7.1SHOUTcast协议205
14.7.2SHOUTcast服务器的工作机制205
14.7.3SHOUTcast服务器的伪代码206
14.7.4运行SHOUTcast服务器211
14.8进一步深入212
第15章ETS和DETS:大量数据的存储机制213
15.1表的基本操作214
15.2表的类型214
15.3ETS表的效率考虑215
15.4创建ETS表216
15.5ETS程序示例217
15.5.1三字索引迭代器218
15.5.2构造表219
15.5.3构造表有多快219
15.5.4访问表有多快220
15.5.5胜出的是……220
15.6DETS222
15.7我们没有提及的部分224
15.8代码清单225
第16章OTP概述228
16.1通用服务器程序的进化路线229
16.1.1server 1:原始服务器程序229
16.1.2server 2:支持事务的服务器程序230
16.1.3server 3:支持热代码替换的服务器程序231
16.1.4server 4:同时支持事务和热代码替换233
16.1.5server 5:压轴好戏234
16.2gen_server起步236
16.2.1第一步:确定回调模块的名称237
16.2.2第二步:写接口函数237
16.2.3第三步:编写回调函数237
16.3gen_server回调的结构240
16.3.1启动服务器程序时发生了什么240
16.3.2调用服务器程序时发生了什么240
16.3.3调用和通知241
16.3.4发给服务器的原生消息241
16.3.5Hasta la Vista, Baby(服务器的终止)242
16.3.6热代码替换242
16.4代码和模板243
16.4.1gen_server模板243
16.4.2my_bank245
16.5进一步深入246
第17章Mnesia:Erlang数据库247
17.1数据库查询247
17.1.1选取表中所有的数据248
17.1.2选取表中的数据249
17.1.3按条件选取表中的数据249
17.1.4从两个表选取数据(关联查询)250
17.2增删表中的数据250
17.2.1增加一行251
17.2.2删除一行251
17.3Mnesia事务252
17.3.1取消一个事务253
17.3.2加载测试数据255
17.3.3do()函数255
17.4在表中保存复杂数据256
17.5表的类型和位置257
17.5.1创建表258
17.5.2表属性的常见组合259
17.5.3表的行为260
17.6创建和初始化数据库260
17.7表查看器261
17.8进一步深入262
17.9代码清单262
第18章构造基于OTP的系统266
18.1通用的事件处理267
18.2错误日志270
18.2.1记录一个错误270
18.2.2配置错误日志270
18.2.3分析错误274
18.3警报管理275
18.4应用服务277
18.4.1素数服务277
18.4.2面积服务278
18.5监控树279
18.6启动整个系统282
18.7应用程序285
18.8文件系统的组织287
18.9应用程序监视器288
18.10进一步深入289
18.11我们如何创建素数290
第19章多核小引292
第20章多核编程294
20.1如何在多核的CPU上更有效率地运行295
20.1.1使用大量进程295
20.1.2避免副作用295
20.1.3顺序瓶颈296
20.2并行化顺序代码297
20.3小消息、大计算300
20.4映射—归并算法和磁盘索引程序303
20.4.1映射—归并算法303
20.4.2全文检索307
20.4.3索引器的操作308
20.4.4运行索引器309
20.4.5评论310
20.4.6索引器的代码310
20.5面向未来的成长311
附录A给我们的程序写文档312
附录BMicrosoft Windows环境下的Erlang环境316
附录C资源318
附录D套接字应用程序321
附录E其他335
附录F模块和函数参考351
索引415
……[看更多目录]
序言Erlang算不上是一种“大众流行”的程序设计语言,而且即使是Erlang的支持者,大多数也对于Erlang成为“主流语言”并不持乐观态度。然而,自从2006年以来,Erlang语言确实在国内外一批精英程序员中暗流涌动,光我所认识和听说的,就有不少于一打技术高手像着了魔一样迷上了这种已经有二十多年历史的老牌语言。这是一件相当奇怪的事情。因为就年龄而言,Erlang大约与Perl同年,比C++年轻四岁,长Java差不多十岁,但Java早已经是工业主流语言,C++和Perl甚至已经进入其生命周期的下降阶段。照理说,一个被扔在角落里二十多载无人理睬的老家伙合理的命运就是坐以待毙,没想到Erlang却像是突然吃了返老还童丹似的在二十多岁的“高龄”又火了一把,不但对它感兴趣的人数量激增,而且还成立了一些组织,开发实施了一些非常有影响力的软件项目。这是怎么回事呢? 。
根本原因在于Erlang天赋异禀恰好适应了计算环境变革的大趋势:CPU的多核化与云计算。
自2005年C++标准委员会主席Herb Sutter在Dr。Dobb’s Journal上发表《免费午餐已经结束》一文以来,人们已经确凿无疑地认识到,如果未来不能有效地以并行化的软件充分利用并行化的硬件资源,我们的计算效率就会永远停滞在仅仅略高于当前的水平上,而不得动弹。因此,未来的计算必然是并行的。Herb Sutter本人曾表示,如果一个语言不能够以优雅可靠的方式处理并行计算的问题,那它就失去了在21世纪的生存权。“主流语言”当然不想真的丧失掉这个生存权,于是纷纷以不同的方式解决并行计算的问题。就C/C++而言,除了标准委员会致力于以标准库的方式来提供并行计算库之外,标准化的OpenMP和MPI,以及Intel的Threading Building Blocks库也都是可信赖的解决方案,Java在5.0版中引入了意义重大的concurrency库,得到Java社区的一致推崇,而微软更是采用了多种手段来应对这一问题:先是在.NET中引入APM,随后又在Robotics Studio中提供了CCR库,最近又发布了Parrallel FX和MPI.NET,可谓不遗余力。然而,这些手法都可以视为亡羊补牢,因为这些语言和基础设施在创造时都没有把并行化的问题放到优先的位置来考虑。与它们相反,Erlang从其构思的时候起,就把“并行”放到了中心位置,其语言机制和细节的设计无不从并行角度出发和考虑,并且在长达二十年的发展完善中不断成熟。今天,Erlang可以说是为数不多的天然适应多核的可靠计算环境,这不能不说是一种历史的机缘。
文摘插图: