第 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