编译器设计中的中间代码生成

在编译器的分析综合模型中,编译器的前端将源程序翻译成独立的中间代码,然后编译器的后端使用该中间代码生成目标代码(机器可以理解)。

null

使用独立于机器的中间代码的好处是:

  • 由于独立于机器的中间代码,可移植性将得到增强。例如,假设一个编译器将源语言翻译成目标机器语言,而没有生成中间代码的选项,那么对于每台新机器,都需要一个完整的本机编译器。因为,很明显,编译器本身根据机器规范进行了一些修改。
  • 有助于重新定位
  • 通过优化中间代码,更容易应用源代码修改来提高源代码的性能。

1

如果我们直接从源代码生成机器代码,那么对于n个目标机器,我们将有n个优化程序和n个代码生成器,但是如果我们将有一个独立于机器的中间代码, 我们只有一个乐观主义者。中间代码可以是特定于语言的(例如,Java的字节码)或语言。独立(三个地址代码)。

以下是常用的中间代码表示:

  1. 后缀符号-

    写A和B的和的一般(中缀)方法是中间的运算符:a+b。 同一表达式的后缀表示法将运算符放在右端,即ab+。一般来说,如果e1和e2是任何后缀表达式,并且+是任何二进制运算符,那么将+应用于e1和e2所表示的值的结果就是e1e2+的后缀表示法。后缀表示法中不需要括号,因为运算符的位置和算术(参数数量)只允许一种方法来解码后缀表达式。在后缀表示法中,运算符跟随操作数。

    例如—— 表达式(a-b)*(c+d)+(a-b)的后缀表示为:ab-cd++*ab-+。 阅读更多: 中缀到后缀

  2. 三个地址代码- 包含不超过三个引用(两个用于操作数,一个用于结果)的语句称为三地址语句。由三个地址语句组成的序列称为三地址码。三地址语句的形式是x=y op z,这里x,y,z将有地址(内存位置)。有时,它所包含的引用可能比三个语句少。

    例如—— 表达式a+b*c+d的三个地址代码:

    t1=b*c T2=a+T1 t3=t2+d

    t1,t2,t3是临时变量。

  3. 语法树- 语法树只是解析树的浓缩形式。解析树中的运算符和关键字节点被移动到其父级,语法树中的单个生成链被单个链接替换。内部节点是运算符,子节点是操作数。要形成语法树,请在表达式中放入括号,这样就很容易识别哪个操作数应排在第一位。

    例如—— x=(a+b*c)/(a-b*c)

    2

本文由 帕鲁尔·夏尔马

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享