# P523-Rust **Repository Path**: saltedf/P523-Rust ## Basic Information - **Project Name**: P523-Rust - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-12-29 - **Last Updated**: 2021-12-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # P523-Rust P523 经典编译器课程的 Rust 引导 P523 是一门经典的编译器课程,由 Chez-Scheme 的作者 R. Kent Dybvig 和他的助手教授。十年过去了,[还有人](https://news.ycombinator.com/item?id=20419390)想学习这门课程。 Kent 是谁? > 如果你上了 Kent 的课,再来看看普通的编译器书籍(比如有名的 Dragon Book),或者 LLVM 的代码,你就会发现 Kent 的水平其实远在这些知名的大牛之上。我为什么可以这么说呢?因为如果你的水平不如这些人的话,你自己都会对这种判断产生怀疑。而如果你超过了别人,他们的一言一行,他们的每一个错误,都像是处于你的显微镜底下,看得一清二楚。这就是为什么有一天我拿起 Dragon Book,感觉它变得那么的幼稚。而其实并不是它变幼稚了,而是我变成熟了。实话实说吧,在编译器这个领域,我觉得 Kent 很有可能就是世界的 No.1。—— Chez Scheme 的传说 这里是基于 P523 的一个 Rust 作业框架及引导,供爱好者取用。为了提振信心,可以读一读王垠的 [Chez Scheme 的传说](http://www.yinwang.org/blog-cn/2013/03/28/chez-scheme)。 > Kent 的课程编译器有很好的结构,它被叫做“nanopass 编译器构架”。它的每一个 pass 只做很小的一件事情,然后这些 pass 被串联起来,形成一个完整的编译器。编译的过程,就是将输入程序经过一系列的变换之后,转化为机器代码。你也许发现了,这在本质上跟 LLVM 的构架是一样的。但是我可以告诉你,我们的课程编译器比 LLVM 干净利落许多,处于远远领先的地位。—— Chez Scheme 的传说 ### 初心 见 [Rust-One-Piece](https://zhuanlan.zhihu.com/p/259594199) 初心部分。 以及[倔强的程序员](https://zhuanlan.zhihu.com/p/165524567) ### 准备 + Rust Nightly + GCC Rust 起码读了一遍 the book 。 当然,如果你想尝试原汁原味的 P523,可以试试[这个](https://github.com/siriusdemon/iub_2009_P523_framework),热心人士所整理。 ### 这是一个引导 这是一个引导,不是教程。尤其不是 build-your-own-x 那种类型的教程。基本上,你是在自学 P523 这个课程。当然,PDF 只能算是一些辅助材料,你缺乏 Kent 给你讲课的学习过程。因此,这就是这个引导的目的。我把我曾遇到的一些问题的解决思路稍微分享一下,希望能够起到一点正面的作用,但能从 P523 中学习到多少完全在于你自己。 在我的构想中,你应该从 [adventure](./adventure) 的代码出发,然后一路用你的代码披荆斩棘,一直到你最终完成 A15。虽然,这似乎有点难。但是,如果你能够完全掌握 A1,你就应该有信心能够完成 A2,A3……直到 A15。adventure 的代码跟 A1 是完全一样的。 在涉及到 parser 的地方,你可以选择自己写,也可以直接复制对应章节的我的代码(包括 parser.rs 和 syntax.rs)。因为 parser 并不是 P523 的重点,你可能不想在这上面花时间。 我推荐以下的做法 0. 阅读 Kent 的讲义 1. 修改 syntax (或者复制) 2. 修改 parser (或者复制) 3. 修改 compiler 4. 增减 test ### 引导 [guide](./guide) 我的代码中有不少错误(见 [Ending](./Ending.md)),不过你应该自己完成这个旅途。 祝你旅途愉快! > 理想开花,桃李要结甜果; 理想抽芽,榆杨会有浓荫。 请乘理想之马,挥鞭从此启程, 路上春色正好,天上太阳正晴。