适合读者:软考中级备考同学
阅读时间:3.5分钟
内容:中间代码的作用、逆波兰表示、三元式、四元式的定义与示例、对比、例题
1. 为什么需要中间代码?
编译程序在完成语法分析和语义分析后,会生成一种介于源语言和目标语言之间的表示,称为中间代码(Intermediate Code)。中间代码的作用包括:
- 便于后续的代码优化
- 便于目标代码生成
- 可移植性好(同一中间代码可翻译为不同机器的目标代码)
软考中常考查三种常见中间代码形式:逆波兰表示(后缀式)、三元式、四元式。
2. 逆波兰表示(Reverse Polish Notation, RPN)
2.1 定义
逆波兰表示是一种不需要括号的表达式表示法,将运算符写在操作数之后,也称为后缀表示。计算时使用栈:遇到操作数压栈,遇到运算符则弹出所需数量的操作数计算,结果压回栈。
2.2 转换方法(中缀 → 后缀)
- 操作数保持原来顺序
- 运算符按优先级和结合性移到后面
- 括号决定顺序,但最终结果无括号
2.3 示例
中缀表达式:a + b * c
后缀:a b c * +
中缀:(a + b) * c
后缀:a b + c *
2.4 优点
- 简单,易于计算机处理(栈计算)
- 不产生临时变量
2.5 缺点
- 不便于优化(无法显式表示子表达式共享)
- 不便于代码生成(需重排)
3. 三元式(Triple)
3.1 定义
三元式是一种三个字段的表示形式:(op, arg1, arg2),其中op为运算符,arg1和arg2为操作数(可以是变量、常量或另一个三元式的编号)。计算结果通过三元式的序号引用。
3.2 示例
表达式a + b * c的三元式序列:
(1) (*, b, c) (2) (+, a, (1))其中(1)表示第一个三元式的结果。
3.3 优点
- 紧凑,节省存储
- 便于引用中间结果
3.4 缺点
- 当需要移动、删除或优化三元式时,序号引用可能失效(需修改所有引用处)
4. 四元式(Quadruple)
4.1 定义
四元式是四个字段的形式:(op, arg1, arg2, result)。result是存放结果的临时变量。四元式更接近三地址代码。
4.2 示例
表达式a + b * c的四元式序列:
(1) (*, b, c, t1) (2) (+, a, t1, t2)其中t1、t2是编译器生成的临时变量。
4.3 优点
- 显式命名中间结果,易于优化(可修改临时变量名)
- 便于后续目标代码生成(直接映射到寄存器)
- 是大多数实际编译器的选择(如三地址代码)
4.4 缺点
- 需要生成大量临时变量,稍占用更多存储
5. 三种中间代码对比表
| 对比项 | 逆波兰 | 三元式 | 四元式 |
|---|---|---|---|
| 结构 | 线性序列(操作数+运算符) | (op, arg1, arg2) | (op, arg1, arg2, result) |
| 显式临时变量 | 无 | 无(用序号引用) | 有(临时变量名) |
| 易读性(对人) | 较差 | 中等 | 较好 |
| 优化便利性 | 差 | 中等(序号移动困难) | 好 |
| 常见应用 | 早期的简单编译器、计算器 | 某些早期编译中间表示 | 现代编译器(如三地址码) |
6. 经典例题
题目1:将表达式x = (a + b) * (c - d)分别转换为逆波兰、三元式和四元式。
解:
- 逆波兰:
x a b + c d - * =(注意赋值号通常视为二元运算符) - 三元式:
(1) (+, a, b) (2) (-, c, d) (3) (*, (1), (2)) (4) (=, (3), x) - 四元式:
(1) (+, a, b, t1) (2) (-, c, d, t2) (3) (*, t1, t2, t3) (4) (=, t3, , x)
答案:如上。
题目2:已知四元式序列:
(1) (*, a, b, t1) (2) (+, c, d, t2) (3) (-, t1, t2, t3)对应的表达式为( )。
A.a * b + c - d
B.(a * b) - (c + d)
C.a * (b - c) + d
D.(a + b) * (c - d)
解析:t1 = ab,t2 = c+d,t3 = t1 - t2 → (ab) - (c+d)。
答案:B
题目3(判断):逆波兰表示不需要使用括号来指定运算顺序。( )
答案:正确
7. 记忆口诀
逆波兰后缀写,栈式计算最快捷。
三元式三个字段,序号引用结果来。
四元式多一结果,临时变量显式排。
8. 给备考同学的一句话
中间代码是编译后端的重要环节。软考中常考:
- 给表达式,写出逆波兰、三元式、四元式。
- 给四元式序列,还原为表达式。
- 区分三种形式的优缺点。
建议多练习表达式转换,尤其是带括号的复杂表达式。记住四元式最常用,三元式的序号引用是考点。
🔔本专栏日更2篇,点击头像 → 专栏《软考中级高频考点》订阅
#软考中级 #软件设计师 #中间代码 #逆波兰 #三元式 #四元式 #编译原理