编译原理 第八章 源程序的中间形式
第八章 源程序的中间形式
一般编译程序都生成中间代码,然后再生成目标代码。
优点是:可移植(与具体目标程序无关) 且易于代码优化
8.1 波兰表示
即后缀表示式
由中缀表达式翻译为波兰表示算法较容易实现。构造一个类似算法优先分析法的算法即可。
波兰表示法
优点:
- 在不使用括号的情况下可以无二义地说明算术表达式
- 波兰表示法更容易转换成机器的汇编语言或机器语言。(操作数出现在紧靠操作符的左边,而操作符在波兰表示中的顺序即为进行计算的顺序。)
- 波兰表示不仅能用来作为算术表达式的中间代码形式, 而且也能作为其它语言结构的中间代码形式。
缺点:
- 优化不是十分方便
如:if 语句的波兰表示
BZ:二目操作符。若expr结果为false,则产生一个
BR:一目操作符。产生一个
8.2 N-元表示
在该表示中,每条指令由 n 个域所组成,通常第一个域表示操作符,其余为操作数。
常用的n元表示是:三元式、四元式
三元式
条件语句的三元式:
其中:
BMZ:二元操作符,测试第二个域的值。若 <=0,则按第3个域的地址转移。若为正值则该指令作废
BR:一元操作符,按第3个域做无条件转移
三元式的缺点:
不便于代码优化。
由于优化要删除一些三元式,或对某些三元式的位置要进行变更。三元式的结果(编号)也是某个三元式的操作数,随着三元式位置的变更也应作相应的修改。
间接三元式
便于在三元式上做优化处理。核心为将执行顺序与三元式编号分离,这样在优化时三元式可以不变,而仅仅改变其执行顺序表。
相当于三元式会写下所有操作,例如在优化时要去掉所有的重复三元式。而在间接三元式中不出现重复的三元式,转而用操作代表重复操作。这样就利于代码优化。
四元式表示
通常是编译时分配的临时变量,可由编译程序分配一个寄存器或主存单元。
其中T1~T4为临时变量。用四元式优化比较方便
8.3 抽象机代码
既然是“抽象机”,就是表示它并不是实际的物理目标机器而通常是虚拟的一台“堆栈计算机”。该堆栈式计算机主要由若干寄存器、一个保存程序指令的储存器和一个堆栈式数据及操作存储组成。
寄存器有:
- PC-程序计数器
- NP-New指针,指向“堆”的顶部。“堆”用来存放由NEW生成的动态数据。
- SP-运行栈指针,存放所有可按源程序的数据声明直接寻址的数据。
- BP-基地址指针,即指向当前活动记录的起始位置指针。
- 其他(如MP—栈标志指针,EP—极限栈指针等)
运行P-code的抽象机没有专门的运算器或累加器,所有的运算(操作)都在运行栈的栈顶进行。
例:进行 d:=(a+b)*c的运算,生成P-code序列(实际上是波兰表示形式的中间代码)


中间代码生成实例——翻译成后缀式
死代码原因:由于在if的stm1中有一句goto L 因此若满足初始条件k>i+j,就会一直进入此"循环",直到不满足到else语句。因此j 29永远不会执行到。

浙公网安备 33010602011771号