# PKU 编译原理实践

## 课程简介

- 所属大学：北京大学
- 先修要求：计算机系统基础、数据结构与算法、编程基础
- 编程语言：C/C++/Rust 任选其一
- 课程难度：🌟🌟🌟🌟
- 预计学时：60 小时

北京大学的编译原理实践课程旨在实现一个从精简版的 C 语言 —— SysY 编译到 RISC-V 汇编的编译器。和其他提供了框架代码的课程不同，该课程给予了你极大的自由度，测试程序只会对你输出的汇编代码的正确性进行测试，而不会对你编译器的具体设计甚至使用的编程语言做任何限制。你需要从一个空文件夹开始一步步构建出独属于你自己的编译器。但平地起高楼即使对于北大的同学也是相当有难度的，因此课程助教 [@MaxXing](https://github.com/MaxXSoft) 在2022年对课程实验进行重大升级，为课程专门设计了一种中间表示 Koopa IR (intermediate representation)。Koopa IR 在设计上更为合理，在形式上类似于 LLVM IR，但简化了相当多的内容，只专注于实践需要的部分。与此同时，还为 Koopa IR 设计了配套的运行时库，你可以借助这套运行时库轻松地解析/生成/修改/输出 Koopa IR，完全不需要对其他无用的细节做过多考虑。另外，还有一份保姆级的文档将构建编译器这样一个大工程循序渐进地拆分成了9个小步骤，让任何愿意花时间的同学都可以更容易地实现自己的编译器。

以下内容摘自 @MaxXing 在其 [Blog](https://blog.maxxsoft.net/index.php/archives/145/) 中对该课程实验的介绍：

---

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

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

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

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

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

---

最后，向 @MaxXing 致以我崇高的敬意。—— from PKUFlyingPig