路线图

本节阅读量:

这套课程的目标,是用 C++ 实现一门很小的 Lisp 风格语言,同时把解释器语义和编译到 x86-64 汇编的核心路径讲清楚。

先把边界说清楚:

  • 实现语言:C++17 或 C++20
  • 源语言:小型 Lisp 风格表达式语言
  • 解释器:用于说明语言特性的语义
  • 编译器:生成 x86-64 System V ABI 的 AT&T 汇编
  • 编译边界:只实现 compile,不实现 build,不调用 cc
  • 汇编运行方式由用户手动完成
  • 默认运行环境:Linux、macOS 或 WSL;命令示例使用 Unix 风格 shell

课程主线

第 0 章先解决一件事:看到课程里的命令时,知道自己在运行什么。我们会看项目的目录结构、命令如何进入 mini 的 C++ 入口、课程会用到的少量 make 用法,以及编译出来的程序该如何执行。

第一章只处理一个很小的程序:

1
(+ 40 2)

它的结果是:

1
42

但我们不会只写一个加法函数。我们会完整走一遍:

1
2
3
源代码 -> token -> 语法树 AST
            |-> 解释器 -> 计算结果
            |-> 编译器 -> 中间表示 IR -> x86-64 AT&T 汇编代码

也就是说,同一个程序会有两条路:

1
2
解释器:看懂 AST,然后直接算出 42。
编译器:看懂 AST,拆成 IR,再生成汇编。

这里要注意一个边界:compile 只负责生成汇编文件。真正把汇编链接成可执行程序,会由我们手动调用 cc 完成。

后面的章节会沿着这条路逐步加入新能力:

1
2
3
4
5
6
7
8
9
let          变量和作用域
if           条件和跳转
lambda       函数值和调用
struct       结构值、值表示和堆对象
闭包         函数如何记住外层环境
letrec       递归函数
set!         可变状态
GC           垃圾回收
寄存器分配   让临时变量落到真实寄存器和栈槽

专栏首页

上一节

0.1 运行代码

下一节


本节目录