Week 1编译器流水线
📖核心知识点:编译器的分层架构——前端(词法+语法+语义)、中端(IR 优化)、后端(代码生成与寄存器分配)的职责与交互。理解为什么解耦设计使得一个前端可以对接多个后端(如 GCC 支持多 ISA)。源语言→Token 流→AST→IR→机器码的完整数据流。⏰本周节奏:概念导入周,需阅读编译器项目的代码框架。🎯考试关联:编译器各阶段的输入/输出对应关系是必考基础题。🧪Tutorial/Lab:搭建项目环境,分析提供的 Skeleton 代码。📌作业关联:编译器项目的第一阶段将在本周启动。⚠️易错点:混淆编译时与运行时的处理边界;不理解中间表示的必要性。
Week 2扫描与正则匹配
📖核心知识点:词法分析器(Scanner)的核心——正则表达式→NFA→DFA 的转换链。Thompson 构造法将正则转为 NFA,子集构造法将 NFA 转为 DFA,最后通过 Hopcroft 算法最小化 DFA。Flex/Lex 工具的实际应用:规则定义、状态管理与 Token 生成。⏰本周节奏:NFA/DFA 转换需大量手推练习。🎯考试关联:正则→NFA→DFA 的手动转换是期末必考计算题(约 10-15 分)。🧪Tutorial/Lab:使用 Flex 生成词法分析器并测试 Token 识别。📌作业关联:编译器项目——实现完整的词法分析模块。⚠️易错点:子集构造中遗漏 ε-closure;DFA 最小化时等价类划分不彻底。
Week 3解析技术 (1)
📖核心知识点:上下文无关文法(CFG)的定义、推导与分析树。自顶向下解析——递归下降解析器(Recursive Descent Parser)的手动实现方法。LL(1) 文法的判定条件:FIRST 集和 FOLLOW 集的计算,以及预测分析表的构建。消除左递归与提取左公因子的文法变换技巧。⏰本周节奏:FIRST/FOLLOW 计算需大量练习。🎯考试关联:FIRST/FOLLOW 计算与 LL(1) 判定是期末高频题(约 15 分)。🧪Tutorial/Lab:手算给定文法的 FIRST/FOLLOW 集。📌作业关联:编译器项目——实现递归下降解析器。⚠️易错点:FOLLOW 集计算中遗漏产生式尾部的传播;左递归消除后文法的语义保持问题。
Week 4解析技术 (2)
📖核心知识点:自底向上解析——LR 解析框架:LR(0)、SLR(1)、LALR(1) 的项集构造与状态机生成。Shift-Reduce 冲突与 Reduce-Reduce 冲突的识别与解决策略。Bison/Yacc 工具的实际应用:语法规则定义、优先级与结合性声明、错误恢复机制。理解为什么 LALR(1) 在实践中最为流行。⏰本周节奏:LR 解析状态机构建是全课最难的手推内容之一。🎯考试关联:LR 项集构造与 Action/Goto 表填写是期末大题(约 15-20 分)。🧪Tutorial/Lab:使用 Bison 定义语法规则并解决冲突。📌作业关联:编译器项目——集成 Bison 生成的解析器。⚠️易错点:项集闭包计算遗漏;Shift-Reduce 冲突解决时优先级规则误用。
Week 5语义分析
📖核心知识点:抽象语法树(AST)的构建——从解析树到 AST 的精简过程。属性文法(Attribute Grammar)与语法制导翻译。类型系统的实现:类型检查规则、隐式类型转换(Coercion)、作用域规则与符号表(Symbol Table)的设计。理解类型等价性判定(结构等价 vs 名称等价)。⏰本周节奏:从理论转向实现,需结合项目代码理解。🎯考试关联:类型检查规则与符号表查找是常考概念题。🧪Tutorial/Lab:为编译器添加类型检查模块。📌作业关联:编译器项目——AST 构建与语义分析阶段。⚠️易错点:嵌套作用域中符号表的入栈/出栈时机错误;忘记处理函数重载或前向声明。
Week 6灵活性周 (Flex Week)
📖核心知识点:无新内容。利用本周完善编译器项目前端(Scanner + Parser + 语义分析),确保能正确解析并类型检查所有测试用例。⏰本周节奏:80% 时间用于项目编码与测试,20% 复习前半学期理论。🎯考试关联:前半学期内容约占期末 50%。🧪Tutorial/Lab:项目答疑。📌作业关联:编译器项目前端截止通常在 Flex Week 附近。⚠️易错点:只测试简单用例,忽略嵌套结构、边界条件和错误输入的处理。
Week 7中间表示 (IR)
📖核心知识点:三地址码(Three-Address Code)作为核心 IR 形式——四元式(op, arg1, arg2, result)与三元式的对比。基本块(Basic Block)的划分规则与控制流图(CFG)的构建。SSA(Static Single Assignment)形式的基本概念与优势——为什么 SSA 简化了数据流分析和优化。IR 层级选择:高级 IR vs 低级 IR 的设计取舍。⏰本周节奏:从前端转向后端,思维方式需要切换。🎯考试关联:三地址码生成与 CFG 构建是期末常考题。🧪Tutorial/Lab:将 AST 转换为三地址码 IR。📌作业关联:编译器项目——实现 IR 生成模块。⚠️易错点:控制流语句(if/while)的跳转目标标签管理混乱;短路求值(Short-circuit Evaluation)的 IR 生成逻辑错误。
Week 8代码生成基础
📖核心知识点:从 IR 到目标机器代码的映射。寄存器分配策略——图着色算法(Graph Coloring)的基本思路:构建干涉图、着色、溢出处理。基本块内的指令选择与调度。指令选择的树匹配方法(Tree Pattern Matching)。简单的窥孔优化(Peephole Optimization):冗余存储-加载消除、强度削减。⏰本周节奏:需理解目标架构基础(x86 或 ARM 指令子集)。🎯考试关联:寄存器分配与简单代码生成是期末考的中等难度题。🧪Tutorial/Lab:实现简单的线性扫描寄存器分配。📌作业关联:编译器项目——实现后端代码生成。⚠️易错点:寄存器溢出到栈时偏移计算错误;函数调用约定(Calling Convention)的寄存器保存不完整。
Week 9运行时环境
📖核心知识点:程序运行时的内存布局——代码段、数据段、堆(Heap)与栈(Stack)的组织。函数调用的活动记录(Activation Record / Stack Frame)结构:参数、返回地址、旧帧指针、局部变量的排列顺序。闭包(Closure)的实现原理——如何捕获词法作用域中的自由变量。垃圾回收(GC)算法简介:标记-清除、引用计数的优缺点。⏰本周节奏:理论性强,需理解调用栈的物理布局。🎯考试关联:活动记录结构与闭包实现是期末概念题。🧪Tutorial/Lab:分析编译器生成代码的栈帧布局。📌作业关联:编译器项目——确保函数调用与返回的正确性。⚠️易错点:caller-save vs callee-save 寄存器的责任划分混淆;嵌套函数的访问链(Access Link)实现错误。
Week 10基本优化与总结
📖核心知识点:编译器优化概览——常量折叠(Constant Folding)、常量传播(Constant Propagation)、死代码消除(Dead Code Elimination)、公共子表达式消除(CSE)。循环优化初步:循环不变代码外提(Loop-Invariant Code Motion)、强度削减(Strength Reduction)。全学期知识串联——从源代码到可执行文件的完整编译流水线回顾。⏰本周节奏:优化内容为了解层面,重点在期末复习。🎯考试关联:基本优化的识别与应用可能出 5-10 分;期末覆盖全部内容。🧪Tutorial/Lab:期末复习与模拟测试。📌作业关联:编译器项目最终提交。⚠️易错点:优化后程序语义改变(特别是有副作用的表达式);复习时忽略手推 LR 状态机,考场上时间不够。