《Erlang程序设计(第2版)》

《Erlang程序设计(第2版)

基本信息

作者: (瑞典)Joe Armstrong

译者: 牛化成

丛书名: 图灵程序设计丛书

出版社:人民邮电出版社

ISBN:9787115354570

上架时间:2014-5-27

出版日期:2014 年6月

开本:16开

页码:428

版次:2-1

所属分类:计算机 > 软件与程序设计 > 综合 > 高级程序语言设计

更多关于》》》《Erlang程序设计(第2版)》

编辑推荐

在多核、并发、分布为王的时代,谁将成为下一个主流编程语言?来自全世界的众多专家都认为,Erlang最有可能在竞争中胜出。

  Erlang开源语言系出名门,通信巨头爱立信公司用它开发出了可靠性惊人的交换机系统AXD301。它天生就是面向并发、分布和高容错的,兼有函数式语言和脚本语言的各种优点,而且已经用于商业开发多年,具有稳定性极高的虚拟机和平台库。有了这些天时地利,无怪乎Erlang能够迅速成为热门的开发语言,除了广泛应用于通信行业之外,它已经进入了各个领域:Facebook用它实现了聊天系统,Yahoo用它重写了Delicious,Amazon用它开发了云计算数据服务SimpleDB,还有多人游戏、测试工具、电子支付、数据采集与监控、企业消息、电子邮件、空中交通管制……

内容简介

书籍

计算机书籍

《erlang程序设计(第2版)》由erlang 之父joe armstrong 编写,是毋庸置疑的经典著作。书中兼顾了顺序编程、并发编程和分布式编程,深入讨论了开发erlang 应用中至关重要的文件和网络编程、otp、ets 和dets 等主题。新版针对入门级程序员增加了相关内容。

《erlang程序设计(第2版)》适合erlang 初学者和中级水平erlang 程序员学习参考。

 

媒体评论

  “Erlang是目前唯一成熟可靠的能够开发高扩展性并发软件系统的语言,它将成为下一个Java。”

  ——Ralph Johnson,软件开发大师,《设计模式》作者之一

  “Joe的《Erlang程序设计》一书影响巨大。第2版做了重要更新,万众期待,不但涵盖核心语言和框架的基本内容,还涉及rebar和cowboy这样的关键社区项目。有经验的Erlang程序员也能在书里找到各种有用的提示和新见解,初学者则会喜欢Joe在介绍和阐释关键语言概念时所使用的清楚和有条理的方式。”

  ——Alexander Gounares,AOL前CTO,比尔·盖茨的顾问,Concurix公司的创始人兼CEO

  “一部佳作。对函数式编程的介绍理性且实用。”

  ——Gilad Bracha,Java语言和Java虚拟机规范的共同作者,Newspeak语言的创造者,Dart语言团队成员

  “本书是理解如何进行Actor编程的优秀资源,不仅适用于Erlang开发人员,还适用于那些想要理解Actor为何如此重要,以及为何它们是构建反应式、可扩展、可恢复和事件驱动型系统的重要工具的程序员。”

  ——Jonas Boner,Akka项目和AspectWerkz面向方面编程框架创立者,Typesafe联合创始人兼CTO

  “Erlang让我有醍醐灌顶之感,它促使我开始以完全不同的方式思考问题,Armstrong能够亲自写作本书,实乃Erlang爱好者之福。”

  ——David Thomas,软件开发大师,《程序员修炼之道》作者

  

目录

《erlang程序设计(第2版)》

第一部分 为何用erlang

第1章 什么是并发  2

1.1  给并发建模  2

1.1.1  开始模拟  3

1.1.2  发送消息  4

1.1.3  接收消息  4

1.2  并发的益处  4

1.3  并发程序和并行计算机  5

1.4  顺序和并发编程语言  6

1.5  小结  6

第2章 erlang速览  7

2.1  shell  7

2.1.1  =操作符  8

2.1.2  变量和原子的语法  8

2.2  进程、模块和编译  9

2.2.1  在shell里编译并运行hello world  9

2.2.2  在erlang shell外编译  9

2.3  你好,并发  10

2.3.1  文件服务器进程  10

2.3.2  客户端代码  13

2.3.3  改进文件服务器  14

2.4  练习  14

第二部分 顺序编程

第3章 基本概念  16

3.1  启动和停止erlang shell  16

3.1.1  在shell里执行命令  17

3.1.2  可能出错的地方  17

3.1.3  在erlang shell里编辑命令  18

3.2  简单的整数运算  18

3.3  变量  19

3.3.1  erlang的变量不会变  20

3.3.2  变量绑定和模式匹配  20

3.3.3  为什么一次性赋值让程序变得更好  21

3.4  浮点数  22

3.5  原子  22

3.6  元组  23

3.6.1  创建元组  24

3.6.2  提取元组的值  25

3.7  列表  26

3.7.1  专用术语  26

3.7.2  定义列表  27

3.7.3  提取列表元素  27

3.8  字符串  27

3.9  模式匹配再探  29

3.10  练习  30

第4章 模块与函数  31

4.1  模块是存放代码的地方  31

4.1.1  常见错误  33

4.1.2  目录和代码路径  33

4.1.3  给代码添加测试  33

4.1.4  扩展程序  34

4.1.5  分号放哪里  36

4.2  继续购物  36

4.3  fun:基本的抽象单元  39

4.3.1  以fun作为参数的函数  40

4.3.2  返回fun的函数  41

4.3.3  定义你自己的控制抽象  42

4.4  简单列表处理  42

4.5  列表推导  45

4.5.1  quicksort  46

4.5.2  毕达哥拉斯三元数组  47

4.5.3  回文构词  48

4.6  内置函数  48

4.7  关卡  49

4.7.1  关卡序列  49

4.7.2  关卡示例  50

4.7.3  true关卡的作用  51

4.8  case和if表达式  52

4.8.1  case表达式  52

4.8.2  if表达式  53

4.9  构建自然顺序的列表  54

4.10  归集器  55

4.11  练习  56

第5章 记录与映射组  57

5.1  何时使用映射组或记录  57

5.2  通过记录命名元组里的项  58

5.2.1  创建和更新记录  59

5.2.2  提取记录字段  59

5.2.3  在函数里模式匹配记录  59

5.2.4  记录是元组的另一种形式  60

5.3  映射组:关联式键?值存储  60

5.3.1  映射组语法  60

5.3.2  模式匹配映射组字段  62

5.3.3  操作映射组的内置函数  63

5.3.4  映射组排序  64

5.3.5  以json为桥梁  64

5.4  练习  66

第6章 顺序程序的错误处理  67

6.1  处理顺序代码里的错误  67

6.2  用try...catch捕捉异常错误  69

6.2.1  try...catch具有一个值  69

6.2.2  简写法  70

6.2.3  try...catch编程样例  71

6.3  用catch捕捉异常错误  72

6.4  针对异常错误的编程样式  72

6.4.1  改进错误消息  72

6.4.2  经常返回错误时的代码  73

6.4.3  错误可能有但罕见时的代码  73

6.4.4  捕捉一切可能的异常错误  74

6.5  栈跟踪  74

6.6  抛错要快而明显,也要文明  75

6.7  练习  75

第7章 二进制型与位语法  76

7.1  二进制型  76

7.2  位语法  78

7.2.1  打包和解包16位颜色  78

7.2.2  位语法表达式  79

7.2.3  位语法的真实例子  81

7.3  位串:处理位级数据  85

7.4  练习  87

第8章 erlang顺序编程补遗  88

8.1  apply  89

8.2  算术表达式  90

8.3  元数  91

8.4  属性  91

8.4.1  预定义的模块属性  91

8.4.2  用户定义的模块属性  93

8.5  块表达式  94

8.6  布尔值  94

8.7  布尔表达式  95

8.8  字符集  95

8.9  注释  95

8.10  动态代码载入  96

8.11  erlang的预处理器  99

8.12  转义序列  99

8.13  表达式和表达式序列  100

8.14  函数引用  101

8.15  包含文件  101

8.16  列表操作:++和--  102

8.17  宏  102

8.18  模式的匹配操作符  104

8.19  数字  105

8.19.1  整数  105

8.19.2  浮点数  105

8.20  操作符优先级  106

8.21  进程字典  106

8.22  引用  108

8.23  短路布尔表达式  108

8.24  比较数据类型  108

8.25  元组模块  109

8.26  下划线变量  109

8.27  练习  110

第9章 类型  111

9.1  指定数据和函数类型  111

9.2  erlang的类型表示法  113

9.2.1  类型的语法  113

9.2.2  预定义类型  114

9.2.3  指定函数的输入输出类型  114

9.2.4  导出类型和本地类型  116

9.2.5  不透明类型  116

9.3  dialyzer教程  117

9.3.1  错误使用内置函数的返回值  118

9.3.2  内置函数的错误参数  119

9.3.3  错误的程序逻辑  119

9.3.4  使用dialyzer  120

9.3.5  干扰dialyzer的事物  120

9.4  类型推断与成功分型  121

9.5  类型系统的局限性  123

9.6  练习  125

第10章 编译和运行程序  126

10.1  改变开发环境  126

10.1.1  设置载入代码的搜索路径  126

10.1.2  在系统启动时执行一组命令  127

10.2  运行程序的不同方式  128

10.2.1  在erlang shell里编译和运行  128

10.2.2  在命令提示符界面里编译和运行  129

10.2.3  作为escript运行  130

10.2.4  带命令行参数的程序  131

10.3  用makefile使编译自动化  132

10.4  当坏事发生  135

10.4.1  停止erlang  135

10.4.2  未定义(缺失)的代码  135

10.4.3  shell没有反应  136

10.4.4  我的makefile不工作  137

10.4.5  erlang崩溃而你想阅读故障转储文件  137

10.5  获取帮助  138

10.6  调节运行环境  138

10.7  练习  139

第三部分 并发和分布式程序

第11章 现实世界中的并发  142

第12章 并发编程  145

12.1  基本并发函数  145

12.2  客户端?服务器介绍  147

12.3  进程很轻巧  151

12.4  带超时的接收  153

12.4.1  只带超时的接收  154

12.4.2  超时值为0的接收  154

12.4.3  超时值为无穷大的接收  155

12.4.4  实现一个定时器  155

12.5  选择性接收  156

12.6  注册进程  157

12.7  关于尾递归的说明  158

12.8  用mfa或fun进行分裂  160

12.9  练习  160

第13章 并发程序中的错误  161

13.1  错误处理的理念  161

13.1.1  让其他进程修复错误  162

13.1.2  任其崩溃  162

13.1.3  为何要崩溃  162

13.2  错误处理的术语含义  163

13.3  创建连接  164

13.4  同步终止的进程组  164

13.5  设立防火墙  165

13.6  监视  166

13.7  基本错误处理函数  166

13.8  容错式编程  167

13.8.1  在进程终止时执行操作  167

13.8.2  让一组进程共同终止  168

13.8.3  生成一个永不终止的进程  169

13.9  练习  170

第14章 分布式编程  171

14.1  两种分布式模型  171

14.2  编写一个分布式程序  172

14.3  创建名称服务器  173

14.3.1  第1阶段:一个简单的名称服务器  173

14.3.2  第2阶段:客户端在一个节点,服务器在相同主机的另一个节点  174

14.3.3  第3阶段:同一局域网内不同机器上的客户端和服务器  175

14.3.4  第4阶段:跨互联网不同主机上的客户端和服务器  176

14.4  分布式编程的库和内置函数  177

14.4.1  远程分裂示例  178

14.4.2  文件服务器再探  180

14.5  cookie保护系统  181

14.6  基于套接字的分布式模型  182

14.6.1  用lib_chan控制进程  182

14.6.2  服务器代码  183

14.7  练习  185

第四部分 编程库与框架

第15章 接口技术  188

15.1  erlang如何与外部程序通信  188

15.2  用端口建立外部c程序接口  190

15.2.1  c程序  191

15.2.2  erlang程序  193

15.2.3  编译和链接端口程序  195

15.2.4  运行程序  195

15.3  在erlang里调用shell脚本  196

15.4  高级接口技术  196

15.5  练习  197

第16章 文件编程  198

16.1  操作文件的模块  198

16.2  读取文件的几种方法  199

16.2.1  读取文件里的所有数据类型  199

16.2.2  分次读取文件里的数据类型  200

16.2.3  分次读取文件里的行  202

16.2.4  读取整个文件到二进制型中  202

16.2.5  通过随机访问读取文件  203

16.3  写入文件的各种方式  205

16.3.1  把数据列表写入文件  206

16.3.2  把各行写入文件  207

16.3.3  一次性写入整个文件  207

16.3.4  写入随机访问文件  209

16.4  目录和文件操作  209

16.4.1  查找文件信息  210

16.4.2  复制和删除文件  211

16.5  其他信息  211

16.6  一个查找工具函数  212

16.7  练习  214

第17章 套接字编程  216

17.1  使用tcp  216

17.1.1  从服务器获取数据  216

17.1.2  一个简单的tcp服务器  219

17.1.3  顺序和并行服务器  222

17.1.4  注意事项  223

17.2  主动和被动套接字  224

17.2.1  主动消息接收(非阻塞式)  224

17.2.2  被动消息接收(阻塞式)  225

17.2.3  混合消息接收(部分阻塞式)  225

17.3  套接字错误处理  226

17.4  udp  227

17.4.1  最简单的udp服务器与客户端  227

17.4.2  一个udp阶乘服务器  228

17.4.3  udp数据包须知  230

17.5  对多台机器广播  230

17.6  一个shoutcast服务器  231

17.6.1  shoutcast协议  232

17.6.2  shoutcast服务器的工作原理  232

17.6.3  shoutcast服务器的伪代码  233

17.6.4  运行shoutcast服务器  234

17.7  练习  235

第18章 用websocket和erlang 进行浏览  236

18.1  创建一个数字时钟  237

18.2  基本交互  239

18.3  浏览器里的erlang shell  240

18.4  创建一个聊天小部件  241

18.5  简化版irc  244

18.6  浏览器里的图形  247

18.7  浏览器?服务器协议  249

18.7.1  从erlang发送消息到浏览器  249

18.7.2  从浏览器到erlang的消息  250

18.8  练习  251

第19章 用ets和dets存储数据  252

19.1  表的类型  252

19.2  影响ets表效率的因素  254

19.3  创建一个ets表  255

19.4  ets示例程序  255

19.4.1  三字母组合迭代函数  256

19.4.2  创建一些表  257

19.4.3  创建表所需的时间  258

19.4.4  访问表所需的时间  258

19.4.5  获胜者是……   259

19.5  保存元组到磁盘  260

19.6  其余操作  262

19.7  练习  263

第20章 mnesia:erlang数据库  264

20.1  创建初始数据库  264

20.2  数据库查询  265

20.2.1  选择表里的所有数据  266

20.2.2  从表里选择数据  267

20.2.3  从表里有条件选择数据  268

20.2.4  从两个表里选择数据(联接)  268

20.3  添加和移除数据库里的数据  269

20.3.1  添加行  269

20.3.2  移除行  270

20.4  mnesia事务  270

20.4.1  中止事务  271

20.4.2  载入测试数据  273

20.4.3  do()函数  273

20.5  在表里保存复杂数据  274

20.6  表的类型和位置  275

20.6.1  创建表  276

20.6.2  常用的表属性组合  277

20.6.3  表的行为  278

20.7  表查看器  278

20.8  深入挖掘  279

20.9  练习  279

第21章 性能分析、调试与跟踪  280

21.1  erlang代码的性能分析工具  281

21.2  测试代码覆盖  281

21.3  生成交叉引用  283

21.4  编译器诊断信息  283

21.4.1  头部不匹配  284

21.4.2  未绑定变量  284

21.4.3  未结束字符串  284

21.4.4  不安全变量  284

21.4.5  影子变量  285

21.5  运行时诊断  286

21.6  调试方法  287

21.6.1  io:format调试  288

21.6.2  转储至文件  289

21.6.3  使用错误记录器  289

21.7  erlang调试器  289

21.8  跟踪消息与进程执行  291

21.9  erlang代码的测试框架  294

21.10  练习  295

第22章 otp介绍  296

22.1  通用服务器之路  297

22.1.1  server 1:基本的服务器  297

22.1.2  server 2:实现事务的服务器  298

22.1.3  server 3:实现热代码交换的服务器  299

22.1.4  server 4:事务与热代码交换  301

22.1.5  server 5:更多乐趣  302

22.2  gen_server入门  304

22.2.1  确定回调模块名  304

22.2.2  编写接口方法  305

22.2.3  编写回调方法  305

22.3  gen_server的回调结构  308

22.3.1  启动服务器  308

22.3.2  调用服务器  308

22.3.3  调用和播发  309

22.3.4  发给服务器的自发性消息  310

22.3.5  后会有期,宝贝  310

22.3.6  代码更改  311

22.4  填写gen_server模板  311

22.5  深入探索  313

22.6  练习  313

第23章 用otp构建系统  315

23.1  通用事件处理  316

23.2  错误记录器  318

23.2.1  记录错误  318

23.2.2  配置错误记录器  319

23.2.3  分析错误  323

23.3  警报管理  324

23.4  应用程序服务器  326

23.4.1  质数服务器  326

23.4.2  面积服务器  327

23.5  监控树  328

23.6  启动系统  331

23.7  应用程序  335

23.8  文件系统组织方式  336

23.9  应用程序监视器  337

23.10  怎样计算质数  338

23.11  深入探索  340

23.12  练习  341

第五部分 构建应用程序

第24章 编程术语  344

24.1  保持erlang世界观  344

24.2  多用途服务器  346

24.3  有状态的模块  348

24.4  适配器变量  349

24.5  表意编程  351

24.6  练习  353

第25章 第三方程序  354

25.1  制作可共享代码存档并用rebar管理代码  354

25.1.1  安装rebar  354

25.1.2  在github上创建一个新项目  355

25.1.3  在本地克隆这个项目  355

25.1.4  制作一个otp应用程序  356

25.1.5  宣传你的项目  356

25.2  整合外部程序与我们的代码  357

25.3  生成依赖项本地副本  358

25.4  用cowboy构建嵌入式web服务器  359

25.5  练习  364

第26章 多核cpu编程  366

26.1  给erlang程序员的好消息  367

26.2  如何在多核cpu中使程序高效运行  367

26.2.1  使用大量进程  368

26.2.2  避免副作用  368

26.2.3  避免顺序瓶颈  369

26.3  让顺序代码并行  370

26.4  小消息,大计算  372

26.5  用mapreduce使计算并行化  376

26.6  练习  380

第27章 福尔摩斯的最后一案  381

27.1  找出数据的相似度  381

27.2  sherlock演示  382

27.2.1  获取并预处理数据  382

27.2.2  寻找最像给定文件的邮件  383

27.2.3  搜索指定作者、日期或标题的邮件  385

27.3  数据分区的重要性  386

27.4  给邮件添加关键词  386

27.4.1  词汇的重要性:tf*idf权重  387

27.4.2  余弦相似度:两个权重向量的相似程度  388

27.4.3  相似度查询  389

27.5  实现方式概览  389

27.6  练习  390

27.7  总结  391

附录a  otp模板  392

附录b  一个套接字应用程序  398

附录c  一种简单的执行环境  413

本图书信息来源:互动出版网

《Erlang程序设计(第2版)》

时间: 2024-11-05 11:00:33

《Erlang程序设计(第2版)》的相关文章

CI框架源码阅读笔记3 全局函数Common.php

从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap引导文件都会最先引入全局函数,以便于之后的处理工作). 打开Common.php中,第一行代码就非常诡异: if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 上一篇(CI框架源码阅读笔记2 一切的入口 index

IOS测试框架之:athrun的InstrumentDriver源码阅读笔记

athrun的InstrumentDriver源码阅读笔记 作者:唯一 athrun是淘宝的开源测试项目,InstrumentDriver是ios端的实现,之前在公司项目中用过这个框架,没有深入了解,现在回来记录下. 官方介绍:http://code.taobao.org/p/athrun/wiki/instrumentDriver/ 优点:这个框架是对UIAutomation的java实现,在代码提示.用例维护方面比UIAutomation强多了,借junit4的光,我们可以通过junit4的

Yii源码阅读笔记 - 日志组件

?使用 Yii框架为开发者提供两个静态方法进行日志记录: Yii::log($message, $level, $category);Yii::trace($message, $category); 两者的区别在于后者依赖于应用开启调试模式,即定义常量YII_DEBUG: defined('YII_DEBUG') or define('YII_DEBUG', true); Yii::log方法的调用需要指定message的level和category.category是格式为“xxx.yyy.z

源码阅读笔记 - 1 MSVC2015中的std::sort

大约寒假开始的时候我就已经把std::sort的源码阅读完毕并理解其中的做法了,到了寒假结尾,姑且把它写出来 这是我的第一篇源码阅读笔记,以后会发更多的,包括算法和库实现,源码会按照我自己的代码风格格式化,去掉或者展开用于条件编译或者debug检查的宏,依重要程度重新排序函数,但是不会改变命名方式(虽然MSVC的STL命名实在是我不能接受的那种),对于代码块的解释会在代码块前(上面)用注释标明. template<class _RanIt, class _Diff, class _Pr> in

CI框架源码阅读笔记5 基准测试 BenchMark.php

上一篇博客(CI框架源码阅读笔记4 引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的.这些组件类似于一个一个单独的模块,不同的模块完成不同的功能,各模块之间可以相互调用,共同构成了CI的核心骨架. 从本篇开始,将进一步去分析各组件的实现细节,深入CI核心的黑盒内部(研究之后,其实就应该是白盒了,仅仅对于应用来说,它应该算是黑盒),从而更好的去认识.把握这个框架. 按照惯例,在开始之前,我们贴上CI中不完全的核心组件图: 由于BenchMa

CI框架源码阅读笔记2 一切的入口 index.php

上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里这次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中,我们并不会逐行进行解释,而只解释核心的功能和实现. 1.       设置应用程序环境 define('ENVIRONMENT', 'development'); 这里的development可以是任何你喜欢的环境名称(比如dev,再如test),相对应的,你要在下面的switch case代码块中

Apache Storm源码阅读笔记

欢迎转载,转载请注明出处. 楔子 自从建了Spark交流的QQ群之后,热情加入的同学不少,大家不仅对Spark很热衷对于Storm也是充满好奇.大家都提到一个问题就是有关storm内部实现机理的资料比较少,理解起来非常费劲. 尽管自己也陆续对storm的源码走读发表了一些博文,当时写的时候比较匆忙,有时候衔接的不是太好,此番做了一些整理,主要是针对TridentTopology部分,修改过的内容采用pdf格式发布,方便打印. 文章中有些内容的理解得益于徐明明和fxjwind两位的指点,非常感谢.

CI框架源码阅读笔记4 引导文件CodeIgniter.php

到了这里,终于进入CI框架的核心了.既然是"引导"文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http://you.host.com/usr/reg 经过引导文件,实际上会交给Application中的UsrController控制器的reg方法去处理. 这之中,CodeIgniter.php做了哪些工作?我们一步步来看. 1.    导入预定义常量.框架环境初始化 之前的一篇博客(CI框架源码阅读笔记2 一切的入

jdk源码阅读笔记之java集合框架(二)(ArrayList)

关于ArrayList的分析,会从且仅从其添加(add)与删除(remove)方法入手. ArrayList类定义: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Monaco } span.s1 { color: #931a68 } public class ArrayList<E> extends AbstractList<E> implements List<E> ArrayList基本属性: /** *

dubbo源码阅读笔记--服务调用时序

上接dubbo源码阅读笔记--暴露服务时序,继续梳理服务调用时序,下图右面红线流程. 整理了调用时序图 分为3步,connect,decode,invoke. 连接 AllChannelHandler.connected(Channel) line: 38 HeartbeatHandler.connected(Channel) line: 47 MultiMessageHandler(AbstractChannelHandlerDelegate).connected(Channel) line: