从给定的anstract语法树(AST)生成register based字节码有哪些众所周知的策略?
考虑这个表达式1 + 2 - 3 * 4 / 5
及其AST形式:
bin_exp(-)
bin_exp(+)
num_exp(1)
num_exp(2)
bin_exp(/)
bin_exp(*)
num_exp(3)
num_exp(4)
num_exp(5)
我正在努力将AST转换为相应的字节码。 到目前为止,我只找到一个article,其中只是简单地谈到它。我对它试图说的内容的解释......
int ridx; // register index
function visit_exp(exp)
{
switch (exp)
{
case bin_exp:
visit_exp(exp.left);
visit_exp(exp.right);
printf("add %i, %i -> %i\n", ridx - 2, ridx - 1, ridx);
// save ridx, as it contains the result
break;
case num_exp:
printf("mov %i -> %i\n", ridx, exp.value);
break;
}
}
请帮帮我,谢谢。
答案 0 :(得分:8)
执行以下操作:
这将产生“天真”代码,因为虚拟寄存器号可以任意大(例如,由程序的大小决定)。
更复杂的版本会保留一个节点编号池,从左到右遇到它们时,从池中为每个节点分配最低可用编号,并将OP指令输入操作数的编号放回池中(因为它们现在是“自由的”),因为每个OP指令都是生成的。这将在实践中产生一组更小的虚拟寄存器组号。
如果您想要变得聪明,在完成上述操作后,将register coloring应用于生成的代码,以启用使用固定数量的寄存器。