🎯 本课唯一目标
能
默写出编译的 5 个阶段、说出每个阶段干什么,并知道后面要学的每个题型(词法、LL(1)、算符优先、四元式、优化)
分别住在哪个阶段。
为什么第一课先学它? 两个理由都直接对着分数:①第 1 章概念题(选择/填空/简答)是送分题,必拿;②更重要的是,零基础最怕"学了一堆零件不知道装哪"。这张图就是收纳架——之后每学一个题型,你都往架子上对应的格子里一放,就不会乱。
一、编译程序到底是什么
编译程序(compiler)就是一个"翻译官"程序:把人写的高级语言源程序,翻译成机器能直接跑的目标程序(汇编/机器语言)[1]。翻译完,目标程序就能独立运行了。
它和解释程序(interpreter)的区别是经典考点,一句话记牢:
⚑ 必背对比
编译:先把整个源程序翻译成目标程序,再运行目标程序。(多一步产出,运行快)
解释:边翻译边执行,不产生目标程序。(无产出,灵活但慢)
二、编译的 5 个阶段(核心图)
源程序进来,像在流水线上被加工 5 道工序,最后吐出目标程序。每道工序的"输入→输出"都不同:
① 词法分析把字符流切成"单词"字符流 → 单词序列
→
② 语法分析按文法搭成语法树单词 → 语法树
→
③ 语义分析
+中间代码查类型,译成四元式语法树 → 中间代码
④ 代码优化等价变换,更快更省中间代码 → 优化的中间代码
→
⑤ 目标代码生成生成汇编/机器码,分配寄存器中间代码 → 目标程序
⟳ 表格管理(符号表)
⚠ 出错处理
这两项不是阶段,而是贯穿全程的辅助工作 ↑
■ 前端(与源语言有关、与机器无关):①②③+机器无关优化 |
■ 后端(与目标机有关):机器相关优化+⑤
逐格说人话(每格记一句就够)[2]:
- ① 词法分析(又叫扫描器):从左到右读字符,识别出一个个单词——关键字、标识符、常数、运算符、界符。
例:a = b + c → 单词串 a = b + c。这就是第 3 章要练的。
- ② 语法分析:按文法把单词组装成语法成分,搭出语法树,检查结构合不合法(括号配对?语句完整?)。
这是第 4、5 章(LL(1)、算符优先)的战场,分值最大。
- ③ 语义分析 + 中间代码产生:做类型检查、"变量先声明后使用"这类上下文检查;把程序译成与机器无关的中间代码(如四元式)。
中间代码=第 7 章。
- ④ 代码优化:在不改变运行结果的前提下,让代码更快/更省(删冗余、循环优化)。
=第 10 章。
- ⑤ 目标代码生成:把中间代码变成具体机器的汇编/机器码,分配寄存器。
🗺 把卷子贴到图上(你的收纳架)
第3章 → 阶段①|第2章(文法)是②的地基|第4、5章 → 阶段②|第7章 → 阶段③|第10章 → 阶段④。
看出来没有?老师划的重点,几乎全集中在"前端"——尤其是词法②和语法②。这就是复习火力的分配方向。
三、两个零碎但爱考的小概念
编译程序的结构(1.3):就是把上面 5 个阶段各做成一个"器"——词法分析器、语法分析器、语义分析与中间代码产生器、优化器、目标代码生成器,再加表格管理和出错处理两个贯穿模块[1]。
"遍 / 趟"(pass):对源程序(或中间结果)从头到尾扫描一次叫一遍。可以一遍编译,也可以多遍。
易混点:阶段是逻辑划分,遍是物理扫描次数,两者不必一一对应——一遍里可以同时做好几个阶段的活。
四、老师示范一题
例题 编译程序通常划分为哪几个阶段?其中哪些属于编译前端?符号表管理属于某个阶段吗?
答:通常划分为 5 个阶段——
词法分析、语法分析、语义分析与中间代码产生、代码优化、目标代码生成。
其中
前端包括:词法分析、语法分析、语义分析与中间代码产生,以及与机器无关的优化;目标代码生成(及机器相关优化)属于
后端。
符号表(表格)管理
不属于任何单一阶段,它和出错处理一样
贯穿编译全过程。
💡 答这类题的套路:先按顺序列 5 阶段 → 再答前/后端归属 → 点出"符号表和出错处理是贯穿全程、不是阶段"这个采分点。
五、你来做(练这一课的命)
点选项立即判分。做错没关系——错一次记得牢。这是主动回忆,比单纯看书有效得多。
1. 编译过程的第一个阶段是?
2. 把单词串按文法组织成语法树、检查程序结构是否合法,是哪个阶段?
3. 检查类型是否匹配、变量是否"先声明后使用",属于哪个阶段?
4. "在不改变运行结果的前提下让目标程序更快更省"指的是?
5. 不生成目标程序、边翻译边执行的语言处理程序是?
得分:0 / 5
口诀:词 → 语 → 义 → 中 → 优 → 目
(符号表 & 出错处理,贯穿全程不掉线)
📺 主源推荐(看一讲,半小时巩固)
哈工大《编译原理》国家精品课 ·
第 1 讲「绪论」(陈鄞),中文、考试导向,把本课内容讲一遍 ——
中国大学MOOC 课程主页[2]。时间紧就只看绪论这一讲。
🙋 这是你的课,不是单向讲义。任何一句没看懂、或想多要几道题——直接在对话里问我(你的老师)。比如:"再考我两道编译vs解释的题""把'遍'再讲清楚点"。
- [1] 编译程序定义、5 阶段划分与编译程序结构、前端/后端:陈火旺《程序设计语言编译原理》第 1 章(1.1–1.3);交叉印证见 龙书 (Compilers: Principles, Techniques, and Tools)。
- [2] 阶段职责与课程结构:哈工大《编译原理》国家精品课(中国大学MOOC),共 20 讲含绪论。