编译器构造
编译器的结构
语义检查后,代码由中间代码表示。
中间码是语法成分的语义结构表达。
中间语言
- 从低级语言过渡到高级语言
- 与机器无关
- 源语言和目标语言之间的一致性
- 它使编译器的结构逻辑简单
中间语言表达式
x = a * b + c
逆波兰(RPN)形式
Reverse Polish notation也称为后缀
图形(语义树)
- 抽象语法树
- 有向无环图
三地址码表达形式
四地址码表达形式
三地址码
三地址码(TAC)是表示编译器使用的中间码的一种形式。
三个地址代码中的每条指令都可以描述为四元组(有时也称为“四元组”)。
(运算符、操作数1、操作数2、结果)
三地址码(TAC)指令
三地址码的使用和特点
即使某些指令使用的操作数多于或少于两个,术语“三地址码”仍被使用:
- 经典、无操作数
- 这种格式的中间代码的读取操作都是相同的长度
三种地址码的主要特点是:
- 每条指令只执行一个基本操作
- 源和目标可以引用任何可用的寄存器
文字表
文字表类似于符号表,只是其条目是输入流中出现的值的任何文字表示。
例如,数字文字,如整数文字(“3”、“109”)或浮点/实数文字(“3.14”或其他浮点数符号)。
或字符文字(‘a’,‘1’)
或字符串文字(“hello,world!”)
- 通过将它们保存在表中,编译器可以使用它们在表中的地址来引用它们,而不是直接使用文本
1)同样,它通过符号表中的地址引用符号
2)但请稍后查看可能的优化 - 其中一些表可以由语法分析器填充。
1)字符串文本,例如每当遇到常量字符串时
2)除了查找之外,该表还可用于后期生成输出二进制文件中的静态值块 - 其他可以作为函数“填充”
1)integerTable = func(key)=>index
2)floatTable = func (key)=>key
优化阶段
- 这些改进是优化阶段的一部分
1)这些改进与生成的特定机器代码无关
2)当解析器检查实际生成的代码时,可能会有进一步的优化 - TAC表示的优点之一是它比解析树表示更容易优化
Thanks to Dr. John: Some contents are from their slides.