2

我正在设计一个自定义 VM,并且很好奇我应该使用多少个寄存器。最初,我有 255 个,但我有点担心每次调用函数时将 255 个指针(整个 KB)备份到堆栈或堆上,而其中大多数甚至不会被使用。我应该使用多少个寄存器?

4

4 回答 4

4

您可能想查看register windows,这是一种减少任何时候可用的“活动”寄存器数量的方法,同时仍将大量寄存器保留在内核中。

话虽如此,您可能会发现使用基于堆栈的架构更方便。一些打算在软件中实现的主要虚拟机(JVM、CLR、Python 等)使用堆栈架构。为堆栈而不是人为限制的一组寄存器编写编译器当然更容易。

于 2010-06-01T10:06:12.103 回答
2

这通常取决于您认为需要多少。我质疑 255 寄存器在实际应用中的用处。

我构建的最后一台寄存器机器旨在支持一种小型编程语言,在进行映射时,我查看了应用程序的类型,我想指导人们使用的设计方法,在设计寄存器时平衡所有这些与性能问题文件。

如果没有更多细节,这不是很容易回答的问题,但是如果你停下来想想你正在尝试做什么,并在你认为重要的任何方面进行平衡,你会得出一个你可以得出的结论住在一起,这可能是有道理的。

于 2010-06-01T10:01:30.513 回答
1

无论您选择多少寄存器,对于大多数子例程而言,您可能会拥有太多的寄存器,而对于少数子例程而言,您的寄存器可能会太少。(这只是一个猜测。但是,考虑到编程中有多少事情遵循幂律分布——对对象、模块、类的传入引用,来自对象、模块、类的传出引用,子例程的圈复杂度,子例程的 NPath 复杂度,SLOC子程序的长度、对象的生命周期、对象的大小——假设子程序的寄存器数量也是如此是合理的,特别是如果您认为复杂性/长度和寄存器数量之间可能存在相关性.)

Parrot VM 找到了一个非常简单的方法来解决这个难题:它们有无限数量的寄存器。显然,这些寄存器并没有存储在无限数组中,而是懒惰地为任何单个子程序实现了足够的寄存器。这样,它们永远不会用完寄存器,也不会浪费任何空间。

于 2010-06-01T12:39:12.290 回答
0

对不起大家。我在这个上犯了一个愚蠢的问题。原来我已经有一个寄存器向量来优化对堆栈的访问,我完全忘记了。我没有复制它们,而是将状态中的寄存器设置为对堆栈寄存器的引用。现在我需要做的就是专门推动直接推送到寄存器,并以一种非常有效的方式解决问题。这些寄存器也永远不需要支持,因为它们与函数无关,它们会完全按照我的堆栈增长。我从来没有想过我可以将值压入它们而无需将等效值压入堆栈。

这对于简单的设计概念来说变成了绝对可怕的模板混乱,但这让我非常不高兴。想购买:静态if和可变参数模板。

于 2010-06-01T20:06:23.833 回答