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
查看完整
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
查看完整
Joe Armstrong,Erlang最初的设计者和实现者,也是Erlang OTP系统项目的首席架构师。他拥有瑞典皇家理工学院博士学位,是容错系统开发领域的世界级专家。此外,他还在开发旨在替代XML的标记语言ML9。现任职于爱立信公司。
赵东炜,(Jackyz)独立软件顾问,一直专注于Web应用开发,曾负责设计和维护某大型门户网站的多个核心应用,对高并发大容量的分布式应用领域有独到见解。曾担任过软件开发工程师、系统架构师、技术经理、产品经理、创业者等多种不同的角色。闲暇时以思考技术问题为乐,从事软件行业10余年来,从最初的ASP/PHP到之后的Java/.NET以及现在的Ajax和Erlang,一直都活跃在技术的最前沿。2006年作为主要译者参与了AjaxcincAction(中译本《Ajax实战》,由人民邮电出版社出版)的翻译工作。之后为Erlang强大的并发能力所吸引,是国内学习和传播Erlang技术的第一批人,迄今已有…
查看完整
赵东炜,(Jackyz)独立软件顾问,一直专注于Web应用开发,曾负责设计和维护某大型门户网站的多个核心应用,对高并发大容量的分布式应用领域有独到见解。曾担任过软件开发工程师、系统架构师、技术经理、产品经理、创业者等多种不同的角色。闲暇时以思考技术问题为乐,从事软件行业10余年来,从最初的ASP/PHP到之后的Java/.NET以及现在的Ajax和Erlang,一直都活跃在技术的最前沿。2006年作为主要译者参与了AjaxcincAction(中译本《Ajax实战》,由人民邮电出版社出版)的翻译工作。之后为Erlang强大的并发能力所吸引,是国内学习和传播Erlang技术的第一批人,迄今已有…
查看完整
《Erlang程序设计》是讲述下一代编程语言Erlang 的权威著作,主要涵盖顺序型编程、异常处理、编译和运行代码、并发编程、并发编程中的错误处理、分布式编程、多核编程等内容。《Erlang程序设计》将帮助读者在消息传递的基础上构建分布式的并发系统,免去锁与互斥技术的羁绊,使程序在多核CPU 上高效运行。《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.2 Erlang安装 7
2.2.1 二进制发布版 7
2.2.2 从源代码创建Erlang 8
2.2.3 使用CEAN 8
2.3 本书代码 8
2.4 启动shell 9
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.4 fun 31
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.3 true断言的使用 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.10 case/if表达式 46
3.10.1 case表达式 47
3.10.2 if表达式 47
3.11 以自然顺序创建列表 48
3.12 累加器 48
第4章 异常 50
4.1 异常 50
4.2 抛出异常 51
4.3 try...catch 51
4.3.1 缩减版本 53
4.3.2 使用try...catch的编程惯例 53
4.4 catch 54
4.5 改进错误信息 55
4.6 try...catch的编程风格 55
4.6.1 经常会返回错误的程序 55
4.6.2 出错几率比较小的程序 56
4.7 捕获所有可能的异常 56
4.8 新老两种异常处理风格 56
4.9 栈跟踪 57
第5章 顺序型编程进阶 58
5.1 BIF 58
5.2 二进制数据 58
5.3 比特语法 60
5.3.1 16bit色彩的封包与解包 60
5.3.2 比特语法表达式 61
5.3.3 高级比特语法样例 62
5.4 小问题集锦 67
5.4.1 apply 68
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.8 epp 73
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 shell 83
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.1 makefile模板 90
6.4.2 定制makefile模板 92
6.5 在Erlang shell中的命令编辑 93
6.6 解决系统死锁 93
6.7 如何应对故障 93
6.7.1 未定义/遗失代码 94
6.7.2 makefile不能工作 94
6.7.3 shell没有响应 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 带超时的receive 109
8.5.1 只有超时的receive 109
8.5.2 超时时间为0的receive 109
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.2 on_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.1 lib_chan 137
10.5.2 服务器代码 138
第11章 IRC Lite 141
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.2 Lib_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.1 C程序 162
12.2.2 Erlang程序 164
12.3 open_port 167
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 使用TCP 189
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.5 UDP 200
14.5.1 最简单的UDP服务器和客户机 201
14.5.2 一个计算阶乘UDP的服务器 201
14.5.3 关于UDP协议的其他注意事项 203
14.6 向多台机器广播消息 203
14.7 SHOUTcast服务器 204
14.7.1 SHOUTcast协议 205
14.7.2 SHOUTcast服务器的工作机制 205
14.7.3 SHOUTcast服务器的伪代码 206
14.7.4 运行SHOUTcast服务器 211
14.8 进一步深入 212
第15章 ETS和DETS:大量数据的存储机制 213
15.1 表的基本操作 214
15.2 表的类型 214
15.3 ETS表的效率考虑 215
15.4 创建ETS表 216
15.5 ETS程序示例 217
15.5.1 三字索引迭代器 218
15.5.2 构造表 219
15.5.3 构造表有多快 219
15.5.4 访问表有多快 220
15.5.5 胜出的是…… 220
15.6 DETS 222
15.7 我们没有提及的部分 224
15.8 代码清单 225
第16章 OTP概述 228
16.1 通用服务器程序的进化路线 229
16.1.1 server 1:原始服务器程序 229
16.1.2 server 2:支持事务的服务器程序 230
16.1.3 server 3:支持热代码替换的服务器程序 231
16.1.4 server 4:同时支持事务和热代码替换 233
16.1.5 server 5:压轴好戏 234
16.2 gen_server起步 236
16.2.1 第一步:确定回调模块的名称 237
16.2.2 第二步:写接口函数 237
16.2.3 第三步:编写回调函数 237
16.3 gen_server回调的结构 240
16.3.1 启动服务器程序时发生了什么 240
16.3.2 调用服务器程序时发生了什么 240
16.3.3 调用和通知 241
16.3.4 发给服务器的原生消息 241
16.3.5 Hasta la Vista, Baby(服务器的终止) 242
16.3.6 热代码替换 242
16.4 代码和模板 243
16.4.1 gen_server模板 243
16.4.2 my_bank 245
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.3 Mnesia事务 252
17.3.1 取消一个事务 253
17.3.2 加载测试数据 255
17.3.3 do()函数 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
附录B Microsoft Windows环境下的Erlang环境 316
附录C 资源 318
附录D 套接字应用程序 321
附录E 其他 335
附录F 模块和函数参考 351
索引 415
^ 收 起
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.2 Erlang安装 7
2.2.1 二进制发布版 7
2.2.2 从源代码创建Erlang 8
2.2.3 使用CEAN 8
2.3 本书代码 8
2.4 启动shell 9
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.4 fun 31
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.3 true断言的使用 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.10 case/if表达式 46
3.10.1 case表达式 47
3.10.2 if表达式 47
3.11 以自然顺序创建列表 48
3.12 累加器 48
第4章 异常 50
4.1 异常 50
4.2 抛出异常 51
4.3 try...catch 51
4.3.1 缩减版本 53
4.3.2 使用try...catch的编程惯例 53
4.4 catch 54
4.5 改进错误信息 55
4.6 try...catch的编程风格 55
4.6.1 经常会返回错误的程序 55
4.6.2 出错几率比较小的程序 56
4.7 捕获所有可能的异常 56
4.8 新老两种异常处理风格 56
4.9 栈跟踪 57
第5章 顺序型编程进阶 58
5.1 BIF 58
5.2 二进制数据 58
5.3 比特语法 60
5.3.1 16bit色彩的封包与解包 60
5.3.2 比特语法表达式 61
5.3.3 高级比特语法样例 62
5.4 小问题集锦 67
5.4.1 apply 68
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.8 epp 73
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 shell 83
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.1 makefile模板 90
6.4.2 定制makefile模板 92
6.5 在Erlang shell中的命令编辑 93
6.6 解决系统死锁 93
6.7 如何应对故障 93
6.7.1 未定义/遗失代码 94
6.7.2 makefile不能工作 94
6.7.3 shell没有响应 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 带超时的receive 109
8.5.1 只有超时的receive 109
8.5.2 超时时间为0的receive 109
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.2 on_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.1 lib_chan 137
10.5.2 服务器代码 138
第11章 IRC Lite 141
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.2 Lib_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.1 C程序 162
12.2.2 Erlang程序 164
12.3 open_port 167
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 使用TCP 189
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.5 UDP 200
14.5.1 最简单的UDP服务器和客户机 201
14.5.2 一个计算阶乘UDP的服务器 201
14.5.3 关于UDP协议的其他注意事项 203
14.6 向多台机器广播消息 203
14.7 SHOUTcast服务器 204
14.7.1 SHOUTcast协议 205
14.7.2 SHOUTcast服务器的工作机制 205
14.7.3 SHOUTcast服务器的伪代码 206
14.7.4 运行SHOUTcast服务器 211
14.8 进一步深入 212
第15章 ETS和DETS:大量数据的存储机制 213
15.1 表的基本操作 214
15.2 表的类型 214
15.3 ETS表的效率考虑 215
15.4 创建ETS表 216
15.5 ETS程序示例 217
15.5.1 三字索引迭代器 218
15.5.2 构造表 219
15.5.3 构造表有多快 219
15.5.4 访问表有多快 220
15.5.5 胜出的是…… 220
15.6 DETS 222
15.7 我们没有提及的部分 224
15.8 代码清单 225
第16章 OTP概述 228
16.1 通用服务器程序的进化路线 229
16.1.1 server 1:原始服务器程序 229
16.1.2 server 2:支持事务的服务器程序 230
16.1.3 server 3:支持热代码替换的服务器程序 231
16.1.4 server 4:同时支持事务和热代码替换 233
16.1.5 server 5:压轴好戏 234
16.2 gen_server起步 236
16.2.1 第一步:确定回调模块的名称 237
16.2.2 第二步:写接口函数 237
16.2.3 第三步:编写回调函数 237
16.3 gen_server回调的结构 240
16.3.1 启动服务器程序时发生了什么 240
16.3.2 调用服务器程序时发生了什么 240
16.3.3 调用和通知 241
16.3.4 发给服务器的原生消息 241
16.3.5 Hasta la Vista, Baby(服务器的终止) 242
16.3.6 热代码替换 242
16.4 代码和模板 243
16.4.1 gen_server模板 243
16.4.2 my_bank 245
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.3 Mnesia事务 252
17.3.1 取消一个事务 253
17.3.2 加载测试数据 255
17.3.3 do()函数 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
附录B Microsoft Windows环境下的Erlang环境 316
附录C 资源 318
附录D 套接字应用程序 321
附录E 其他 335
附录F 模块和函数参考 351
索引 415
^ 收 起
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等前卫的编程理念。
^ 收 起
赵东炜,(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程序设计》是讲述下一代编程语言Erlang 的权威著作,主要涵盖顺序型编程、异常处理、编译和运行代码、并发编程、并发编程中的错误处理、分布式编程、多核编程等内容。《Erlang程序设计》将帮助读者在消息传递的基础上构建分布式的并发系统,免去锁与互斥技术的羁绊,使程序在多核CPU 上高效运行。《Erlang程序设计》讲述的各种设计方法和行为将成为设计容错与分布式系统中的利器。
比价列表
1人想要1人拥有
公众号、微信群
缺书网
微信公众号
微信公众号
扫码进群
实时获取购书优惠
实时获取购书优惠