1. 说明
- 1.从原理上讲,对源程序进行语义分析之后就可以直接生成目标代码,但由于源程序与目标代码的结构往往差别很大,特别是考虑到具体机器指令系统的特点,要使翻译一次到位很困难,而且用语法制导方式机械生成的目标代码往往是烦琐和低效的,因此有必要设计一种中间代码,将源程序首先翻译成中间代码表示形式,以利于进行与机器无关的优化处理。
- 2.由于中间代码实际上也起着编译器前端和后端分水岭的作用,所以使用中间代码也有助于提高编译程序的可移植性。
- 3.常用的中间代码有后缀式、三元式、四元式和树等形式。
2. 后缀式
- 1.后缀式(逆波兰式)。
- 2.逆波兰式是波兰逻辑学家卢卡西维奇发明的一种表示表达式的方法。
- 3.这种表示方式把运算符写在运算对象的后面,例如,把a+b 写成 ab+,所以也称为后缀式。
- 4.这种表示法的优点是根据运算对象和运算符的出现次序进行计算,不需要使用括号,也便于用栈实现求值。
- 5.对于表达式 x:(a+b)*(c+d),其后缀式为 xab+cd+*:。
3. 树
- 1.树形表示。
- 2.例如,表达式 x:-(a+b)*(c+d)的树形表示为:
4. 三元式
- 1.三元式是由运算符 OP、第一运算对象 ARG1 和第二运算对象 ARG2 组成的。
- 2.例如,表达式 x:-(a+b)*(c+d)的三元式表示为:①(+,a,b) ②(+,c,d) ③(*,①,②) ④(:=,③,x)
5. 四元式
- 1.四元式是一种普遍采用的中间代码形式,其组成成分为运算符 OP、第运算对象 ARG1、第二运算对象 ARG2 和运算结果 RESULT。
- 2.运算对象和运算结果有时指用户自定义的变量,有时指编译程序引入的临时变量,RESULT总是一个新引进的临时变量,用来存放运算结果。
- 3.例如,表达式x:-(a+b)*(c+d)的四元式表示为:(+,ab,t1) ②(+,c,d,t2) ③(*,t1,t2,t3) ④(:=,t3,_,x)
6. 例题
6.1 例题1
1.将高级语言源程序通过编译或解释方式进行翻译时,可以先生成与源程序等价的某种中间代码。
以下关于中间代码的叙述中,正确的是(B)。
A.中间代码常采用符号表来表示
B.后缀式和三地址码是常用的中间代码
C.对中间代码进行优化要依据运行程序的机器特性
D.中间代码不能跨平台
1.常不采用符号表。
2.中间代码是进行与机器无关的优化处理,因此不依据机器特性,可以跨平台。