【插图】
编辑推荐
20年后、100年后的编程语言会是什么样?
Ruby之父剖析云计算、大数据时代下的技术
Lisp会是未来的发展趋势吗?
Go和Dart能取代C和JavaScript吗?
关系型数据库已经走到穷途末路了吗?
内容简介
书籍 计算机书籍
《代码的未来》是Ruby 之父松本行弘的又一力作。作者对云计算、大数据时代下的各种编程语言以及相关技术进行了剖析,并对编程语言的未来发展趋势做出预测,内容涉及Go、VoltDB、node.js、CoffeeScript、Dart、MongoDB、摩尔定律、编程语言、多核、NoSQL 等当今备受关注的话题。
《代码的未来》面向各层次程序设计人员和编程爱好者,也可供相关技术人员参考。
作译者
松本行弘(Yukihiro Matsumoto),Ruby语言发明者,亦是亚洲首屈一指的编程语言发明者。现兼任网络应用通信研究所(NaCl)研究员、乐天技术研究所研究员、Heroku首席架构师等。昵称"Matz"。讨厌东京,喜欢温泉。
周自恒,IT、编程爱好者,技术宅,初中时曾在NOI(国家信息学奥赛)天津赛区获一等奖,大学毕业后曾任IT咨询顾问,精通英语和日语,译著有《30天自制操作系统》、《大数据的冲击》、《Android应用开发入门》。
目录
《代码的未来》
第一章 编程的时间和空间
1.1 编程的本质 3
编程的本质是思考 4
创造世界的乐趣 4
快速提高的性能改变了社会 5
以不变应万变 8
摩尔定律的局限 9
社会变化与编程 10
1.2 未来预测 13
科学的未来预测 14
IT 未来预测 14
极限未来预测 16
从价格看未来 16
从性能看未来 17
从容量看未来 18
从带宽看未来 19
小结 20
第二章 编程语言的过去、现在和未来
2.1 编程语言的世界 23
被历史埋没的先驱 25
编程语言的历史 26
编程语言的进化方向 30
未来的编程语言 32
20 年后的编程语言 34
学生们的想象 34
2.2 DSL(特定领域语言) 36
外部DSL 37
内部DSL 38
DSL 的优势 39
DSL 的定义 39
适合内部DSL 的语言 40
外部DSL 实例 42
DSL 设计的构成要素 43
Sinatra 46
小结 47
2.3 元编程 48
Meta, Reflection 48
类对象 51
类的操作 52
Lisp 53
数据和程序 54
Lisp 程序 56
宏 56
宏的功与过 57
元编程的可能性与危险性 59
小结 60
2.4 内存管理 61
看似无限的内存 61
GC 的三种基本方式 62
术语定义 62
标记清除方式 63
复制收集方式 64
引用计数方式 65
引用计数方式的缺点 65
进一步改良的应用方式 66
分代回收 66
对来自老生代的引用进行记录 67
增量回收 68
并行回收 69
GC 大统一理论 69
2.5 异常处理 71
“一定没问题的” 71
用特殊返回值表示错误 72
容易忽略错误处理 72
Ruby 中的异常处理 73
产生异常 74
更高级的异常处理 75
Ruby 中的后处理保证 76
其他语言中的异常处理 77
Java 的检查型异常 77
Icon 的异常和真假值 78
Eiffel 的Design by Contract 80
异常与错误值 80
小结 81
2.6 闭包 82
函数对象 82
高阶函数 83
用函数参数提高通用性 84
函数指针的局限 85
作用域:变量可见范围 87
生存周期:变量的存在范围 88
闭包与面向对象 89
Ruby 的函数对象 89
Ruby 与JavaScript 的区别 90
Lisp-1 与Lisp-2 91
第三章 编程语言的新潮流
3.1 语言的设计 97
客户端与服务器端 97
向服务器端华丽转身 98
在服务器端获得成功的四大理由 99
客户端的JavaScript 100
性能显著提升 101
服务器端的Ruby 102
Ruby on Rails 带来的飞跃 102
服务器端的Go 103
静态与动态 104
动态运行模式 105
何谓类型 105
静态类型的优点 106
动态类型的优点 106
有鸭子样的就是鸭子 107
Structural Subtyping 108
小结 108
3.2 Go 109
New(新的) 109
Experimental(实验性的) 109
Concurrent(并发的) 110
Garbage-collected(带垃圾回收的) 110
Systems(系统) 111
Go 的创造者们 111
Hello World 112
Go 的控制结构 113
类型声明 116
无继承式面向对象 118
多值与多重赋值 120
并发编程 122
小结 124
3.3 Dart 126
为什么要推出Dart ? 126
Dart 的设计目标 129
代码示例 130
Dart 的特征 132
基于类的对象系统 132
非强制性静态类型 133
Dart 的未来 134
3.4 CoffeeScript 135
最普及的语言 135
被误解最多的语言 135
显著高速化的语言 136
对JavaScript 的不满 138
CoffeeScript 138
安装方法 139
声明和作用域 139
分号和代码块 141
省略记法 142
字符串 143
数组和循环 143
类 145
小结 146
3.5 Lua 148
示例程序 149
数据类型 149
函数 150
表 150
元表 151
方法调用的实现 153
基于原型编程 155
和Ruby 的比较(语言篇) 157
嵌入式语言Lua 157
和Ruby 的比较(实现篇) 158
嵌入式Ruby 159
第四章 云计算时代的编程
4.1 可扩展性 163
信息的尺度感 163
大量数据的查找 164
二分法查找 165
散列表 167
布隆过滤器 169
一台计算机的极限 170
DHT(分布式散列表) 171
Roma 172
MapReduce 173
小结 174
4.2 C10K 问题 175
何为C10K 问题 175
C10K 问题所引发的“想当然” 177
使用epoll 功能 180
使用libev 框架 181
使用EventMachine 183
小结 185
4.3 HashFold 186
HashFold 库的实现(Level 1) 187
运用多核的必要性 190
目前的Ruby 实现所存在的问题 191
通过进程来实现HashFold(Level 2) 191
抖动 193
运用进程池的HashFold(Level 3) 194
小结 197
4.4 进程间通信 198
进程与线程 198
同一台计算机上的进程间通信 199
TCP IP 协议 201
用C 语言进行套接字编程 202
用Ruby 进行套接字编程 204
Ruby 的套接字功能 205
用Ruby 实现网络服务器 208
小结 209
4.5 Rack 与Unicorn 210
Rack 中间件 211
应用程序服务器的问题 212
Unicorn 的架构 215
Unicorn 的解决方案 215
性能 219
策略 220
小结 221
第五章 支撑大数据的数据存储技术
5.1 键- 值存储 225
Hash 类 225
DBM 类 226
数据库的ACID 特性 226
CAP 原理 227
CAP 解决方案——BASE 228
不能舍弃可用性 229
大规模环境下的键- 值存储 230
访问键- 值存储 230
键- 值存储的节点处理 231
存储器 232
写入和读取 233
节点追加 233
故障应对 233
终止处理 235
其他机制 235
性能与应用实例 236
小结 236
5.2 NoSQL 237
RDB 的极限 237
NoSQL 数据库的解决方案 238
形形色色的NoSQL 数据库 239
面向文档数据库 240
MongoDB 的安装 241
启动数据库服务器 243
MongoDB 的数据库结构 244
数据的插入和查询 244
用JavaScript 进行查询 245
高级查询 246
数据的更新和删除 249
乐观并发控制 250
5.3 用Ruby 来操作MongoDB 251
使用Ruby 驱动 251
对数据库进行操作 253
数据的插入 253
数据的查询 253
高级查询 254
find 方法的选项 256
原子操作 257
ActiveRecord 259
OD Mapper 260
5.4 SQL 数据库的反击 264
“云”的定义 264
SQL 数据库的极限 264
存储引擎Spider 265
SQL 数据库之父的反驳 265
SQL 数据库VoltDB 268
VoltDB 的架构 269
VoltDB 中的编程 270
Hello VoltDB! 271
性能测试 273
小结 275
5.5 memcached 和它的伙伴们 276
用于高速访问的缓存 276
memcached 277
示例程序 278
对memcached 的不满 279
memcached 替代服务器 280
另一种键- 值存储Redis 282
Redis 的数据类型 284
Redis 的命令与示例 285
小结 289
第六章 多核时代的编程
6.1 摩尔定律 293
呈几何级数增长 293
摩尔定律的内涵 294
摩尔定律的结果 295
摩尔定律所带来的可能性 296
为了提高性能 297
摩尔定律的极限 302
超越极限 303
不再有免费的午餐 304
6.2 UNIX 管道 305
管道编程 306
多核时代的管道 308
xargs——另一种运用核心的方式 309
注意瓶颈 311
阿姆达尔定律 311
多核编译 312
ccache 313
distcc 313
编译性能测试 314
小结 315
6.3 非阻塞I/O 316
何为非阻塞I O 316
使用read(2) 的方法 317
边沿触发与电平触发 319
使用read(2) + select 的方法 319
使用read+O_NONBLOCK 标志 321
Ruby 的非阻塞I O 322
使用aio_read 的方法 323
6.4 node.js 330
减负 330
拖延 331
委派 332
非阻塞编程 333
node.js 框架 333
事件驱动编程 334
事件循环的利弊 335
node.js 编程 335
node.js 网络编程 337
node.js 回调风格 339
node.js 的优越性 340
EventMachine 与Rev 341
6.5 ZeroMQ 342
多CPU 的必要性 342
阿姆达尔定律 343
多CPU 的运用方法 343
进程间通信 345
管道 345
SysV IPC 346
套接字 347
UNIX 套接字 349
ZeroMQ 349
ZeroMQ 的连接模型 350
ZeroMQ 的安装 352
ZeroMQ 示例程序 352
小结 354
版权声明 356
译者序
依靠其简洁、优雅的语言特色,以及Rails等开发框架的成功,Ruby在Web开发领域早已成为一种人气颇高的动态脚本语言。然而,当今世界上流行的编程语言中,只有Ruby来自亚洲,作为Ruby语言的发明者,松本行弘(Matz)表示自己常因此而感到孤独。
作为这本书的译者,2012年11月借中国Ruby大会的机会,我有幸以图灵特派记者的身份对Matz进行了一次专访。穿着UNIQLO的格子衬衫,充满技术宅范儿的Matz,平时看起来不苟言笑,谈起技术话题来就好像打开了话匣子一般滔滔不绝,在Twitter上的发言也相当活跃。在访谈中,Matz谈到了Ruby的发展方向,他希望Ruby能够在Web开发之外的领域(科学计算、高性能计算和嵌入式系统)有更多的发展,同时他也希望中国的程序员们能够积极为开源社区做出贡献,努力成为能够影响世界的工程师。
Matz一直称自己是一个普通的程序员,创造Ruby只不过是他编程生涯中的一小部分。无论是以“资深UNIX程序员”的身份,还是“Ruby之父”的身份,Matz都有足够的资格对现今的编程语言和技术品头论足;另一方面,计算机技术的发展可谓日新月异,Matz认为有必要从过去到未来,以发展的眼光来看待这些技术的演进。用资深程序员的视角和发展的眼光来剖析技术,这就是Matz笔下的《代码的未来》。
在这本书中,Matz将和大家一起探讨丰富多彩的技术话题,并对编程语言的未来发展趋势做出自己的预测。像Lisp这样拥有最简核心的函数型语言真的会是未来的发展趋势吗?垃圾回收、闭包、高阶函数、元编程等编程语言中的要素是如何发展出来的?Google为什么要开发Go和Dart,它们能取代C语言和JavaScript吗?大数据时代经常提到的Hadoop、MapReduce、NoSQL等名词到底是什么意思?关系型数据库真的已经走到穷途末路了吗?要充分运用多核心和分布式环境,在软件层面需要做出怎样的应对,又有哪些技术可以使用?如果你对上面这些话题感兴趣,无论心中是否已经有了自己的答案,都可以看一看来自Matz的解读。
和《松本行弘的程序世界》一样,这本书也是Matz在《日经Linux》杂志连载的专栏文章的一个合集,书中选取的文章之间有近四年的时间跨度,且章节的安排也和原稿写作的时间顺序有所不同。不了解这个背景的读者,可能会被书中一些貌似前后重复或者“穿越”的地方搞得一头雾水——少安毋躁,这不是bug。相比《松本行弘的程序世界》的14个主题来说,这本书的主题更加集中和深入,而不变的是,话题依然丰富,观点依然犀利,内容依然扎实,读起来畅快淋漓。
最后,感谢Matz在本书翻译过程中所给予的帮助和指导,感谢图灵公司各位编辑的辛苦工作,希望每位读者都能够从中有所收获。
周自恒
2013年3月于上海
前言
本书是在《日经Linux》上连载的《松本行弘:技术的剖析》(2009 年6 月号~ 2012 年6 月号)各期内容的合集。
老实说,写文章这件事很是让我头疼。我认为自己的本职工作是程序 员,而不是作家。每个月构思一个主题、查阅资料、编写示例程序,然后 再写成文章,这件事对我来说真是个负担。时间被占用,拖累了本职工作 不说,截稿日前夕还得承受压力。因此那一阵子经常会感到无比焦虑。
话虽如此,但这件事也并非一无是处。在构思文章主题的时候,需要 放眼于日常工作以外的世界,这样便拓宽了视野。其实,我本来也并不是 那么讨厌写文章。说起来,在学生时代我成绩最好的科目还是语文和英语 呢,而最差的科目则是数学。
因为是给杂志社供稿,所以我每个月都是选择当时那个时间点上比较 热门的、能够引起我的兴趣的话题来写,并没有考虑到主题的连贯性。不 过,借着编辑成书的机会回过头来看看以前连载的文章,和编辑讨论之后, 头脑中便一下子浮现出“未来”这个关键词。连载中的每一篇文章原本都 是独立的,但它们中的大多数都体现了“从过去到未来”、“应对即将到来 的未来”这样的主题。作为这些文章的作者,我自己也感到颇为意外。
毋庸置疑,IT 技术正在创造着我们的现在和未来。无论是专业人士, 还是业余爱好者,像我们这样的IT 技术人,可以说是会最早与未来遭遇 的“人种”吧。正是为了这些人,我才将《技术的剖析》这个专题连载至 今。这些连载能浮现出“未来”这个共同的关键词,虽说事先没有预料到, 但从某种意义上来说,也许是水到渠成自然而然的结果。
然而,IT 技术人的真正价值应该并非只有“最早与未来遭遇”而已, 我们不仅要能够及早触及未来,还应该拥有自己创造未来的力量——创造 出比这本书所预见的未来还要更加美好的未来。
松本行弘
2012 年4 月
于樱花盛开的松江市
序言
人类的力量是有限的,无法完全通晓未来,因此我们并不能确切地知道明天、明年究竟会发生什么事。
不过,仅就技术来说,一夜之间就冒出个新东西,这样的情况是非常罕见的,而大多数新技术都是沿着从过去到现在的技术轨迹逐步发展起来的。在IT的世界中,这样的倾向尤其显著。
《代码的未来》综述了我当前掌握的IT趋势,书中就摩尔定律、编程语言、多核、NoSQL等在未来几年中将备受关注的领域,介绍了相关的现状和基础知识。
当然,没人知道书中涉及的这些技术在更久远的未来是否还依然有用,但至少在不远的将来,它们应该是非常值得关注的技术。这些内容可以成为学习新技术的基础,对于想要成为优秀工程师、程序员的各位读者来说,这样的基础则能够成为生存竞争中的有力武器。
也许还有一些读者并非专职的程序员,但我认为本书同样值得他们一看。所谓技术,就是用来解决现实问题的手段。与现实问题展开的这场拉锯战,本身就是一件非常刺激和快乐的事,而这份快乐,也正是带动未来创新的源动力。
互联网和开源降低了参与创新的门槛。即便没有高学历,即便不属于任何一家企业,只要有技术和点子就有机会。可以想象,未来的创新就应该是这样。就IT方面来说,我认为大多数的创新应该都不外乎是本书介绍的这些技术的延伸。
有人说21世纪是亚洲的世纪。作为一个亚洲人,我开发的Ruby语言已经在全世界获得了广泛的应用,这也许从某种程度上印证了这种说法。这本书中包含了我的一些思考和见解,如果它能够对亚洲(恐怕应该是吧)各位读者的创新有所帮助,我会感到荣幸之至。
最后,希望中国的各位读者能够从本书中获益。
松本行弘
2013年4月