编译器定义
编译器是将 程序设计语言 源程序翻译为等价目标程序的程序。
- 源语言:源程序所使用的语言
- 目标语言:目标程序所使用的语言
- 宿主语言:编译器自身的实现语言
交叉编译 重点
在一种平台上运行编译器,生成另一种平台可执行的目标代码。常用于嵌入式开发和跨平台移植。
T 形图 重点
描述编译器自举(Bootstrapping)过程的工具。T 形图的三臂分别表示:
- 左臂:源语言
- 右臂:目标语言
- 底部:宿主语言
多个 T 形图可以组合,描述编译器从低级语言逐步自举到高级语言的过程。
T 形图编译器移植例题
问题:在机器 上有 C 编译器(源=C,目标=,宿主=)。欲在 上生成 的 C 编译器,如何实现?
解法(三步自举):
- 修改 C 编译器后端,生成 代码(源=C,目标=,宿主=)→ 得到交叉编译器
- 用(1)的交叉编译器在 上编译 C 编译器源码(源=C,目标=,宿主=)→ 得到 上的自托管编译器
- 在 上用(2)的结果再次编译 C 编译器源码,验证自举成功
重点 T 形图是编译器自举和移植的工具,考试可能出组合题。
编译器七阶段架构 重点
编译器在逻辑上可分为七个阶段,前四个阶段构成前端,后两个阶段构成后端,此外还有两个辅助模块贯穿始终。
前端
- 词法分析:读入字符流,识别单词,输出 Token 序列(→ 正规式、有限自动机)
- 语法分析:根据文法将 Token 序列组织为语法树(→ 文法基础、LL1分析、LR分析)
- 语义分析:检查语义正确性,进行类型检查(→ 语法制导翻译)
- 中间代码生成:生成独立于机器的中间表示(→ 中间语言、赋值与控制流语句翻译)
后端
辅助模块
- 符号表管理:记录源程序中使用的标识符及其属性(→ 符号表与说明语句翻译)
- 出错处理:检测、报告错误并进行恢复(→ 语法分析中的错误处理)
遍(Pass)的概念 重点
遍是对源程序或其中间表示进行一次完整的扫描。一遍可以包含多个阶段,一个阶段也可以跨越多遍。
- 单遍编译:一次扫描完成所有阶段,速度快但难以优化
- 多遍编译:多次扫描,每遍生成中间文件,便于优化但速度慢
字母表与字符串
字母表
非空有穷符号集合,记为 。
字符串
字母表上的有穷符号序列。字符串 的长度记为 。
- 前缀:从字符串头部开始的连续子串
- 后缀:从字符串尾部开始的连续子串
- 子串:字符串中连续的任意子序列
- 连接:将两个字符串拼接,记为 或
- 方幂:字符串自身连接 次,记为 ; 表示长度为 的所有字符串集合