代码的未来

代码的未来

7.8890 评价豆瓣读书
免费试读
¥40.00¥37.76
今日特价截止至:2021-12-01 02:00:00了解详情

作品简介

代码的未来》是Ruby之父松本行弘的又一力作。作者对云计算、大数据时代下的各种编程语言以及相关技术进行了剖析,并对编程语言的未来发展趋势做出预测,内容涉及Go、VoltDB、node.js、CoffeeScript、Dart、MongoDB、摩尔定律、编程语言、多核、NoSQL等当今备受关注的话题。

《代码的未来》面向各层次程序设计人员和编程爱好者,也可供相关技术人员参考。

松本行弘(Yukihiro Matsumoto)

Ruby语言发明者,亦是亚洲首屈一指的编程语言发明者。现兼任网络应用通信研究所(NaCl)研究员、乐天技术研究所研究员、Heroku首席架构师等。昵称“Matz”。讨厌东京,喜欢温泉。

作品目录

  1. 译者序
  2. 中文版序
  3. 前言
  4. 第 1 章 编程的时间和空间
  5. 1.1 编程的本质
  6. 编程的本质是思考
  7. 创造世界的乐趣
  8. 快速提高的性能改变了社会
  9. 以不变应万变
  10. 摩尔定律的局限
  11. 社会变化与编程
  12. 1.2 未来预测
  13. 科学的未来预测
  14. IT 未来预测
  15. 极限未来预测
  16. 从价格看未来
  17. 从性能看未来
  18. 从容量看未来
  19. 从带宽看未来
  20. 小结
  21. 第 2 章 编程语言的过去、现在和未来
  22. 2.1 编程语言的世界
  23. 被历史埋没的先驱
  24. 编程语言的历史
  25. 数学性语言
  26. 编程语言的进化方向
  27. 未来的编程语言
  28. 20 年后的编程语言
  29. 学生们的想象
  30. 2.2 DSL(特定领域语言)
  31. 外部 DSL
  32. 内部 DSL
  33. DSL 的优势
  34. DSL 的定义
  35. 适合内部 DSL 的语言
  36. 外部 DSL 实例
  37. DSL 设计的构成要素
  38. Sinatra
  39. 小结
  40. 2.3 元编程
  41. Meta, Reflection
  42. 类对象
  43. 类的操作
  44. Lisp
  45. 数据和程序
  46. Lisp 程序
  47. 宏的功与过
  48. 元编程的可能性与危险性
  49. 小结
  50. 2.4 内存管理
  51. 看似无限的内存
  52. GC 的三种基本方式
  53. 术语定义
  54. 标记清除方式
  55. 复制收集方式
  56. 引用计数方式
  57. 引用计数方式的缺点
  58. 进一步改良的应用方式
  59. 分代回收
  60. 对来自老生代的引用进行记录
  61. 增量回收
  62. 并行回收
  63. GC 大统一理论
  64. 2.5 异常处理
  65. “一定没问题的”
  66. 用特殊返回值表示错误
  67. 容易忽略错误处理
  68. Ruby 中的异常处理
  69. 产生异常
  70. 更高级的异常处理
  71. Ruby 中的后处理保证
  72. 其他语言中的异常处理
  73. Java 的检查型异常
  74. Icon 的异常和真假值
  75. Eiffel 的 Design by Contract
  76. 异常与错误值
  77. 小结
  78. 2.6 闭包
  79. 函数对象
  80. 高阶函数
  81. 用函数参数提高通用性
  82. 函数指针的局限
  83. 作用域:变量可见范围
  84. 生存周期:变量的存在范围
  85. 闭包与面向对象
  86. Ruby 的函数对象
  87. Ruby 与 JavaScript 的区别
  88. Lisp-1 与 Lisp-2
  89. 第 3 章 编程语言的新潮流
  90. 3.1 语言的设计
  91. 客户端与服务器端
  92. 向服务器端华丽转身
  93. 在服务器端获得成功的四大理由
  94. 客户端的 JavaScript
  95. 性能显著提升
  96. 服务器端的 Ruby
  97. Ruby on Rails 带来的飞跃
  98. 服务器端的 Go
  99. 静态与动态
  100. 动态运行模式
  101. 何谓类型
  102. 静态类型的优点
  103. 动态类型的优点
  104. 有鸭子样的就是鸭子
  105. Structural Subtyping
  106. 小结
  107. 3.2 Go
  108. New(新的)
  109. Experimental(实验性的)
  110. Concurrent(并发的)
  111. Garbage-collected(带垃圾回收的)
  112. Systems(系统)
  113. Go 的创造者们
  114. Hello World
  115. Go 的控制结构
  116. 类型声明
  117. 无继承式面向对象
  118. 多值与多重赋值
  119. 并发编程
  120. 小结
  121. 3.3 Dart
  122. 为什么要推出 Dart ?
  123. Dart 的设计目标
  124. 代码示例
  125. Dart 的特征
  126. 基于类的对象系统
  127. 非强制性静态类型
  128. Dart 的未来
  129. 3.4 CoffeeScript
  130. 最普及的语言
  131. 被误解最多的语言
  132. 显著高速化的语言
  133. 对 JavaScript 的不满
  134. CoffeeScript
  135. 安装方法
  136. 声明和作用域
  137. 分号和代码块
  138. 省略记法
  139. 字符串
  140. 数组和循环
  141. 小结
  142. 3.5 Lua
  143. 示例程序
  144. 数据类型
  145. 函数
  146. 元表
  147. 方法调用的实现
  148. 基于原型编程
  149. 和 Ruby 的比较(语言篇)
  150. 嵌入式语言 Lua
  151. 和 Ruby 的比较(实现篇)
  152. 嵌入式 Ruby
  153. 第 4 章 云计算时代的编程
  154. 4.1 可扩展性
  155. 信息的尺度感
  156. 大量数据的查找
  157. 二分法查找
  158. 散列表
  159. 布隆过滤器
  160. 一台计算机的极限
  161. DHT(分布式散列表)
  162. Roma
  163. MapReduce
  164. 小结
  165. 4.2 C10K 问题
  166. 何为 C10K 问题
  167. C10K 问题所引发的“想当然”
  168. 使用 epoll 功能
  169. 使用 libev 框架
  170. 使用 EventMachine
  171. 小结
  172. 4.3 HashFold
  173. HashFold 库的实现(Level 1)
  174. 运用多核的必要性
  175. 目前的 Ruby 实现所存在的问题
  176. 通过进程来实现 HashFold(Level 2)
  177. 抖动
  178. 运用进程池的 HashFold(Level 3)
  179. 小结
  180. 4.4 进程间通信
  181. 进程与线程
  182. 同一台计算机上的进程间通信
  183. TCP/IP 协议
  184. 用 C 语言进行套接字编程
  185. 用 Ruby 进行套接字编程
  186. Ruby 的套接字功能
  187. 用 Ruby 实现网络服务器
  188. 小结
  189. 4.5 Rack 与 Unicorn
  190. Rack 中间件
  191. 应用程序服务器的问题
  192. Unicorn 的架构
  193. Unicorn 的解决方案
  194. 性能
  195. 策略
  196. 小结
  197. 第 5 章 支撑大数据的数据存储技术
  198. 5.1 键 - 值存储
  199. Hash 类
  200. DBM 类
  201. 数据库的 ACID 特性
  202. CAP 原理
  203. CAP 解决方案——BASE
  204. 不能舍弃可用性
  205. 大规模环境下的键 - 值存储
  206. 访问键 - 值存储
  207. 键 - 值存储的节点处理
  208. 存储器
  209. 写入和读取
  210. 节点追加
  211. 故障应对
  212. 终止处理
  213. 其他机制
  214. 性能与应用实例
  215. 小结
  216. 5.2 NoSQL
  217. RDB 的极限
  218. NoSQL 数据库的解决方案
  219. 形形色色的 NoSQL 数据库
  220. 面向文档数据库
  221. MongoDB 的安装
  222. 启动数据库服务器
  223. MongoDB 的数据库结构
  224. 数据的插入和查询
  225. 用 JavaScript 进行查询
  226. 高级查询
  227. 数据的更新和删除
  228. 乐观并发控制
  229. 5.3 用 Ruby 来操作 MongoDB
  230. 使用 Ruby 驱动
  231. 对数据库进行操作
  232. 数据的插入
  233. 数据的查询
  234. 高级查询
  235. find 方法的选项
  236. 原子操作
  237. ActiveRecord
  238. OD Mapper
  239. 5.4 SQL 数据库的反击
  240. “云”的定义
  241. SQL 数据库的极限
  242. 存储引擎 Spider
  243. SQL 数据库之父的反驳
  244. SQL 数据库 VoltDB
  245. VoltDB 的架构
  246. VoltDB 中的编程
  247. Hello VoltDB!
  248. 性能测试
  249. 小结
  250. 5.5 memcached 和它的伙伴们
  251. 用于高速访问的缓存
  252. memcached
  253. 示例程序
  254. 对 memcached 的不满
  255. memcached 替代服务器
  256. 另一种键 - 值存储 Redis
  257. Redis 的数据类型
  258. Redis 的命令与示例
  259. 小结
  260. 第 6 章 多核时代的编程
  261. 6.1 摩尔定律
  262. 呈几何级数增长
  263. 摩尔定律的内涵
  264. 摩尔定律的结果
  265. 摩尔定律所带来的可能性
  266. 为了提高性能
  267. 摩尔定律的极限
  268. 超越极限
  269. 不再有免费的午餐
  270. 6.2 UNIX 管道
  271. 管道编程
  272. 多核时代的管道
  273. xargs——另一种运用核心的方式
  274. 注意瓶颈
  275. 阿姆达尔定律
  276. 多核编译
  277. ccache
  278. distcc
  279. 编译性能测试
  280. 小结
  281. 6.3 非阻塞 I / O
  282. 何为非阻塞 I/O
  283. 使用 read(2) 的方法
  284. 边沿触发与电平触发
  285. 使用 read(2) + select 的方法
  286. 使用 read+O_NONBLOCK 标志
  287. Ruby 的非阻塞 I/O
  288. 使用 aio_read 的方法
  289. 6.4 node.js
  290. 减负
  291. 拖延
  292. 委派
  293. 非阻塞编程
  294. node.js 框架
  295. 事件驱动编程
  296. 事件循环的利弊
  297. node.js 编程
  298. node.js 网络编程
  299. node.js 回调风格
  300. node.js 的优越性
  301. EventMachine 与 Rev
  302. 6.5 ZeroMQ
  303. 多 CPU 的必要性
  304. 阿姆达尔定律
  305. 多 CPU 的运用方法
  306. 进程间通信
  307. 管道
  308. SysV IPC
  309. 套接字
  310. UNIX 套接字
  311. ZeroMQ
  312. ZeroMQ 的安装
  313. ZeroMQ 示例程序
  314. 小结
载入中

热门划线

  1. “巴纳姆效应”是一种心理学现象,指的是将一些原本是放之四海而皆准的、模棱两可的一般性描述往自己身上套,并认为这些描述对自己是准确的。8 人
  2. 因此,创造出一种人类和计算机都能够理解的语言(编程语言),并通过这样的语言将人类的意图传达给计算机,这样的行为就叫做编程。7 人
  3. 像这样获取和变更程序本身信息的功能,被称为反射(Reflection)。7 人
  4. 编程的本质是思考5 人
  5. 曾经在诸多 Ruby 相关活动中发表过演讲的著名 Rubyist——Glenn Vanderburg 认为,构成一种优秀的(内部)DSL 的要素包括下列 5 种:上下文(Context)语句(Sentence)单位(Unit)词汇(Vocabulary)层次结构(Hierarchy)5 人
  6. 根本没有什么元编程,只有编程而已。5 人
  7. 根据 CAP 原理,C(一致性)、A(可用性)和 P(分裂容忍性)这三者之中,必须要舍弃一个。5 人
  8. 据说,在诞生了 UNIX 的 AT&T 贝尔实验室中有一句名言:库设计就是语言设计(Library design is language design)。我们在思考编程语言的时候,大多仅强调语法,但如果脱离了相当于词汇的库、类和方法,语言也就无从思考。4 人
  9. 这种算法的另一个好处是它具有局部性(Locality)。在复制收集过程中,会按照对象被引用的顺序将对象复制到新空间中。于是,关系较近的对象被放在距离较近的内存空间中的可能性会提高,这被称为局部性。局部性高的情况下,内存缓存会更容易有效运作,程序的运行性能也能够得到提高。4 人
  10. 所谓技术,就是用来解决现实问题的手段。3 人
  11. 然而,IT 技术人的真正价值应该并非只有“最早与未来遭遇”而已,我们不仅要能够及早触及未来,还应该拥有自己创造未来的力量——创造出比这本书所预见的未来还要更加美好的未来。3 人
  12. 编程的本质在于“思考”3 人
  13. 我喜欢编程,多少年来从未厌倦,这其中最大的理由,就是因为我把编程看作是一项创造性的工作吧。3 人
  14. 能够按照自己的意愿来创造世界,这正是编程的最大魅力所在3 人
  15. 读一读《圣经》之类的古典著作你就会惊奇地发现,人类从几千年前到现在所纠结的那些事情几乎没什么变化。从人类的本质来看,技术的进步只不过是些细枝末节的改变罢了。3 人
  16. 冷读术,就是通过观察对方言行举止中的一些细微之处来进行揣测的技巧3 人
  17. 现在的计算机对字符串处理和通信等非数值处理已经成为主流3 人
  18. Programming is a process of designing DSL for your own application.(编程就是为自己的应用程序设计 DSL 的过程)3 人
  19. 所谓元编程,就是“用程序来编写程序”的意思。3 人
  20. 标记清除算法有一个缺点,就是在分配了大量对象,并且其中只有一小部分存活的情况下,所消耗的时间会大大超过必要的值,这是因为在清除阶段还需要对大量死亡对象进行扫描。3 人
  21. 引用计数的第二个缺点,就是必须在引用发生增减时对引用计数做出正确的增减,而如果漏掉了某个增减的话,就会引发很难找到原因的内存错误。引用数忘了增加的话,会对不恰当的对象进行释放;而引用数忘了减少的话,对象会一直残留在内存中,从而导致内存泄漏。3 人
  22. 由于 GC 和程序处理的本质是无关的,因此它所消耗的时间越短越好。分代回收的目的,正是为了在程序运行期间,将 GC 所消耗的时间尽量缩短。3 人
  23. 在对实时性要求很高的程序中,比起缩短 GC 的平均中断时间,往往更重视缩短 GC 的最大中断时间。3 人
  24. 你有没有觉得太麻烦了?这种感觉太正常了。不过,受过良好训练的 C 语言程序员则不会有任何怨言,因为他们多年以来一直都在重复着这样的辛苦工作。3 人
  25. 函数对象,也就是将函数作为值来利用的方法,其最大的用途就是高阶函数。所谓高阶函数,就是用函数作为参数的函数。3 人
  26. 从函数对象中能够对外部变量进行访问(引用、更新),是闭包的构成要件之一。3 人
  27. 在 JavaScript 中与服务器进行异步通信的 API 叫做 XMLHttpRequest,因此从它所衍生出的手法便被称为 Ajax(Asynchronous JavaScript and XML,异步 JavaScript 与 XML)。3 人
  28. 改善 JavaScript 性能的主要技术,除了和 Java 相同的 JIT 和 GC 之外,还有特殊化(Specialization)技术。3 人
  29. 完全的 MVC 架构不使用配置文件(尤其是 XML)坚持简洁的表达积极运用元编程对 Ruby 核心的大胆扩展3 人
  30. 而面向对象的语言都会具备被称为多态(Polymorphism)或者动态绑定的动态性质。即,根据存放在变量中的对象的实际性质,自动选择一种合适的处理方式(方法)。这样的功能可以说是面向对象编程的本质。3 人
  31. 所谓动态运行模式,简单来说,就是运行中的程序能够识别自身,并对自身进行操作。对程序自身进行操作的编程,也被称为元编程(Metaprogramming)。3 人
  32. JIT 是 Just In Time Compiler 的缩写,指的是在程序运行时将其编译为机器语言的技术。由于编译为机器语言的程序可以以 CPU 原本的速度来运行,因此能够克服解释器所带来的劣势。JIT 在 JVM(Java Virtual Machine,Java 虚拟机)中也得到了运用。3 人
  33. 当大量的进程导致内存开销超过物理内存容量时,每次进行进程切换都不得不产生磁盘访问,这样一来,消耗的时间太长导致操作系统整体陷入一种几乎停止响应的状态,这样的情况被称为抖动(thrashing)。3 人
  34. 人类工作的定义比起计算机来说要更加模棱两可,像这样伴随不确定性,由惯性思维所产生的不必要不紧急的工作,如果能够砍掉的话,就能够大幅度提高工作效率。3 人
  35. 在编程的世界中,基本上没有现实世界中重力和因果关系这样的制约,2 人
  36. 层次结构(Hierarchy)2 人
  37. 在单词前面加上 meta,表示对自身的描述。例如,描述数据所具有的结构的数据,也就是关于数据本身的数据,被称为元数据(Metadata)2 人
  38. 为了维持程序的实时性,不等到 GC 全部完成,而是将 GC 操作细分成多个部分逐一执行。这种方式被称为增量回收(Incremental GC)。2 人
  39. 不过,当产生异常时也不能总是让程序结束运行,当显式声明需要进行错误处理时,可以恢复产生的错误,并让程序继续运行。2 人
  40. 异常处理功能就是为了将程序员进行错误处理的负担尽量减轻而产生的一种机制。2 人
  41. 所谓函数对象,顾名思义,就是作为对象来使用的函数。2 人
  42. 在 Lisp 的方言中,Scheme 等是属于 Lisp-1 的,函数和变量的命名空间是相同的。Lisp-1 这个名称,貌似就是从命名空间唯一这一概念而来的。在 Scheme 中,函数就是一个存放对函数对象的引用的变量而已。2 人
  43. 作为对策,在最新的 JVM 中,采用了并行回收、分代回收等技术。2 人
  44. 所谓 CGI,是通过 Web 服务器的标准输入输出与程序进行交互,从而生成动态 HTML 页面的接口。2 人
  45. 按顺序分别为千(Kilo,10 的 3 次方)、兆(Mega,10 的 6 次方)、吉(Giga,10 的 9 次方)、太(Tera,10 的 12 次方)、拍(Peta,10 的 15 次方)、艾(Exa,10 的 18 次方)。2 人
  46. 散列表采用了一种巧妙的查找方式,其平均的查找计算量与数据量是无关的。也就是说,用 O 记法来表示的话就是 O(1)。2 人

喜欢「代码的未来」的人也喜欢