《Ruby原理剖析》解開Ruby編程語言的魔法面紗。全書圖文并茂、深入淺出地剖析了Ruby編程語言的核心工作原理。作者本著科學(xué)實(shí)證的精神,設(shè)計(jì)了一系列實(shí)驗(yàn),幫助讀者輕松了解這門編程語言的工作奧秘,包括Ruby如何用虛擬機(jī)執(zhí)行代碼,Ruby的垃圾回收算法,以及類和模塊在Ruby內(nèi)部的關(guān)系等。
哦,你好!雖然我向來喜歡含蓄,但我不得不說:你應(yīng)該買這本書!
我的名字叫Aaron Patterson,但是網(wǎng)絡(luò)上的朋友都叫我tenderlove。我效力于Ruby和Ruby on Rails的核心團(tuán)隊(duì),同時(shí)也是這本書的技術(shù)顧問。這是不是意味著你就應(yīng)該聽我的呢?不是的。好吧,也許。
實(shí)際上,當(dāng)Patrick要我做這本書的技術(shù)顧問時(shí),我興奮得帽子都差點(diǎn)掉了,眼鏡也掉到咖啡里去了!我知道很多開發(fā)者都被Ruby的底層原理嚇住了,不敢深入研究。常常有人問我該如何學(xué)習(xí)Ruby的底層原理,或者該從哪里入手。不幸的是,我沒能給他們一個(gè)好答案,但現(xiàn)在我可以回答他們了。
Patrick科研式的寫作風(fēng)格讓Ruby的底層原理變得更加直觀。實(shí)驗(yàn)與講解的結(jié)合讓Ruby的行為和性能更容易理解。如果你對(duì)Ruby代碼產(chǎn)生疑惑,無論是性能表現(xiàn)、局部變量,還是垃圾回收,你都能在這本書里找到解答。
如果你想探索Ruby內(nèi)部原理,或者想理解Ruby的工作方式,那就不用猶豫了,這本就是你要找的書。我很喜歡這本書,希望你也喜歡。
Aaron Patterson
京東-經(jīng)銷商授權(quán)函20160413.jpg
查看全部↓
Patrick Shaughnessy是著名的Ruby開發(fā)者,目前在麥肯錫管理咨詢公司(McKinsey & Co.)從事開發(fā)工作。Patrick有20多年軟件開發(fā)工作經(jīng)驗(yàn),精通C、Java、PHP、Ruby等多種編程語言。他是Ruby Conference Circuit的主持人,定期在Ruby Weekly電子報(bào)、Ruby5 Podcast和The Ruby Show上發(fā)表文章和演講。他的博客地址: http://patshaughnessy.n
1 分詞與語法解析 3
1.1 詞條:構(gòu)成Ruby語言的單詞 5
1.2 語法解析:Ruby如何理解代碼 13
1.2.1 理解LALR解析算法 14
1.2.2 真實(shí)的Ruby語法規(guī)則 21
1.3 總結(jié) 31
2 編譯 33
2.1 Ruby 1.8沒有編譯器 34
2.2 Ruby 1.9和Ruby 2.0引入了編譯器 35
2.3 Ruby如何編譯簡單腳本 37
2.4 編譯塊調(diào)用 41
2.5 本地表 49
2.5.1 編譯可選參數(shù) 52
2.5.2 編譯關(guān)鍵字參數(shù) 53
2.6 總結(jié) 57
3 Ruby如何執(zhí)行代碼 59
3.1 YARV內(nèi)部棧和Ruby調(diào)用棧 60
3.1.1 逐句查看Ruby如何執(zhí)行簡單腳本 62
3.1.2 執(zhí)行塊調(diào)用 65
3.2 訪問Ruby變量的兩種方式 72
3.2.1 本地變量訪問 72
3.2.2 方法參數(shù)被看成本地變量 75
3.2.3 動(dòng)態(tài)變量訪問 76
3.3 總結(jié) 86
4 控制結(jié)構(gòu)與方法調(diào)度 89
4.1 Ruby如何執(zhí)行if語句 90
4.2 作用域之間的跳轉(zhuǎn) 93
4.2.1 捕獲表 94
4.2.2 捕獲表的其他用途 96
4.3 send指令:Ruby最復(fù)雜的控制結(jié)構(gòu) 99
4.3.1 方法查找和方法調(diào)度 99
4.3.2 Ruby方法的11種類型 100
4.4 調(diào)用普通Ruby方法 102
4.4.1 為普通Ruby方法準(zhǔn)備參數(shù) 103
4.5 調(diào)用內(nèi)建的Ruby方法 104
4.5.1 調(diào)用attr_reader和attr_writer 105
4.5.2 方法調(diào)度優(yōu)化attr_reader和attr_writer 106
4.6 總結(jié) 110
5 對(duì)象與類 113
5.1 Ruby對(duì)象內(nèi)部 114
5.1.1 檢驗(yàn)klass和ivptr 115
5.1.2 觀察同一個(gè)類的兩個(gè)實(shí)例 117
5.1.3 基本類型對(duì)象 118
5.1.4 簡單立即值完全不需要結(jié)構(gòu)體 119
5.1.5 基本類型對(duì)象有實(shí)例變量嗎 120
5.1.6 基本類型對(duì)象的實(shí)例變量保存在哪里 122
5.2 RClass結(jié)構(gòu)體內(nèi)部有什么 125
5.2.1 繼承 128
5.2.2 類實(shí)例變量vs類變量 129
5.2.3 存取類變量 131
5.2.4 常量 134
5.2.5 真實(shí)的RClass結(jié)構(gòu)體 135
5.3 總結(jié) 140
6 方法查找和常量查找 143
6.1 Ruby如何實(shí)現(xiàn)模塊 145
6.1.1 模塊是類 145
6.1.2 將模塊include到類中 147
6.2 Ruby的方法查找算法 148
6.2.1 方法查找示例 149
6.2.2 方法查找算法實(shí)踐 151
6.2.3 Ruby中的多繼承 152
6.2.4 全局方法緩存 153
6.2.5 內(nèi)聯(lián)方法緩存 154
6.2.6 清空Ruby的方法緩存 155
6.2.7 在同一個(gè)類中include兩個(gè)模塊 155
6.2.8 在模塊中include模塊 157
6.2.9 Module#prepend 示例 158
6.2.10 Ruby如何實(shí)現(xiàn)Module#prepend 161
6.2.11 在已被include的模塊中增加方法 164
6.2.12 在已被include的模塊中include其他模塊 164
6.2.13 “被include的類”與原始模塊共享方法表 166
6.3 常量查找 168
6.3.1 在超類中查找常量 169
6.3.2 Ruby如何在父級(jí)命名空間中查找常量 170
6.4 Ruby中的詞法作用域 171
6.4.1 為新類或模塊創(chuàng)建常量 172
6.4.2 在父命名空間中使用詞法作用域查找常量 173
6.4.3 Ruby的常量查找算法 175
6.4.4 Ruby真實(shí)的常量查找算法 177
6.5 總結(jié) 178
7 散列表:Ruby內(nèi)部的主力軍 181
7.1 Ruby中的散列表 182
7.1.1 在散列表中保存值 183
7.1.2 從散列表中檢索值 185
7.2 散列表如何擴(kuò)展以容納更多的值 188
7.2.1 散列沖突 188
7.2.2 重新散列條目 189
7.3 Ruby如何實(shí)現(xiàn)散列函數(shù) 195
7.3.1 Ruby 2.0中的散列優(yōu)化 202
7.4 總結(jié) 203
8 Ruby如何借鑒Lisp幾十年前的理念 207
8.1 塊: Ruby中的閉包 208
8.1.1 Ruby如何調(diào)用塊 210
8.1.2 借用1975年的理念 212
8.2 Lambda和Proc:把函數(shù)當(dāng)做一等公民 219
8.2.1 棧內(nèi)存vs堆內(nèi)存 220
8.2.2 深入探索Ruby如何保存字符串的值 220
8.2.3 Ruby如何創(chuàng)建Lambda 223
8.2.4 Ruby如何調(diào)用Lambda 226
8.2.5 Proc對(duì)象 227
8.2.6 在同一個(gè)作用域中多次調(diào)用lambda 232
8.3 總結(jié) 234
9 元編程 237
9.1 定義方法的多種方式 239
9.1.1 Ruby的普通方法定義過程 239
9.1.2 使用對(duì)象前綴定義類方法 241
9.1.3 使用新的詞法作用域定義類方法 242
9.1.4 使用單類定義方法 244
9.1.5 在單類的詞法作用域中定義方法 245
9.1.6 創(chuàng)建Refinement 246
9.1.7 使用Refinement 248
9.1.8 頂級(jí)作用域中的self 250
9.1.9 類作用域中的self 251
9.1.10 元類作用域中的self 252
9.1.11 類方法中的self 253
9.2 元編程與閉包:eval、instance_eval和binding 255
9.2.1 能寫代碼的代碼 255
9.2.2 使用binding參數(shù)調(diào)用eval 257
9.2.3 instance_eval示例 259
9.2.4 Ruby閉包的另一個(gè)重點(diǎn) 260
9.2.5 instance_eval改變接收者的self 262
9.2.6 instance_eval為新的詞法作用域創(chuàng)建單類 262
9.2.7 使用define_method 266
9.2.8 充當(dāng)閉包的方法 266
9.3 總結(jié) 268
10 JRuby:基于JVM的Ruby 271
10.1 使用MRI和JRuby運(yùn)行程序 272
10.1.1 JRuby如何解析和編譯代碼 274
10.1.2 JRuby如何執(zhí)行代碼 276
10.1.3 用Java類實(shí)現(xiàn)Ruby類 278
10.1.4 使用-J-XX:+PrintCompilation選項(xiàng) 281
10.1.5 JIT是否提升了JRuby程序的性能 283
10.2 JRuby和MRI中的字符串 284
10.2.1 JRuby和MRI如何保存字符串?dāng)?shù)據(jù) 284
10.2.2 寫時(shí)復(fù)制 286
10.2.3 創(chuàng)建唯一且非共享的字符串 288
10.2.4 可視化寫時(shí)復(fù)制 290
10.2.5 修改共享字符串更慢 291
10.3 總結(jié) 293
11 Rubinius:用Ruby實(shí)現(xiàn)的Ruby 295
11.1 Rubinius內(nèi)核和虛擬機(jī) 296
11.1.1 詞法分析和解析 298
11.1.2 使用Ruby編譯Ruby 299
11.1.3 Rubinius字節(jié)碼指令 300
11.1.4 Ruby和C++一起工作 302
11.1.5 使用C++對(duì)象實(shí)現(xiàn)Ruby對(duì)象 303
11.1.6 Rubinius中的(棧)回溯 305
11.2 Rubinius和MRI中的數(shù)組 307
11.2.1 MRI中的數(shù)組 307
11.2.2 Rubinius中的數(shù)組 309
11.2.3 閱讀Array#shift源碼 311
11.2.4 修改Array#shift方法 312
11.3 總結(jié) 315
12 MRI、JRuby、Rubinius垃圾回收 317
12.1 垃圾回收器解決三個(gè)問題 319
12.2 MRI中的垃圾回收: 標(biāo)記與清除 320
12.2.1 空閑列表 320
12.2.2 標(biāo)記 321
12.2.3 MRI如何標(biāo)記存活對(duì)象 323
12.2.4 清除 323
12.2.5 延遲清除 324
12.2.6 標(biāo)記-清除的缺點(diǎn) 325
12.2.7 觀察MRI執(zhí)行延遲清除 327
12.2.8 觀察MRI執(zhí)行全回收 328
12.2.9 解讀GC分析報(bào)告 329
12.3 JRuby和Rubinius中的垃圾回收 332
12.4 復(fù)制垃圾回收 333
12.4.1 碰撞分配 333
12.4.2 半空間算法 334
12.4.3 伊甸堆 336
12.5 分代垃圾回收 337
12.5.1 弱代假說 337
12.5.2 為新生代使用半空間算法 338
12.5.3 晉升對(duì)象 338
12.5.4 成熟代對(duì)象垃圾回收 339
12.6 并發(fā)垃圾回收 341
12.6.1 當(dāng)對(duì)象圖改變時(shí)進(jìn)行標(biāo)記 341
12.6.2 三色標(biāo)記 343
12.6.3 JVM中的三種垃圾收集器 344
12.6.4 觸發(fā)主收集 347
12.7 延伸閱讀 348
12.8 總結(jié) 349
索引 351
查看全部↓