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

📅  最后修改于: 2021-06-28 07:25:23             🧑  作者: Mango

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

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

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

1个

如果我们直接从源代码生成机器代码,那么对于n台目标机器,我们将有n个优化器和n个代码生成器,但是如果我们有与机器无关的中间代码,
我们将只有一个优化器。中间代码可以是特定于语言的(例如, Java的Bytecode)或特定语言。独立(三个地址的代码)。

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

  1. 后缀符号–

    编写a和b之和的普通(中缀)方式是在中间加上a运算符:
    同一表达式的后缀表示法将运算符放在ab +的右端。通常,如果e1和e2是任何后缀表达式,并且+是任何二进制运算符,则将+应用于e1和e2表示的值的结果是e1e2 +的后缀表示法。后缀表示法中不需要括号,因为运算符的位置和偶数(参数的数量)仅允许一种方式来解码后缀表达式。在后缀表示法中,运算符遵循操作数。

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

  2. 三地址代码–
    包含不超过三个引用(两个用于操作数,一个用于结果)的语句称为三地址语句。三个地址语句的序列称为三个地址代码。三个地址声明的格式为x = y op z,这里x,y,z将具有地址(内存位置)。有时一条语句可能包含少于三个引用,但仍称为三地址语句。

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

    T 1 = b * c
    T 2 = a + T 1
    T 3 = T 2 + d

    T 1,T 2,T 3是临时变量。

  3. 语法树–
    语法树只不过是语法分析树的压缩形式。语法分析树的运算符和关键字节点移至其父级,并且语法树中的单个链接替换了单个生产链,内部节点为运算符,子节点为操作数。为了形成在表达式中加上括号的语法树,可以很容易地识别出哪个操作数应该放在首位。

    例子 –
    x =(a + b * c)/(a – b * c)

    2个