gpt4 book ai didi

compiler-construction - 在堆垛机中处理临时物

转载 作者:行者123 更新时间:2023-12-04 08:38:59 24 4
gpt4 key购买 nike

我一直在尝试理解 MIPS 堆栈机器的代码生成,其中有一个累加器寄存器用于存储操作结果,指令的第二个操作数必须从堆栈中弹出。大多数讲座和视频似乎都在谈论像这样的指令序列 x + (y + z) 然后继续解释 x 将如何被插入堆栈然后 y 跟随我将 z 加载到累加器......等等

但是,我对这种情况有点困惑。假设没有对以下代码进行常量折叠等优化。

A = 2 + 3
X = 1 + 1
.... // More random instructions
B = 4 + 5
C = A + 2
D = B + 1
E = C + D

所以在这个指令序列中,每个操作的结果不会在下一个指令中使用。所以我的猜测是必须将它们插入堆栈。问题是如何取回它们?例如 A 已经被计算出来。现在是否为 A 维护了一个符号表,说明它的值被压入堆栈的位置?如果是这样,这对于 SSA IR 会很好地工作,但是在存在控制流的情况下没有 SSA 它如何工作?我知道 MIPS 有 lw 和 sw 指令,这些指令需要一个偏移量来加载,但假设底层架构不支持这种指令。在那种情况下,每当我们必须检索 A 时,我们是否会弹出 A 顶部的所有值?

如果我的问题足够清楚,我将不胜感激任何有关其工作原理的反馈。

最佳答案

如果你的计算实际上是纯函数式的(变量只被分配一次),那么你总是可以将计算安排为一个表达式树(其中变量赋值消失了)并用堆栈机器以明显的方式评估它并且没有其他的。您仍然需要一条指令将已初始化变量的值压入堆栈,即可以引用堆栈外部区域的内容。

这很好,但不现实。大多数语言都有用于副作用的赋值,以记住状态;编译器可能会检测到您有一个公共(public)子表达式,计算结果,存储到临时对象中以供以后使用等。显然,如果不使简单的堆栈机器评估过程变得更加复杂,则此类分配的目标内存位置不能在堆栈中,这避免了它的美观并且可能会损害性能。 (如果我们认真追求性能,我们会使用套准机)。

最终需要“长期存储”的变量(相对于堆栈机器指令的某些子序列的评估持续时间)需要存储在堆栈“外部”的内存中。编译器可以为每个变量名分配一个在该外部区域中的唯一位置;小心地,它可以以一种方式分配这样的位置,即同时不“事件”的变量可以使用相同的内存位置,从而最大限度地减少外部区域的大小。您已经需要一条指令来从堆栈外部加载值(“push”);任何现实的架构都会相应地具有将最高值存储到该区域的指令(“pop”)。

一些堆栈机器架构允许压入任何已经在堆栈中的操作数;很容易概括为存储到堆栈中已有的任何操作数(槽)中。这只是“栈内”和“栈外”的混合体;您始终可以将堆栈的远处“底部”作为您只能以非堆栈方式使用的区域。但这只是模拟“栈外”。

关于compiler-construction - 在堆垛机中处理临时物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26312729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com