vm实现-编译器如何在几个寄存器中存储数百个变量



假设您有一个虚拟机,它只有4个寄存器,a, B, C和d。编译器如何在有限的空间内存储这么多变量?

是否有多种方法来做到这一点,还是有一个坚实的方法来完成这一点?这个问题的科学术语是什么,它被认为是一个复杂的问题吗?

谢谢

我建议你阅读《程序设计语言语用学》或《龙舟书》,特别是关于寄存器分配的章节。

简而言之,有很多方法可以处理这种情况。通常,编译器构建一个中间表示,它可以是具有无限数量寄存器的抽象机器或SSA形式。当为特定的目标硬件/操作系统生成代码时,这些抽象寄存器根据抽象寄存器的使用频率或寿命(即您的原始变量)等标准被分配到实际寄存器或堆栈位置。

根据选择的中间表示有不同的方法(参见这里或这里的示例)。如果您正在努力寻找最佳解决方案(即在实际寄存器中保留尽可能多的变量而不将它们溢出到堆栈中),这个问题可能会很困难,但是当时间至关重要时,例如在即时编译中,有更简单的方法,如"线性扫描寄存器分配"。

如果你想深入研究代码,也许可以看看LLVM的基础结构和它们的寄存器分配以及这个演示。

不适合寄存器的东西(这是大多数东西)存储在内存中,只有在需要对其进行操作时才移动到寄存器中。您可能想要阅读关于寄存器分配的维基百科文章,这正是您正在询问的事情的名称。

这是寄存器分配的主题。基本上,编译器所做的就是计算每个变量,以及同时使用的其他变量。然后编译器将构造一个干扰图,其中程序中使用的每个变量都有一个节点,并且所有同时活动的节点之间有一条边。这就变成了一个图形着色问题,其中颜色对应于机器上可用的寄存器。

您可能知道,图着色是一个np完全问题,因此编译器实现了一个简单但非常有效的启发式方法。基本上,他们在图中找到拥有少于k条边的最高度节点,其中k是机器上的寄存器数。然后我们删除这个节点及其所有的边,并递归地为剩下的图上色。如果不存在这样的节点,我们取最高度的节点,并将其溢出,这意味着我们将其存储在堆栈中,并在删除该节点时重试着色过程。

最新更新