logo
COMP91026 学分

编程语言与编译器

新南威尔士大学·University of New South Wales·悉尼

COMP9102《编程语言与编译器》是 新南威尔士大学 的公开课程页面。当前可确认的信息包括 6 学分,难度 超难,公开通过率 75%。 页面已整理 10 周教学安排,3 个重点考核,方便你快速判断工作量、考核结构和适配度。 课程简介摘要:课程定位 COMP9102/3131 是 UNSW 计算机专业在‘编程语言底层与系统构建’维度的顶级硬核课。

💪 压力
5 / 5
⭐ 含金量
5 / 5
✅ 通过率
0%

📖 课程概览

选课速读: COMP9102《编程语言与编译器》是 新南威尔士大学 的公开课程页面。当前可确认的信息包括 6 学分,难度 超难,公开通过率 75%。 页面已整理 10 周教学安排,3 个重点考核,方便你快速判断工作量、考核结构和适配度。 课程简介摘要:课程定位 COMP9102/3131 是 UNSW 计算机专业在‘编程语言底层与系统构建’维度的顶级硬核课。
### 课程定位 COMP9102/3131 是 UNSW 计算机专业在‘编程语言底层与系统构建’维度的顶级硬核课。它解决了开发者对代码执行的终极好奇:你写的 Java/C 代码是如何一步步被翻译成机器指令的?如何设计并实现你自己的编程语言?它是通往编译器工程师、静态分析专家、及底层虚拟机研发岗位的唯一专业通行证。它将经典的有限自动机、上下文无关文法与现代中间表示 (IR) 优化深度整合,是培养‘具备语言设计能力顶尖开发者’的必修课。 ### 技术栈与学习内容 课程以 Java/C++ 为编译器实现语言。学习内容涵盖:词法分析 (Lexical Analysis) 与正则文法、语法分析 (Parsing)——包括 LL(k) 与 LR(k) 算法推导、语义分析 (Semantic Analysis) 与符号表、以及中间代码生成。进阶模块涵盖:运行时环境 (Runtime)、目标代码生成、以及最为核心的‘基本块优化与数据流分析’。此外,课程引入了简单的类型检查系统证明。学生将学习如何手写一个完整的编译器前端与后端。课程强调‘语法定义的严密性与代码翻译的高效性’。 ### 课程结构 10 周理论高强度输出与两个极具挑战的编译器项目结合。评估体系以‘工程复杂度’闻名:包含针对自动机状态转移手算的期中 Quiz、一个要求‘从零实现一个完整编译器’的大型项目(Major Project,涉及从 Lexer 到 Code Gen 的全流程)、以及一场强调文法判定、移进-归约冲突分析与优化路径推演能力的期末综合大考。该课极其强调‘逻辑自洽的翻译闭环’。 ### 适合人群 计算机硕士大三/大四、或打算挑战底层系统开发的开发者。必须具备极其扎实的算法与数据结构基础。如果你想搞清楚‘为什么你的 IDE 能实时报错’、或者渴望在未来的特定领域语言 (DSL) 研发中建立技术壁垒,这门课是你的神功。建议每周投入 30 小时以上进行代码递归打磨。

🧠 大神解析

📊 课程难度与压力分析

COMP9102 是计算机系‘硬核度’的终极试金石。难点不在于某种语言,而在于‘递归的递归’。当你手动实现 LALR 分析器并面对‘移进/归约冲突’时,你会体验到逻辑上的高度抽象。压力主要来自于编译器项目,你需要手写数万行 C++ 或 Java 代码,如果你的 AST 构造在根节点漏了一个指针,你的编译器会在生成代码时产生‘静默逻辑错误’,让你在排查时想死。及格容易(只要 Lexer 和 Parser 跑通),但拿 HD 需要你的编译器不仅能运行,还要实现高效的寄存器分配优化。挂科风险显著存在于对‘左递归消除’逻辑理解不透彻导致的 Parser 死循环上。

🎯 备考重点与高分策略

高分秘籍:‘得 SLR/LR 分析表构造者得 Distinction,得三地址码转换者得 HD’。期末考试中,画出一个特定文法的 LR(0) 状态机并标注所有可能冲突是必考的 20 分大题。一定要练到能秒写出‘While 循环的 TAC 翻译模板’。重点攻克‘基于图着色法的寄存器分配逻辑’,那是区分普通码农与顶级编译器专家的标志。备考时,教材《Compilers: Principles, Techniques, and Tools》(龙书) 是唯一的圣经。对于项目,HD 的关键在于‘稳健的报错机制’——不仅对的代码能运行,错的代码要能给出精准的行号提示。重视 Tutorial 里的每一道 First/Follow 集推演题。

📚 学习建议与资源推荐

神级资源:Stanford 的 CS143 编译器课件和‘Lex & Yacc’官方手册。如果文法判定理解不了,强烈推荐去 B 站搜‘编译原理 哈尔滨工业大学’。最重要的建议:养成‘先写文法规范 (EBNF),再敲解析器’的习惯。利用好 Python 的 `PLY` 库进行简单的原型验证。学会使用 `gdb` 的内存断点来追踪 AST 的异常节点。加入 UNSW 的 Systems 实验室。训练你的‘形式化思维肌肉’。

⚠️ 作业与 Lab 避坑指南

项目避坑:千万不要在第 10 周才跑后端生成!汇编指令的寻址模式(Addressing modes)坑极多,建议预留时间调试栈帧对齐。Assignment 写作中,严禁只贴成功运行的截图,必须写出你的‘优化算子有效性证明’——为什么你的公共子表达式消除能减少 20% 指令?此外,注意 Final 考试有 Hurdle 要求,关于‘文法等价变换定义’的基础题如果错太多会直接挂。考试时,带好直尺,画出的状态转移图必须清晰标准。注意:分清‘合成属性’与‘继承属性’在语义分析中的角色差异。

💬 过来人经验分享

学长建议:这门课是为你进入顶级大厂底层组(如 Oracle JVM 组或 Apple LLVM 组)拿的‘神谕通行证’。学完后,你眼中的代码不再是死的字符,而是一个由语法树、活性分析和生存期轨迹构成的完美转换体。建议找一个同样追求‘代码洁癖’的队友共同打磨编译器。拿 HD 的关键:在报告中展现出你对‘循环展开与指令流水线协同优化’的深刻理解。坚持住,通关 9102,你就真正跨过了从代码使用者到语言缔造者的那道永恒红线。这张成绩单是申请高端系统岗位最硬的门票。记住:最好的程序员,都在写制造程序员的工具。

📅 每周课程大纲

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 状态机,考场上时间不够。

📋 课程信息

学分
6 Credit Points
含金量
5 / 5
压力指数
5 / 5
课程类型
elective

💬 学生评价

💭

还没有同学评价这门课,成为第一个分享体验的人吧

写点评