编译器通常选择基于堆栈或无限寄存器的中间表示 (IR)。这些优于表达式树的优点是什么?
问问题
2804 次
1 回答
18
表达式树适用于表达式,但对整个程序的建模无效。特别是,程序的良好表示实际上是由控制和数据流连接的(操作和动作的)图。通常人们谈论使用“三元组”来形成这样的图表。
堆栈机器代码对于前端来说很容易生成,但对于生成真实代码所需的最终寄存器分配过程来说更难,因为它有一组与目标架构没有明显关系的临时位置(“堆栈”) ,并使数据流处理不便。(“哪个代码使用了这个添加的结果?”)。
寄存器机器更难为其生成代码,但倾向于通过使用这些无限寄存器作为本质上的数据流线来保留数据流。该数据流以及将其轻松分配给真实寄存器的能力(有一个“通过图形着色”的标准寄存器分配)使得生成好的代码相对容易。
如果您决定直接从这些生成虚拟机代码,您将获得不同的性能特征。从本质上讲,堆栈机器往往会获得更小的代码占用空间。无限寄存器机器往往会获得快速的解释执行。正是因为这个原因,Google 的 Dalvik 与 JVM 不同。(也许他们也不想因为类文件格式而被 Sun/Oracle 起诉。)
我建议使用以下文档:虚拟机摊牌:堆栈与寄存器。(PS:任何以 Anton Ertl 为作者的作品往往都是有趣的读物)。
于 2012-06-20T13:23:32.990 回答