《代碼的未來》是Ruby 之父松本行弘的又一力作。作者對云計算、大數據時代下的各種編程語言以及相關技術進行了剖析,并對編程語言的未來發展趨勢做出預測,內容涉及Go、VoltDB、node.js、CoffeeScript、Dart、MongoDB、摩爾定律、編程語言、多核、NoSQL 等當今備受關注的話題。
《代碼的未來》面向各層次程序設計人員和編程愛好者,也可供相關技術人員參考。
20年后、100年后的編程語言會是什么樣? Ruby之父剖析云計算、大數據時代下的技術 ◆ Lisp會是未來的發展趨勢嗎? ◆ Go和Dart能取代C和javascript嗎? ◆ 關系型數據庫已經走到窮途末路了嗎? Go、VoltDB、node.js、CoffeeScript、Dart、MongoDB…… 云計算、大數據時代下誰主沉浮?
本書是在《日經Linux》上連載的《松本行弘:技術的剖析》(2009 年6 月號~ 2012 年6 月號)各期內容的合集。
老實說,寫文章這件事很是讓我頭疼。我認為自己的本職工作是程序 員,而不是作家。每個月構思一個主題、查閱資料、編寫示例程序,然后 再寫成文章,這件事對我來說真是個負擔。時間被占用,拖累了本職工作 不說,截稿日前夕還得承受壓力。因此那一陣子經常會感到無比焦慮。
話雖如此,但這件事也并非一無是處。在構思文章主題的時候,需要 放眼于日常工作以外的世界,這樣便拓寬了視野。其實,我本來也并不是 那么討厭寫文章。說起來,在學生時代我成績最好的科目還是語文和英語 呢,而最差的科目則是數學。
因為是給雜志社供稿,所以我每個月都是選擇當時那個時間點上比較 熱門的、能夠引起我的興趣的話題來寫,并沒有考慮到主題的連貫性。不 過,借著編輯成書的機會回過頭來看看以前連載的文章,和編輯討論之后, 頭腦中便一下子浮現出“未來”這個關鍵詞。連載中的每一篇文章原本都 是獨立的,但它們中的大多數都體現了“從過去到未來”、“應對即將到來 的未來”這樣的主題。作為這些文章的作者,我自己也感到頗為意外。
毋庸置疑,IT 技術正在創造著我們的現在和未來。無論是專業人士, 還是業余愛好者,像我們這樣的IT 技術人,可以說是會最早與未來遭遇 的“人種”吧。正是為了這些人,我才將《技術的剖析》這個專題連載至 今。這些連載能浮現出“未來”這個共同的關鍵詞,雖說事先沒有預料到, 但從某種意義上來說,也許是水到渠成自然而然的結果。
然而,IT 技術人的真正價值應該并非只有“最早與未來遭遇”而已, 我們不僅要能夠及早觸及未來,還應該擁有自己創造未來的力量——創造 出比這本書所預見的未來還要更加美好的未來。
松本行弘
2012 年4 月
于櫻花盛開的松江市
松本行弘(Yukihiro Matsumoto),Ruby語言發明者,亦是亞洲首屈一指的編程語言發明者。現兼任網絡應用通信研究所(NaCl)研究員、樂天技術研究所研究員、Heroku首席架構師等。昵稱"Matz"。討厭東京,喜歡溫泉。
譯者簡介:
周自恒,IT、編程愛好者,技術宅,初中時曾在NOI(國家信息學奧賽)天津賽區獲一等獎,大學畢業后曾任IT咨詢顧問,精通英語和日語,譯著有《30天自制操作系統》、《大數據的沖擊》、《Android應用開發入門》。
第一章 編程的時間和空間
1.1 編程的本質
編程的本質是思考
創造世界的樂趣
快速提高的性能改變了社會
以不變應萬變
摩爾定律的局限
社會變化與編程
1.2 未來預測
科學的未來預測
IT 未來預測
極限未來預測
從價格看未來
從性能看未來
從容量看未來
從帶寬看未來
小結
第二章 編程語言的過去、現在和未來
2.1 編程語言的世界
被歷史埋沒的先驅
編程語言的歷史
編程語言的進化方向
未來的編程語言
20 年后的編程語言
學生們的想象
2.2 DSL(特定領域語言)
外部DSL
內部DSL
DSL 的優勢
DSL 的定義
適合內部DSL 的語言
外部DSL 實例
DSL 設計的構成要素
Sinatra
小結
2.3 元編程
Meta, Reflection
類對象
類的操作
Lisp
數據和程序
Lisp 程序
宏
宏的功與過
元編程的可能性與危險性
小結
2.4 內存管理
看似無限的內存
GC 的三種基本方式
術語定義
標記清除方式
復制收集方式
引用計數方式
引用計數方式的缺點
進一步改良的應用方式
分代回收
對來自老生代的引用進行記錄
增量回收
并行回收
GC 大統一理論
2.5 異常處理
“一定沒問題的”
用特殊返回值表示錯誤
容易忽略錯誤處理
Ruby 中的異常處理
產生異常
更高級的異常處理
Ruby 中的后處理保證
其他語言中的異常處理
Java 的檢查型異常
Icon 的異常和真假值
Eiffel 的Design by Contract
異常與錯誤值
小結
2.6 閉包
函數對象
高階函數
用函數參數提高通用性
函數指針的局限
作用域:變量可見范圍
生存周期:變量的存在范圍
閉包與面向對象
Ruby 的函數對象
Ruby 與JavaScript 的區別
Lisp-1 與Lisp-2
第三章 編程語言的新潮流
3.1 語言的設計
客戶端與服務器端
向服務器端華麗轉身
在服務器端獲得成功的四大理由
客戶端的JavaScript
性能顯著提升
服務器端的Ruby
Ruby on Rails 帶來的飛躍
服務器端的Go
靜態與動態
動態運行模式
何謂類型
靜態類型的優點
動態類型的優點
有鴨子樣的就是鴨子
Structural Subtyping
小結
3.2 Go
New(新的)
Experimental(實驗性的)
Concurrent(并發的)
Garbage-collected(帶垃圾回收的)
Systems(系統)
Go 的創造者們
Hello World
Go 的控制結構
類型聲明
無繼承式面向對象
多值與多重賦值
并發編程
小結
3.3 Dart
為什么要推出Dart ?
Dart 的設計目標
代碼示例
Dart 的特征
基于類的對象系統
非強制性靜態類型
Dart 的未來
3.4 CoffeeScript
最普及的語言
被誤解最多的語言
顯著高速化的語言
對JavaScript 的不滿
CoffeeScript
安裝方法
聲明和作用域
分號和代碼塊
省略記法
字符串
數組和循環
類
小結
3.5 Lua
示例程序
數據類型
函數
表
元表
方法調用的實現
基于原型編程
和Ruby 的比較(語言篇)
嵌入式語言Lua
和Ruby 的比較(實現篇)
嵌入式Ruby
第四章 云計算時代的編程
4.1 可擴展性
信息的尺度感
大量數據的查找
二分法查找
散列表
布隆過濾器
一臺計算機的極限
DHT(分布式散列表)
Roma
MapReduce
小結
4.2 C10K 問題
何為C10K 問題
C10K 問題所引發的“想當然”
使用epoll 功能
使用libev 框架
使用EventMachine
小結
4.3 HashFold
HashFold 庫的實現(Level 1)
運用多核的必要性
目前的Ruby 實現所存在的問題
通過進程來實現HashFold(Level 2)
抖動
運用進程池的HashFold(Level 3)
小結
4.4 進程間通信
進程與線程
同一臺計算機上的進程間通信
TCP IP 協議
用C 語言進行套接字編程
用Ruby 進行套接字編程
Ruby 的套接字功能
用Ruby 實現網絡服務器
小結
4.5 Rack 與Unicorn
Rack 中間件
應用程序服務器的問題
Unicorn 的架構
Unicorn 的解決方案
性能
策略
小結
第五章 支撐大數據的數據存儲技術
5.1 鍵- 值存儲
Hash 類
DBM 類
數據庫的ACID 特性
CAP 原理
CAP 解決方案--BASE
不能舍棄可用性
大規模環境下的鍵- 值存儲
訪問鍵- 值存儲
鍵- 值存儲的節點處理
存儲器
寫入和讀取
節點追加
故障應對
終止處理
其他機制
性能與應用實例
小結
5.2 NoSQL
RDB 的極限
NoSQL 數據庫的解決方案
形形色色的NoSQL 數據庫
面向文檔數據庫
MongoDB 的安裝
啟動數據庫服務器
MongoDB 的數據庫結構
數據的插入和查詢
用JavaScript 進行查詢
高級查詢
數據的更新和刪除
樂觀并發控制
5.3 用Ruby 來操作MongoDB
使用Ruby 驅動
對數據庫進行操作
數據的插入
數據的查詢
高級查詢
find 方法的選項
原子操作
ActiveRecord
OD Mapper
5.4 SQL 數據庫的反擊
“云”的定義
SQL 數據庫的極限
存儲引擎Spider
SQL 數據庫之父的反駁
SQL 數據庫VoltDB
VoltDB 的架構
VoltDB 中的編程
Hello VoltDB!
性能測試
小結
5.5 memcached 和它的伙伴們
用于高速訪問的緩存
memcached
示例程序
對memcached 的不滿
memcached 替代服務器
另一種鍵- 值存儲Redis
Redis 的數據類型
Redis 的命令與示例
小結
第六章 多核時代的編程
6.1 摩爾定律
呈幾何級數增長
摩爾定律的內涵
摩爾定律的結果
摩爾定律所帶來的可能性
為了提高性能
摩爾定律的極限
超越極限
不再有免費的午餐
6.2 UNIX 管道
管道編程
多核時代的管道
xargs--另一種運用核心的方式
注意瓶頸
阿姆達爾定律
多核編譯
ccache
distcc
編譯性能測試
小結
6.3 非阻塞I/O
何為非阻塞I O
使用read(2) 的方法
邊沿觸發與電平觸發
使用read(2) + select 的方法
使用read+O_NONBLOCK 標志
Ruby 的非阻塞I O
使用aio_read 的方法
6.4 node.js
減負
拖延
委派
非阻塞編程
node.js 框架
事件驅動編程
事件循環的利弊
node.js 編程
node.js 網絡編程
node.js 回調風格
node.js 的優越性
EventMachine 與Rev
6.5 ZeroMQ
多CPU 的必要性
阿姆達爾定律
多CPU 的運用方法
進程間通信
管道
SysV IPC
套接字
UNIX 套接字
ZeroMQ
ZeroMQ 的連接模型
ZeroMQ 的安裝
ZeroMQ 示例程序
小結
版權聲明