我正在设计一个自定义虚拟机,我很好奇我应该使用多少个寄存器。最初,我有255,但我有点担心每次调用一个函数时都会将255个指针(整个KB)支持到堆栈或堆上,而大多数都不会被使用。我应该使用多少个寄存器?
答案 0 :(得分:4)
您可能希望查看register windows,这是一种减少任何时候可用的“活动”寄存器数量的方法,同时仍然在核心中保留大量寄存器。
话虽如此,您可能会发现使用基于堆栈的架构更方便。一些旨在用软件(JVM,CLR,Python等)实现的主要虚拟机使用堆栈架构。为堆栈编写编译器肯定更容易,而不是人为限制的寄存器集。
答案 1 :(得分:1)
这通常取决于您认为您需要多少。我质疑255寄存器在实际应用中的用处。
我构建的最后一台注册机旨在支持一种小型编程语言,在绘制出来时,我查看了应用程序的类型,我想引导人们使用的设计方法,平衡所有与性能有关的问题。设计寄存器文件。
如果没有更多细节,这不是一件容易回答的事情,但是如果你停下来想想你正在尝试做什么,并在你认为重要的任何方面做到平衡,你就会来到你可以接受的结论,这可能是有道理的。
答案 2 :(得分:1)
无论你选择多少个寄存器,对于大多数子程序来说,你可能会有太多的寄存器,而对于一些子程序来说,它们太少了。 (这只是猜测。但是,考虑编程中有多少内容遵循幂律分布 - 对象,模块,类的传入引用,对象,模块,类的传出引用,子例程的圈复杂度,子例程的NPath复杂性,SLOC子程序的长度,对象的生命周期,对象的大小 - 假设子程序的寄存器数量也是如此,这是合理的,特别是如果你认为复杂性/长度和寄存器数量之间可能存在相关性。)
Parrot VM找到了一个很简单的方法:它们有一个无限个寄存器。显然,这些寄存器不是存储在无限数组中,而是懒惰地为任何单个子例程实现足够的寄存器。这样,它们永远不会用完寄存器,也不会浪费任何空间。
答案 3 :(得分:0)
对不起伙计们。我对这个做了个傻瓜。事实证明我已经有了一个寄存器向量来优化对堆栈的访问,我完全忘记了这一点。我只是将状态中的寄存器设置为对堆栈寄存器的引用,而不是重复它们。现在我需要做的就是专注于直接推送到寄存器,并以一种有效的方式解决问题。这些寄存器也永远不需要支持,因为它们不依赖于函数,它们将完全按照我的堆栈增长。我从来没有想到我可以将值推入它们而不会将等价值推入堆栈。
绝对可怕的模板混乱,这变成了简单的设计概念虽然让我非常不开心。想要购买:静态if和可变参数模板。