是的,这又是一个教你写个编译器的教程。

你可能已经见过无数个教你写编译器的教程了,但它们也许或多或少存在各种问题,导致你看了它们之后,依然觉得无从下手:

  • 教程并非面向“零编译器基础”的人群,理解起来比较费劲。
  • 只教了怎么做一个编译器,但没教为什么这么做,读完之后还是觉得一头雾水。
  • 开始编码之前,需要复杂的环境配置,开局劝退。
  • 上来先做和“编译一个程序”这件事八竿子打不着的东西,跟着教程学一个月才能看到自己的编译器编出一个能跑的程序,反馈周期过长。
  • 最终写出来的只是个解释器,或者不能编译到真实的 ISA(例如输出了某种字节码),或者高度依赖其他框架(例如 LLVM),让人体会不到那种“我真的写出个编译器”的成就感,以及“所有事情都由自己实现”的酣畅感。
  • 实现的编译器只能编译一些过于简单的程序,比如排序算法等等,看起来非常无聊。谁会没事干排序玩啊?
  • 教程及其配套资源非中文,或需要付费,且不开源。

研究生期间,我一直在担任本科编译原理课程的助教。为了让本科生更好地理解编译器工作的原理,在参考多个其他教程之后,我设计了一套全新的,教你从零开始写个编译器的教程:

  • 你可以使用 C/C++/Rust 开发你的编译器,教程只要求你具备使用这些语言编程的能力,不要求任何编译原理的基础和相关实践经验。
  • 教程除了告诉你要如何写一个编译器,还会告诉你为什么这么做,以及除此之外还能怎么做。
  • 教程采用增量式、迭代式的思路,引导你从一个只能处理 main 函数的编译器开始,逐步扩展实现一个能处理包括控制流、函数调用、数组在内的,类 C 语言的编译器。编译器可以输出 RISC-V 汇编。
  • 提供基于 Docker 的实验环境,一键配置。环境中还附带自动测试脚本,一键测试你写的编译器。
  • 教程介绍了相关工具,可以为你代劳一些枯燥的苦力活,比如生成 lexer/parser,解析和生成 IR 等等。剩下的事情,如构建 AST、语义分析、生成 IR 以及生成目标代码,完全由你自己编程实现。
  • 你最终实现的编译器足以编译很多复杂的程序,例如 Mandelbrot 集绘制程序,或者 Lisp 解释器(这个解释器甚至可以解释另一个 Lisp 解释器)。我们会提供这些程序,让你用你写的编译器体验到最真实的快乐。
  • 教程及其配套工具、实验环境等,全部开源,完全免费!

你可以从 GitHub Pages 上访问到这个教程:北京大学编译实践课程在线文档。如果你之前从来没有尝试过自己写一个编译器,不如现在就来试一下吧!

我的愿望是,让每个人都感受到写编译器的快乐。

由于教程是开源的,如果你在阅读教程或随教程实践的过程中发现任何问题,欢迎在 GitHub 的相关仓库中反馈,我们会尽量及时处理。

如果你希望在教程相关的内容中贡献自己的力量,欢迎向相关仓库发起 pull request。

标签: 编译原理, 编译, 教程

仅有一条评论

  1. Seddon Seddon

    膜大佬!

添加新评论