复习材料,不建议阅读
编译
几种程序
- 翻译程序:把一种语言程序转换成另一种功能等价的语言程序。(源语言->目标语言)
- 编译程序:一种翻译程序,把高级语言翻译为低级语言。
- 解释程序:一种翻译程序,立即执行源程序,通常是逐句翻译。
高级语言处理过程

主要涉及预处理程序、编译程序、汇编程序、装配连接程序。
需预处理源程序->源程序->目标语言->机器码->绝对机器码
编译做什么

- 词法分析
- 语法分析
- 语义分析
- 中间代码生成
- 代码优化
- 目标代码生成
词法分析
对源程序字符串扫描分解,识别出单词符号。(拆分字符串)
例如
1 | main() |
词法分析后的输出:
1 | 保留字 main |
语法分析
根据语言的语法规则对符号序列进行语法分析,识别出语法短语,判断语法是否正确。(识别短语,判断正确)
输入输出都是单词序列。
语义分析
对语法分析的结果分析语义错误,收集类型信息。(语义,类型)
中间代码生成
把源程序变成结构简单、含义明确、易生成目标代码的形式。
代码优化
对中间代码或目标代码进行变换改造等优化处理,提高效率。
目标代码生成
将语义分析结果或中间代码变成目标代码。(一般是汇编等)
也就是说可以跳过中间代码直接生成汇编。
编译阶段
前后端组合法
-
前端:与源语言有关,目标机无关部分。(1-4阶段)
-
后端:与目标机有关部分。(6阶段)
5阶段前后都可。
也就是语言对应前端,机器架构等对应后端。
遍组合方式
分多趟/遍,每次完成一个或几个阶段工作。通过源语言与目标机器的特征分遍。
例子
Zig 编译至 arm64 机器码
前端
- zig 切分为 token 构造抽象语法树(AST)
- 语义分析与 comptime 计算
- AST 线性化为 AIR 中间表示
后端
- 转为 LLVM IR 并优化
- 生成 AARCH64 机器码
- 连接标准库等生成最终产物