中间代码:
中间代码是独立于机器的代码,但它们接近机器指令。语法树、后缀表示法、三地址代码、DAG 可用作中间语言。
需要中间代码:
- 假设我们有 x no 源语言和 y no 目标语言:
- 如果没有 ICG –我们必须直接将每种源语言更改为目标语言,因此,对于每个源-目标对,我们都需要一个编译器。因此我们需要 (x*y) 编译器,这可能是一个非常大的数字,实际上不可能的。
- 使用 ICG –我们只需要 x 个编译器即可将每种源语言转换为中间代码。我们还需要 y 编译器将中间代码转换为 y 目标语言。
所以,我们只需要 (x+y) 没有带有 ICG 的编译器,这比编译器的 x*y 小得多。
- 有利于重新定位:
可以通过将新机器的后端(生成目标代码)附加到现有的前端(生成中间代码)来创建不同机器的编译器。 - 独立于机器:
机器独立代码优化器可以应用于中间代码。所以这可以在任何机器上运行。 - 简单:
中间代码足够简单,可以轻松转换为任何目标代码。所以ICG减少了目标代码生成的开销。 - 复杂性:
中间代码足够复杂,可以表示高级语言的所有复杂结构。 - 修改:
通过对中间代码应用优化技术,我们可以轻松修改代码以获得更好的性能和吞吐量。
代码优化:
应用于目标代码(汇编代码)的代码优化是一种转换技术,用于通过消耗更少的资源来改进代码。代码优化有 3 种类型:
- 机器相关优化——在目标代码(汇编代码)生成之后应用的优化是机器相关优化。
- 与机器无关——在这种情况下,编译器转换不涉及任何 CPU 寄存器和/或绝对内存位置的中间代码的一部分。例如,3 地址代码。
- 局部优化 –在块(连续语句的序列)内执行的优化是局部优化 e,g。 If-Else、switch-case、条件语句和循环,例如 Do-While、For 和 repeat-until 等。
代码优化需求:
- 环路频率降低:
循环优化是循环内优化的过程。这降低了表达式的求值频率并将循环不变的语句带出循环。 - 死代码消除:
它在不改变代码行为的情况下删除了不必要的指令。 - 速度:
代码优化提高了程序的速度。 - 资源:
代码优化后,我们的程序需要更少的资源,从而为其他程序员节省了我们的资源(即cpu、内存)。 - 整洁干净的代码:
删除公共子表达式和冗余代码后,我们的代码成为干净的代码。 - 强度降低:
强度降低意味着用简单(廉价/低强度)运算符替换昂贵的运算符符。 - 为了减少迭代次数,我们使用代码优化。
- 每当两个循环共享相同的索引变量时,将它们组合起来,即 – for loop jamming 或 loop fusion 是一种代码优化。