适合读者软考中级备考同学阅读时间3.5分钟内容中间代码的作用、逆波兰表示、三元式、四元式的定义与示例、对比、例题1. 为什么需要中间代码编译程序在完成语法分析和语义分析后会生成一种介于源语言和目标语言之间的表示称为中间代码Intermediate Code。中间代码的作用包括便于后续的代码优化便于目标代码生成可移植性好同一中间代码可翻译为不同机器的目标代码软考中常考查三种常见中间代码形式逆波兰表示后缀式、三元式、四元式。2. 逆波兰表示Reverse Polish Notation, RPN2.1 定义逆波兰表示是一种不需要括号的表达式表示法将运算符写在操作数之后也称为后缀表示。计算时使用栈遇到操作数压栈遇到运算符则弹出所需数量的操作数计算结果压回栈。2.2 转换方法中缀 → 后缀操作数保持原来顺序运算符按优先级和结合性移到后面括号决定顺序但最终结果无括号2.3 示例中缀表达式a b * c后缀a b c * 中缀(a b) * c后缀a b c *2.4 优点简单易于计算机处理栈计算不产生临时变量2.5 缺点不便于优化无法显式表示子表达式共享不便于代码生成需重排3. 三元式Triple3.1 定义三元式是一种三个字段的表示形式(op, arg1, arg2)其中op为运算符arg1和arg2为操作数可以是变量、常量或另一个三元式的编号。计算结果通过三元式的序号引用。3.2 示例表达式a b * c的三元式序列(1) (*, b, c) (2) (, a, (1))其中(1)表示第一个三元式的结果。3.3 优点紧凑节省存储便于引用中间结果3.4 缺点当需要移动、删除或优化三元式时序号引用可能失效需修改所有引用处4. 四元式Quadruple4.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 - dB.(a * b) - (c d)C.a * (b - c) dD.(a b) * (c - d)解析t1 abt2 cdt3 t1 - t2 → (ab) - (cd)。答案B题目3判断逆波兰表示不需要使用括号来指定运算顺序。 答案正确7. 记忆口诀逆波兰后缀写栈式计算最快捷。三元式三个字段序号引用结果来。四元式多一结果临时变量显式排。8. 给备考同学的一句话中间代码是编译后端的重要环节。软考中常考给表达式写出逆波兰、三元式、四元式。给四元式序列还原为表达式。区分三种形式的优缺点。建议多练习表达式转换尤其是带括号的复杂表达式。记住四元式最常用三元式的序号引用是考点。本专栏日更2篇点击头像 → 专栏《软考中级高频考点》订阅#软考中级 #软件设计师 #中间代码 #逆波兰 #三元式 #四元式 #编译原理
【程序语言与编译】中间代码形式(逆波兰、三元式、四元式)
适合读者软考中级备考同学阅读时间3.5分钟内容中间代码的作用、逆波兰表示、三元式、四元式的定义与示例、对比、例题1. 为什么需要中间代码编译程序在完成语法分析和语义分析后会生成一种介于源语言和目标语言之间的表示称为中间代码Intermediate Code。中间代码的作用包括便于后续的代码优化便于目标代码生成可移植性好同一中间代码可翻译为不同机器的目标代码软考中常考查三种常见中间代码形式逆波兰表示后缀式、三元式、四元式。2. 逆波兰表示Reverse Polish Notation, RPN2.1 定义逆波兰表示是一种不需要括号的表达式表示法将运算符写在操作数之后也称为后缀表示。计算时使用栈遇到操作数压栈遇到运算符则弹出所需数量的操作数计算结果压回栈。2.2 转换方法中缀 → 后缀操作数保持原来顺序运算符按优先级和结合性移到后面括号决定顺序但最终结果无括号2.3 示例中缀表达式a b * c后缀a b c * 中缀(a b) * c后缀a b c *2.4 优点简单易于计算机处理栈计算不产生临时变量2.5 缺点不便于优化无法显式表示子表达式共享不便于代码生成需重排3. 三元式Triple3.1 定义三元式是一种三个字段的表示形式(op, arg1, arg2)其中op为运算符arg1和arg2为操作数可以是变量、常量或另一个三元式的编号。计算结果通过三元式的序号引用。3.2 示例表达式a b * c的三元式序列(1) (*, b, c) (2) (, a, (1))其中(1)表示第一个三元式的结果。3.3 优点紧凑节省存储便于引用中间结果3.4 缺点当需要移动、删除或优化三元式时序号引用可能失效需修改所有引用处4. 四元式Quadruple4.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 - dB.(a * b) - (c d)C.a * (b - c) dD.(a b) * (c - d)解析t1 abt2 cdt3 t1 - t2 → (ab) - (cd)。答案B题目3判断逆波兰表示不需要使用括号来指定运算顺序。 答案正确7. 记忆口诀逆波兰后缀写栈式计算最快捷。三元式三个字段序号引用结果来。四元式多一结果临时变量显式排。8. 给备考同学的一句话中间代码是编译后端的重要环节。软考中常考给表达式写出逆波兰、三元式、四元式。给四元式序列还原为表达式。区分三种形式的优缺点。建议多练习表达式转换尤其是带括号的复杂表达式。记住四元式最常用三元式的序号引用是考点。本专栏日更2篇点击头像 → 专栏《软考中级高频考点》订阅#软考中级 #软件设计师 #中间代码 #逆波兰 #三元式 #四元式 #编译原理