本文已收录到:中科大编译原理学习笔记 专题
中间代码的地位和作用
最简单的表示,抽象语法树直接翻译成目标代码(汇编代码)。
现代编译器会生成很多的中间表示,经过不断的翻译,最终才会生成汇编代码。
中间代码表示
经典的中间代码表示:
为什么要用中间代码表示?
- 从软降工程上考虑,分模块,容易实现,容易维护。
- 追求通用的编译器语言,可以编码不同的源语言: 。gcc可以选择源语言,都翻译成通用的中间语言。
三地址码
会把所有的操作变成原子操作:
三地址码的表示
三地址码的数据结构
如何生成三地址码?
以C–(一种类似C的精简化的语言)为例,左图的P代表程序;F代表函数;T代表形参数据类型,可以是int、bool等;S代表函数体,内部可以有print语句,可以有return,if,while语句等等。
右侧介绍了表达式语句,可以复制常数、变量、布尔值、+、&&等等。
具体还可以看视频:https://www.bilibili.com/video/BV17W41187gL?p=104
eg给语句(函数体内部)写生成三地址码的代码:
三地址码的优点
从三地址码生成汇编指令
只有跳转,没有复合结构。生成汇编指令其实就是查表直接翻译。
控制流图
三地址码的不足
以控制结构为例,控制流图能够回答“有多个地方可以跳转到L2”这种问题,其实控制流图在数据结构上就是有向图,对应的就是L2结点的入度是多少。而三地址码则无法回答这样的问题。
控制流图的基本概念
如何生成控制流图?
主要来讲经过三地址码生成控制流图。
由三地址码生成控制流图的算法
视频:https://www.bilibili.com/video/BV17W41187gL?p=108
对控制流图的操作
静态单赋值形式