CS21-编译原理

PKU: 编译原理实践

课程简介

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

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

以下内容摘自 @MaxXing 在其 Blog 中对该课程实验的介绍:


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

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

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

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

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

 

 

Stanford CS143: Compilers

课程简介

  • 所属大学:Stanford
  • 先修要求:计算机体系结构
  • 编程语言:Java 或 C++
  • 课程难度:🌟🌟🌟🌟🌟
  • 预计学时:150 小时

斯坦福的编译原理课程,设计者开发了一个 Classroom-Object-Oriented-Language,简称 COOL 语言。这门课的核心就是通过理论知识的学习,为 COOL 语言实现一个编译器,将 COOL 高级语言编译为 MIPS 汇编并在 Spim 这个 MIPS 模拟器上成功执行。

理论部分基本按照龙书的顺序覆盖了词法分析、语法分析、语义分析、运行时环境、寄存器分配、代码优化与生成等内容,实践部分则相应地分为词法分析、语法分析、语义分析、代码生成四个阶段,难度循序渐进,并在优化部分给学生留下了很大的设计空间。

课程资源

资源汇总

@skyzluo 在学习这门课中用到的所有资源和作业实现都汇总在 skyzluo/CS143-Compilers-Stanford – GitHub 中。

 

 

NJU: 编译原理

课程简介

  • 所属大学:南京大学
  • 先修要求:离散数学
  • 编程语言:Java
  • 课程难度:🌟🌟🌟
  • 预计学时:80 小时

南京大学的编译原理课程,设计者选用了当下热门的 ANTLR (ANother Tool for Language Recognition) v4 编程语言解析生成工具辅助教学,能让使用者专心词法或者语法分析的设计,而让 ANTLR 4 来生成重复的模板代码。IDE 也有其插件,装上后,可以实现即时的可视化语法树,方便学生理解。

ANTLR 4 是 LL 解析器生成器,比起 LR 和 LALR 解析器生成器,它可处理语法的范围相对狭窄。但另一方面其生成的解析器有易于理解和使用的优势。此外,因为其支持“无限长的 token 超前扫描”,所以可处理语法范围狭窄的问题也得到了很好的改善。

老师通过适当的图解和生活例子,幽默风趣地讲述编译原理,让人听来不算乏闷。尤其是今年这版,采取先实际使用 ANTLR 4 完成一些小例子,再补足理论知识的方式。让人能带着问题去找到适配的理论,更让人印象深刻。通过理论知识的学习,逐渐揭开 C 语言的“神秘面纱”。

理论部分基本按照龙书节奏叙述。包括词法分析、语法分析、语义分析、运行时环境、寄存器分配、代码优化与生成等内容。

实践则是本课程的亮点,一步步的,由简单到复杂地实现一个属于自己的编译器。

教授本课的老师极为慷慨,校外学生同样能享受到 Online Judge 以及参与课程讨论,老师还极为细心地整理历年来的学习资料,在课程网站里十分容易找到。

老师还把教学班的 Zulip 地址公开(若有变更,在课程网站也能找到),这意味着你有任何问题,都能在上面提问,同时你也能看到跟你一起学习的南大学生的问题,这些问题都会得到助教和老师的回答,所以我并不用再赘述踩了哪些坑或者经验,因为你能在一个平台上,和一帮正在学习相同内容的人,一起交流问题。

最大感受是,心里不再对实现一个编译器有畏难情绪,也不再无从下手,学完课程,会有一套初步的行之有效的思路,让我们面对挑战。

课程资源

 

 

KAIST CS420: Compiler Design

课程简介

  • 所属大学:KAIST
  • 先修要求:数据结构、计算机系统基础、Rust 编程基础
  • 编程语言:Rust
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:80小时

这门课程提供了一个 Rust 语言编写的编译器 KECC(KAIST Educational C Compiler) 框架代码,在此基础上构建编译器的一些核心部分,包括语法树打印、SSA中间代码生成、中间代码优化(包括 CFG 简化,GVN 等)以及目标代码生成。与其他编译器课程相比,本课程主要有以下特点:

  • 该课程面向真实的 C 语言而非自定义的玩具语言,并且会使用 C 语言 Fuzzing 工具 (Csmith) 进行测试。
  • 该课程注重实用性,对编译器前端理论涉及很少,第一个实验也是直接从抽象语法树的遍历开始,并不要求你手动完成前端。课程重点关注于 IR 的设计、生成和优化,以及 RISC-V 汇编代码生成。本课程对于理解和学习 LLVM 也很有帮助。
  • 课程配套视频有详细的代码讲解,对初学者友好。

课程资源

 

 

USTC: Principles and Techniques of Compiler

课程简介

  • 所属大学:中国科学技术大学
  • 先修要求:数据结构、计算机系统基础、C++ 编程基础
  • 编程语言:C++
  • 课程难度:🌟🌟🌟🌟
  • 预计学时:100小时

这门课程的理论部分内容广泛,既涵盖了传统编译原理课程的词法分析、语法分析、语法制导翻译、中间代码翻译,又覆盖了运行时管理、机器无关与面向机器的代码优化。实验部分则提供了 C++ 语言编写的Cminusf编译器框架代码,于6个实验中逐步构建一个具备现代完整流程的编译器。与其他编译原理课程的实验不同的是,本课程的实验采用现代LLVM的子集作为中间代码,更具前瞻性,同时包括了后端代码的生成和中间代码优化的部分,堪称国际一流的编译原理课程。

  • 课程实验使用脚本提供全面的自动化测试,并于课程主页提供了完整的教程。
  • 课程包含全套开源的课件、实验框架代码、实验教程,对初学者友好。
  • 课程实验循序渐进,逐渐增加难度,能让不同基础的学生都有收获。
  • 课程实验中Lab1使用Flex和Bison实现编译器前端,Lab2实现LightIR(LLVM子集)中间代码生成,Lab3实现后端代码生成龙芯汇编语言,Lab4实现中间代码优化,Lab5实现机器无关优化,Lab6实现寄存器分配。

课程资源

 

by csdiy.wiki

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...