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