KAIST CS420 Compiler Design: Building a Real C Compiler in Rust with KECC, SSA Optimization and RISC-V Code Generation
本文是 cs-self-learning 计算机自学指南对 KAIST CS420《Compiler Design》课程的完整导读。这门课程围绕用 Rust 写成的教学编译器框架 KECC(KAIST Educational C Compiler),引导学习者实现语法树打印、SSA 中间代码生成、IR 优化(CFG 简化、GVN 等)与 RISC-V 汇编生成等编译器后端核心模块,并直接面向真实 C 语言,借助 Csmith 模糊测试验证正确性。读完本文,你将掌握该课程的定位、前置要求、作业结构、自学路线,以及它在 cs-self-learning 编译器课程体系(CS143、NJU、USTC、PKU 等)中的取舍与位置。
课程基本信息
- 所属大学:KAIST(韩国科学技术院)
- 先修要求:数据结构、计算机系统基础、Rust 编程基础
- 编程语言:Rust
- 课程难度:🌟🌟🌟🌟
- 预计学时:80 小时
CS420 由 KAIST 并发与并行实验室(Concurrency and Parallelism Laboratory)主导开设。从 cs-self-learning 中另一门 Rust 入门课 CS220 的介绍可以看出,该实验室的 Jeehoon Kang 是 Rust 的积极推动者,同一教学团队还贡献了并发系统课程 CS431 与编译器课程 CS420,本课程正是他们"用 Rust 贯穿系统软件教育"思路的延续——先通过 CS220 掌握 Rust,再用 Rust 在 CS420 中实现编译器核心。
课程核心:基于 KECC 框架实现编译器
课程为学习者提供一套用 Rust 编写的编译器框架代码 KECC(KAIST Educational C Compiler)。与传统"从词法分析器写到代码生成器"的完整编译器课程不同,KECC 已为你打好骨架,你需要在此基础上补齐编译器的若干核心部分,主要包括:
- AST 打印:从抽象语法树的遍历开始,训练对语法结构的理解,也用于后续测试校验;
- SSA 中间代码生成:设计并生成基于静态单赋值形式(Static Single Assignment)的中间表示;
- 中间代码优化:包含 CFG(控制流图)简化、GVN(全局值编号,Global Value Numbering)等经典优化 pass;
- 目标代码生成:将优化后的 IR 翻译为 RISC-V 汇编。
这种分工让课程的重心明确落在编译器的"后半段"——中间表示的设计、生成与优化,以及面向真实指令集 RISC-V 的汇编代码生成。
与传统编译器课程相比的三大特点
面向真实 C 语言而非玩具语言
绝大多数编译原理课程会自创一门简化语言(如 Stanford CS143 的 COOL 语言、PKU 的 SysY、NJU 与 USTC 框架中的教学子语言),以缩小问题规模、聚焦教学重点。CS420 则直接面向真实的 C 语言,语法与语义的覆盖范围远超玩具语言,编译器的健壮性因此成为硬性要求。
为验证正确性,课程引入了 C 语言模糊测试工具 Csmith。Csmith 可以随机生成大量行为有定义、可预期的 C 程序,将编译器输出与参考行为对照,从而在巨大且随机的测试压力下暴露 IR 生成、优化与汇编生成阶段潜藏的错误——这是玩具语言课程通常无法企及的验证强度。
跳过前端、直击 IR 与代码生成的实用性导向
课程对编译器前端(词法分析、语法分析、语义分析)的理论涉及很少,也不需要你手工构造前端。第一个实验直接以抽象语法树的遍历为起点——前端部分已由框架完成。与之形成对比的是,Stanford CS143 将 4 个编程实验中的 3 个分配给前端、1 个分配给后端;NJU 借助 ANTLR 生成词法/语法分析模板;USTC 则使用 Flex/Bison 手写前端。CS420 刻意回避这条路线,把学习者的精力集中在课程最想强调的部分:IR 的设计、生成与优化,以及 RISC-V 汇编生成。
这种"实用主义"取舍的另一大收益是:由于课程采用的 SSA IR、优化 pass、指令选择等思路与 LLVM 高度同源,完成本课程对理解和学习 LLVM 也很有帮助。若你未来想阅读 LLVM 源码、使用 LLVM 生态做自研编译器,本课程是很好的前导训练。
配套视频含详细代码讲解,对初学者友好
课程配有完整的视频录像,其中包含逐段代码讲解(code tour),会带着学习者走读 KECC 框架中的关键实现。对于自学而言,"跟着视频读框架代码"能显著降低上手门槛,避免对着陌生的大型代码库无从下手。
课程资源
- 课程网站与仓库:https://github.com/kaist-cp/cs420
- 课程视频(YouTube 播放列表):https://www.youtube.com/playlist?list=PL5aMzERQ_OZ8RWqn-XiZLXm1IJuaQbXp0
- 课程教材:见课程仓库 README 的 Textbook 一节(https://github.com/kaist-cp/cs420?tab=readme-ov-file#textbook)
- 课程作业:见课程仓库 README 的 Homework 一节(https://github.com/kaist-cp/cs420?tab=readme-ov-file#homework-60)
仓库的 README 同时给出了教材清单与作业组织方式,是自学者获取一手资料的第一入口。
自学建议与前置准备
先补足 Rust 编程能力
CS420 的框架代码与作业全部基于 Rust,先修要求中明确包含 Rust 编程基础。如果 Rust 尚不熟练,建议先完成 KAIST CS220:Programming Principles 或斯坦福 CS110L(cs-self-learning 中 Rust 方向的课程还有 CS431),再进入 CS420。对 Rust 的所有权、借用检查、模式匹配、Result/Option 错误处理以及 crate 组织方式有手感后,阅读 KECC 框架会顺畅得多——IR 节点、作用域与所有权设计恰好是 Rust 风格系统软件的典型场景。
具备计算机系统与指令集基础
课程最终输出 RISC-V 汇编,因此先修要求包含"计算机系统基础"。建议至少理解寄存器、栈帧、调用约定、内存寻址等概念。若这部分基础薄弱,可先修读 cs-self-learning 中的 CSAPP(深入理解计算机系统)或体系结构方向的 CS61C(其大作业同样涉及 RISC-V 汇编与调用约定),会对理解代码生成阶段大有帮助。
学习策略
- 前几个实验先在视频代码讲解的引导下通读 KECC 框架,弄清楚测试如何驱动、AST 如何表示,再动手实现。
- SSA 相关概念(支配树、Phi 节点、控制流图简化)初次接触容易困惑,建议结合教材与实现双向对照理解。
- 优化部分建议小步迭代:先保证正确性,再验证每个 pass 的输出确实改变了 IR 形态,最后用 Csmith 生成的大规模程序做压力测试。
- 由于课程目标平台真实、验证强度高,不要期望"一次写对";把编译器的报错输出与中间 dump 当作调试工具来用。
在 cs-self-learning 编译器课程谱系中的定位
cs-self-learning 的编译原理板块收录了多门风格互补的编译器课程,可对照选择:
| 课程 | 语言/工具 | 目标语言 | 侧重 | 后端深度 |
|---|---|---|---|---|
| Stanford CS143 | Java 或 C++,手写 COOL 前端 | MIPS | 经典前端原理全覆盖 | 较弱 |
| NJU 编译原理 | Java + ANTLR 4 | 教学 IR/解释器 | 借助工具聚焦文法与中间代码 | 中等 |
| USTC 编译原理 | C++ | LoongArch,LLVM 子集 LightIR | 以 LLVM 子集为 IR 的完整编译器 | 强 |
| PKU 编译原理实践 | C/C++/Rust 任选 | RISC-V,自研 Koopa IR | 从零手写,自由度高 | 强 |
| KAIST CS420(本文) | Rust | RISC-V | 真实 C 语言 + SSA 优化 + 汇编生成 | 强 |
CS420 的独特价值在于组合了三个"稀有"要素:Rust 实现、真实 C 语言(配合 Csmith 模糊测试)、以及 SSA 到 RISC-V 的完整后端链路。相比 CS143 的前端训练、PKU 的"从零自由发挥"和 USTC 的 LLVM 子集路线,CS420 更接近"以现代工业级优化编译器为参照、用工程化手段做后端"的形态,也是理解 LLVM 如何工作的一条高效捷径。
如果你已完成 CS220 并掌握 Rust,同时想体验"真实 C 语言 + SSA 优化 + RISC-V 目标代码生成"的完整现代编译器后端开发,KAIST CS420 是难度适中(四星、约 80 小时)、工程收益显著的选择。英文原文见 CS420.en.md,中文版见 CS420.md。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0629
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python07
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00