C4C in four functions)是 Robert Swierczek 写的一个极简主义练习:用大约 500 行 C 代码实现一个能运行 C 程序的虚拟机和解释器。整个项目就四个函数:next() 词法分析、program() 语法分析生成代码、eval() 虚拟机执行、main() 组装。

它有多强

1
2
3
4
gcc -o c4 c4.c
./c4 hello.c # 解释执行一个 C 程序
./c4 -s hello.c # 输出汇编指令
./c4 c4.c hello.c # 用 c4 解释运行 c4 自己,再由它运行 hello.c

最后一行是它的名场面:c4 可以解释执行 c4 自己(甚至再套一层), demonstrates 了”自举(self-hosting)”的概念。

我做了什么

以 c4 为基础学习整个解释器的骨架:词法分析如何把源码切成 token、虚拟机的指令集(IMM/ADJ/PUSH/JMP/…)、符号表的组织。my_gcc.c 是学习过程中加入自己注释和修改的版本。

为什么值得读

  • 一份代码同时覆盖编译原理四大阶段:词法、语法、语义(生成虚拟机指令)、执行
  • 没有任何依赖,纯 C,一个周末就能读完
  • 读懂它之后再看 Lua 解释器、脚本引擎,结构都是似曾相识的

注意:c4 原版使用 Linux/Mac 的系统调用(open/read/write),Windows 下需要用 WSL 或 Cygwin 环境运行。