Compiler construction 基于堆栈的字节码或无限寄存器机的优点

Compiler construction 基于堆栈的字节码或无限寄存器机的优点,compiler-construction,expression-trees,intermediate-code,Compiler Construction,Expression Trees,Intermediate Code,编译器通常选择基于堆栈或无限寄存器的中间表示(IRs)。与表达式树相比,这些树有哪些优点?表达式树适用于表达式,但对整个程序的建模无效。特别是,程序的良好表示实际上是由控制流和数据流连接起来的(操作和动作的)图形。通常人们谈论使用“三元组”来形成这样一个图形 堆栈机器代码对于前端来说很容易生成,但是对于生成真实代码所需的最终寄存器分配过程来说就更难了,因为它有一组临时位置(“堆栈”),与目标体系结构没有明显的关系,并且使数据流不方便处理。(“哪个代码使用此添加的结果?”) 寄存器机器生成代码有点

编译器通常选择基于堆栈或无限寄存器的中间表示(IRs)。与表达式树相比,这些树有哪些优点?

表达式树适用于表达式,但对整个程序的建模无效。特别是,程序的良好表示实际上是由控制流和数据流连接起来的(操作和动作的)图形。通常人们谈论使用“三元组”来形成这样一个图形

堆栈机器代码对于前端来说很容易生成,但是对于生成真实代码所需的最终寄存器分配过程来说就更难了,因为它有一组临时位置(“堆栈”),与目标体系结构没有明显的关系,并且使数据流不方便处理。(“哪个代码使用此添加的结果?”)

寄存器机器生成代码有点困难,但通过使用这些无限寄存器作为基本数据流线路,往往会保留数据流。这种数据流以及将其轻松分配到实际寄存器的能力(有一种“通过图形着色”的标准寄存器分配)使得生成好代码相对容易

如果您决定直接从这些代码生成虚拟机代码,您将获得不同的性能特征。本质上,堆栈机器倾向于获得更小的代码占用。无限寄存器机器倾向于获得快速的解释性执行。正是因为这个原因,谷歌的Dalvik与JVM不同。(也许他们也不想因为类文件格式而被Sun/Oracle起诉。)


我建议使用以下文件:。(注:任何关于安东·埃特尔的文章都是有趣的读物)。

我发布了完全相同的答案!:顺便说一句,我还想说,堆栈虚拟机更容易启动,因为它更容易为它们生成代码……我发现令人失望的是,您的答案比较了堆栈与寄存器,而问题是关于表达式树与堆栈/寄存器的比较。@romkyns:很公平。答案修改了。链接断了,哟!试试@IraBaxter:“嗯,你为什么花了两年时间才决定这个?”。我是个思维迟钝的人。让我仔细考虑一下你说的话。我会在2017年给你回复我能想到的一个优点是,表达式树更难表示为一系列字节,而基于堆栈的VM程序非常自然地可以翻译为字节流。@romkyns:对于编译器IL来说,这并不重要;您只需要一组由索引/指针链接的数据结构。