目录
本标签讲述将程序设计语言转换成可执行代码时使用的技术、数据结构、算法。
1 模块与接口
图中展示了一个典型编译器的各个阶段,每个阶段由一至多个软件模块来实现。分成多个阶段为了能够重用它的各种构件。
“思考-实现-重新设计”
各个阶段描述
章号 | 阶段 | 描述 |
---|---|---|
2 | 词法分析 | 源文件 -> 一个个独立的单词符号 |
3 | 语法分析 | 分析程序的短语结构 |
4 | 语义动作 | 建立每个短语对应的抽象语法树 |
5 | 语义分析 | 确定短语含义,建立变量和其声明的关联,检查表达式类型,翻译短语 |
6 | 栈帧布局 | 按机器要求将变量、函数参数等分配于栈帧内 |
7 | 翻译 | 生成中间表示树(IR-tree),一种与语言和目标机体系结构无关的表示 |
8 | 规范化 | 提取表达式中的副作用,整理条件分支,便于下阶段处理 |
9 | 指令选择 | 将IR-tree结点组合成与目标机指令相对于的块 |
10 | 控制流分析 | 分析指令顺序,建立控制流图 |
10 | 数据流分析 | 收集程序变量的数据流信息 |
11 | 寄存器分配 | 为程序中变量和临时数据选择寄存器 |
12 | 代码流出 | 用机器寄存器替代每一条机器指令中出现的临时变量名 |
2 工具和软件
Context-free grammar用于语法分析&Regular expression用于词法分析。
在Linux系统中使用Lex和Yacc工具(Flex & Bison)。
3 树语言的数据结构
直线式程序(straight-line program):
文法:
一段程序在编译器内部表示方式:
- 源代码表示
- 树表示,例如: