编译器通常选择基于堆栈或无限寄存器的中间表示 (IR)。这些过度表达树的优点是什么?
最佳答案
表达式树适用于表达式,但对建模整个程序无效。特别是,程序的良好表示实际上是由控制流和数据流连接的(操作和 Action 的)图。通常人们谈论使用“三元组”来形成这样的图。
堆栈机器代码对于前端来说很容易生成,但对于生成实际代码所需的最终寄存器分配过程来说却比较困难,因为它有一组与目标架构没有明显关系的临时位置(“堆栈”) ,并使数据流不便处理。 (“哪个代码使用此添加的结果?”)。
寄存器机器生成代码有点困难,但倾向于通过使用这些无限寄存器作为本质上的数据流线来保留数据流。该数据流以及将其轻松分配给实际寄存器的能力(有一个“通过图形着色”的标准寄存器分配)使得生成好的代码相对容易。
如果您决定直接从这些生成虚拟机代码,您将获得不同的性能特征。本质上,堆栈机器倾向于获得更小的代码占用空间。无限寄存器机倾向于获得快速的解释性执行。正是因为这个原因,Google 的 Dalvik 与 JVM 不同。 (也许他们也不想因为类文件格式而被 Sun/Oracle 起诉。)
我建议使用以下文件:Virtual Machine Showdown: Stack Versus Registers . (PS:任何以 Anton Ertl 为作者的作品都非常有趣)。
关于compiler-construction - 基于堆栈的字节码或无限寄存器机的优点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11120343/