📜  需要中间代码和代码优化

📅  最后修改于: 2021-09-27 14:59:26             🧑  作者: Mango

中间代码:
中间代码是独立于机器的代码,但它们接近机器指令。语法树、后缀表示法、三地址代码、DAG 可用作中间语言。

需要中间代码:

  1. 假设我们有 x no 源语言和 y no 目标语言:
    1. 如果没有 ICG –我们必须直接将每种源语言更改为目标语言,因此,对于每个源-目标对,我们都需要一个编译器。因此我们需要 (x*y) 编译器,这可能是一个非常大的数字,实际上不可能的。
    2. 使用 ICG –我们只需要 x 个编译器即可将每种源语言转换为中间代码。我们还需要 y 编译器将中间代码转换为 y 目标语言。
      所以,我们只需要 (x+y) 没有带有 ICG 的编译器,这比编译器的 x*y 小得多。
  2. 有利于重新定位:
    可以通过将新机器的后端(生成目标代码)附加到现有的前端(生成中间代码)来创建不同机器的编译器。
  3. 独立于机器:
    机器独立代码优化器可以应用于中间代码。所以这可以在任何机器上运行。
  4. 简单:
    中间代码足够简单,可以轻松转换为任何目标代码。所以ICG减少了目标代码生成的开销。

  5. 复杂性:
    中间代码足够复杂,可以表示高级语言的所有复杂结构。
  6. 修改:
    通过对中间代码应用优化技术,我们可以轻松修改代码以获得更好的性能和吞吐量。

代码优化:
应用于目标代码(汇编代码)的代码优化是一种转换技术,用于通过消耗更少的资源来改进代码。代码优化有 3 种类型:

  1. 机器相关优化——在目标代码(汇编代码)生成之后应用的优化是机器相关优化。
  2. 与机器无关——在这种情况下,编译器转换不涉及任何 CPU 寄存器和/或绝对内存位置的中间代码的一部分。例如,3 地址代码。
  3. 局部优化 –在块(连续语句的序列)内执行的优化是局部优化 e,g。 If-Else、switch-case、条件语句和循环,例如 Do-While、For 和 repeat-until 等。

代码优化需求:

  1. 环路频率降低:
    循环优化是循环内优化的过程。这降低了表达式的求值频率并将循环不变的语句带出循环。
  2. 死代码消除:
    它在不改变代码行为的情况下删除了不必要的指令。
  3. 速度:
    代码优化提高了程序的速度。
  4. 资源:
    代码优化后,我们的程序需要更少的资源,从而为其他程序员节省了我们的资源(即cpu、内存)。
  5. 整洁干净的代码:
    删除公共子表达式和冗余代码后,我们的代码成为干净的代码。
  6. 强度降低:
    强度降低意味着用简单(廉价/低强度)运算符替换昂贵的运算符符。
  7. 为了减少迭代次数,我们使用代码优化。
  8. 每当两个循环共享相同的索引变量时,将它们组合起来,即 – for loop jamming 或 loop fusion 是一种代码优化。