【教程】从零开始,写个编译器!
是的,这又是一个教你写个编译器的教程。
你可能已经见过无数个教你写编译器的教程了,但它们也许或多或少存在各种问题,导致你看了它们之后,依然觉得无从下手:
- 教程并非面向“零编译器基础”的人群,理解起来比较费劲。
- 只教了怎么做一个编译器,但没教为什么这么做,读完之后还是觉得一头雾水。
- 开始编码之前,需要复杂的环境配置,开局劝退。
- 上来先做和“编译一个程序”这件事八竿子打不着的东西,跟着教程学一个月才能看到自己的编译器编出一个能跑的程序,反馈周期过长。
- 最终写出来的只是个解释器,或者不能编译到真实的 ISA(例如输出了某种字节码),或者高度依赖其他框架(例如 LLVM),让人体会不到那种“我真的写出个编译器”的成就感,以及“所有事情都由自己实现”的酣畅感。
- 实现的编译器只能编译一些过于简单的程序,比如排序算法等等,看起来非常无聊。谁会没事干排序玩啊?
- 教程及其配套资源非中文,或需要付费,且不开源。
研究生期间,我一直在担任本科编译原理课程的助教。为了让本科生更好地理解编译器工作的原理,在参考多个其他教程之后,我设计了一套全新的,教你从零开始写个编译器的教程:
- 你可以使用 C/C++/Rust 开发你的编译器,教程只要求你具备使用这些语言编程的能力,不要求任何编译原理的基础和相关实践经验。
- 教程除了告诉你要如何写一个编译器,还会告诉你为什么这么做,以及除此之外还能怎么做。
- 教程采用增量式、迭代式的思路,引导你从一个只能处理
main
函数的编译器开始,逐步扩展实现一个能处理包括控制流、函数调用、数组在内的,类 C 语言的编译器。编译器可以输出 RISC-V 汇编。 - 提供基于 Docker 的实验环境,一键配置。环境中还附带自动测试脚本,一键测试你写的编译器。
- 教程介绍了相关工具,可以为你代劳一些枯燥的苦力活,比如生成 lexer/parser,解析和生成 IR 等等。剩下的事情,如构建 AST、语义分析、生成 IR 以及生成目标代码,完全由你自己编程实现。
- 你最终实现的编译器足以编译很多复杂的程序,例如 Mandelbrot 集绘制程序,或者 Lisp 解释器(这个解释器甚至可以解释另一个 Lisp 解释器)。我们会提供这些程序,让你用你写的编译器体验到最真实的快乐。
- 教程及其配套工具、实验环境等,全部开源,完全免费!
你可以从 GitHub Pages 上访问到这个教程:北京大学编译实践课程在线文档。如果你之前从来没有尝试过自己写一个编译器,不如现在就来试一下吧!
我的愿望是,让每个人都感受到写编译器的快乐。
由于教程是开源的,如果你在阅读教程或随教程实践的过程中发现任何问题,欢迎在 GitHub 的相关仓库中反馈,我们会尽量及时处理。
如果你希望在教程相关的内容中贡献自己的力量,欢迎向相关仓库发起 pull request。
膜大佬!
TQL!