下面是一段抽象汇编指令
load a to r1
load b to r2
mult r1 r2 to r3
首先声明的是 这里为什么叫抽象汇编指令因为我们假设是有无限多的寄存器的 我们可以一直r1 r2 r3 r4 ……我们称这些寄存器为virtual register(虚拟寄存器) 而后端中的register allocation做的工作就是把这些虚拟寄存器映射到真实的寄存器上
其次这里发现r1和r2都存储着真实的变量(variable)a和b 而r3却是一个中转的临时变量(temporaries) 实际中的汇编是没有变量这个概念的 实际中只有寄存器和内存地址
在优化过程中 例如common subexpression elimination(CSE)就是会增加变量的数量来减少重复计算,一旦变量太多 就会增加寄存器的负担,导致一部分变量不能存在速度最快的寄存器中而是存在了内存中 就有可能会适得其反降低了代码运行速度
如何通过一个AST转换成抽象汇编指令呢 这里有一个特性是deepth first 只有先计算了最底层的a*b和c*d才能执行上一层的加法运算 只有执行完加法运算才能执行赋值运算
ILOC(intermidate language for optimizing compiler)编译器优化的中间语言
load a
r1
loadAI