从抽象语法树生成基于寄存器的字节码?

 雪蝴蝶的诺言forever 发布于 2023-02-13 15:57

从给定的anstract语法树(AST)生成基于寄存器的字节码有哪些众所周知的策略?

考虑这个表达式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转换为相应的字节码.到目前为止,我只发现了一篇文章,其中仅简要介绍了它.我对它试图说的内容的解释......

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;
    }
}

请帮帮我,谢谢.

1 个回答
  • 请执行下列操作:

    为每个表达式节点提供唯一的编号en.当你在树上走动时,你可以做到这一点.

    对于编号为el的叶节点,生成"MOV el,operand "

    对于编号为er的每个内部节点"OP" ,使用二进制子项eset,生成"OP er,es,et ".使用明显的泛化来处理具有任意数量子节点的运算符.

    在虚拟寄存器号可以任意大(例如,由程序的大小确定)的意义上,这将产生"天真"代码.

    更复杂的版本将保留一个节点号池,从左到右遇到它们时,从池中为每个节点分配最低可用数量,并将OP指令输入操作数的数字放回池中(因为它们在生成每个OP指令时,它们现在是"自由的".这将在实践中产生一组小得多的虚拟寄存器组号.

    如果您想变得聪明,在完成上述操作后,将寄存器着色应用于生成的代码,以启用使用固定数量的寄存器.

    2023-02-13 16:00 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有