本書是《用Go語言自制解釋器》的續(xù)篇。在自制解釋器時,你已經(jīng)為Monkey語言實現(xiàn)了類C語法、變量綁定、基本數(shù)據(jù)類型、算術(shù)運(yùn)算、內(nèi)置函數(shù)、閉包等特性。是時候讓Monkey繼續(xù)成長了!在本書中,Monkey將繼續(xù)“進(jìn)化”,并最終成長為成熟的程序設(shè)計語言。在已有詞法分析器、語法分析器和抽象語法樹的基礎(chǔ)上,你將為Monkey語言定義字節(jié)碼指令,指定操作數(shù),編寫反匯編程序,構(gòu)建執(zhí)行字節(jié)碼的虛擬機(jī)。通過動手學(xué)習(xí),你將能夠體驗從無到有實現(xiàn)類C語言的樂趣。
- 放下大部頭,換一種方式入門編譯原理
- 體驗一步步實現(xiàn)類C語言的樂趣
- 原版在豆瓣評分9.4
- 被讀者譽(yù)為現(xiàn)代版“龍書”
索斯藤·鮑爾(Thorsten Ball)
Sourcegraph軟件工程師,精通多門程序設(shè)計語言,包括Go、C、JavaScript和Ruby,深諳編譯原理、系統(tǒng)編程、Unix、數(shù)據(jù)庫等相關(guān)技術(shù)。現(xiàn)居德國,長期活躍于歐洲各大技術(shù)大會。
廖彬
畢業(yè)于中國科學(xué)院計算技術(shù)研究所,高級語言虛擬機(jī)愛好者,在語言虛擬機(jī)領(lǐng)域從事開發(fā)近十年,曾就職于阿里巴巴和騰訊。
第 1章 編譯器與虛擬機(jī) 1
1.1 編譯器 2
1.2 虛擬機(jī)與物理機(jī) 5
1.2.1 物理機(jī) 6
1.2.2 什么是虛擬機(jī) 11
1.2.3 為什么要構(gòu)建虛擬機(jī) 14
1.2.4 字節(jié)碼 15
1.3 虛擬機(jī)與編譯器的二元性 17
第 2章 你好,字節(jié)碼! 19
2.1 第 一條指令 20
2.1.1 以字節(jié)作為開端 21
2.1.2 最小編譯器 26
2.1.3 字節(jié)碼與反匯編程序 32
2.1.4 回歸初心,繼續(xù)前行 37
2.1.5 給機(jī)器上電 40
2.2 棧上加法 46
2.3 連接REPL 52
第3章 編譯表達(dá)式 55
3.1 棧清理 55
3.2 中綴表達(dá)式 60
3.3 布爾類型 64
3.4 比較運(yùn)算符 69
3.5 前綴表達(dá)式 76
第4章 條件語句 83
4.1 跳轉(zhuǎn) 86
4.2 編譯條件語句 88
4.3 執(zhí)行跳轉(zhuǎn) 103
4.4 歡迎回來,Null 值 106
第5章 追蹤名稱 115
5.1 計劃 116
5.2 編譯綁定 117
5.2.1 添加符號表 120
5.2.2 在編譯器中使用符號 123
5.3 在虛擬機(jī)中支持全局變量 126
第6章 字符串、數(shù)組和哈希表 132
6.1 字符串 132
6.2 數(shù)組 138
6.3 哈希表 142
6.4 索引運(yùn)算符 149
第7章 函數(shù) 156
7.1 一個簡單的函數(shù) 156
7.1.1 函數(shù)表示 157
7.1.2 執(zhí)行函數(shù)的操作碼 158
7.1.3 編譯函數(shù)字面量 161
7.1.4 編譯函數(shù)調(diào)用 176
7.1.5 虛擬機(jī)中的函數(shù) 179
7.1.6 一點獎勵 190
7.2 局部綁定 191
7.2.1 局部綁定操作碼 192
7.2.2 編譯局部綁定 195
7.2.3 在虛擬機(jī)中實現(xiàn)局部綁定 208
7.3 參數(shù) 218
7.3.1 編譯帶參數(shù)的函數(shù)調(diào)用 219
7.3.2 將引用解析為參數(shù) 224
7.3.3 虛擬機(jī)中的參數(shù) 227
第8章 內(nèi)置函數(shù) 237
8.1 使修改變得簡單 238
8.2 做出改變:計劃 244
8.3 內(nèi)置函數(shù)作用域 245
8.4 執(zhí)行內(nèi)置函數(shù) 250
第9章 閉包 256
9.1 問題 257
9.2 計劃 258
9.3 將一切視為閉包 260
9.4 編譯和解析自由變量 271
9.5 運(yùn)行時創(chuàng)建閉包 283
9.6 遞歸閉包 288
第 10章 最后的測試 303