第1章 編譯器與虛擬機器 1
1.1 編譯器 2
1.2 虛擬機器與物理機 5
1.2.1 物理機 6
1.2.2 什麼是虛擬機器 11
1.2.3 為什麼要構建虛擬機器 14
1.2.4 位元組碼 15
1.3 虛擬機器與編譯器的二元性 17
第2章 你好,位元組碼! 19
2.1 第 一條指令 20
2.1.1 以位元組作為開端 21
2.1.2 最小編譯器 26
2.1.3 位元組碼與反匯編程式 32
2.1.4 回歸初心,繼續前行 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 執行跳轉 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 執行函數的操作碼 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 執行內置函數 250
第9章 閉包 256
9.1 問題 257
9.2 計畫 258
9.3 將一切視為閉包 260
9.4 編譯和解析自由變數 271
9.5 運行時創建閉包 283
9.6 遞迴閉包 288
第10章 最後的測試 303