基于堆栈的虚拟机

2020-12-29 20:33:05

在本系列中,我们将深入研究基于堆栈的虚拟机。首先,我们将看到概述,然后将构建自己的玩具虚拟机。接下来,我们将了解如何将构建的内容映射到真实的CPU。最后,我们将讨论最著名的:JVM。

那么什么是基于堆栈的虚拟机?它是对计算机的抽象,它模仿一台真实的计算机。通常,它是作为特殊字节码的解释器构建的,该字节码可以实时转换以在CPU上执行。

让我们从一个简单的示例开始:假设您的程序需要添加两个数字。要在堆栈VM中做到这一点,程序将第一个数字压入堆栈,第二个压入,然后执行某种形式的特殊指令add,这将弹出堆栈的前两个元素并将其替换为它们的总和。让我们一步一步看一下:

SP是堆栈指针,它指向堆栈的头部。 IP是指令指针,它指向要执行的当前指令的地址。现在执行第一条指令:

您可以看到堆栈现在包含1,并且指令指针已移至下一条指令。现在让我们模拟第二条指令:

堆栈的开头和上一个元素已弹出,并替换为其总和。

从示例中可以看到,堆栈VM的主要两个数据结构是带有指令指针的代码清单和仅通过堆栈指针访问的堆栈数据。尽管这两个数据结构看起来微不足道,但它们足以实现许多复杂的程序。通过添加一些外部存储区(通常称为“堆上的内存”),该结构将变得足够复杂以形成诸如Java或Scala之类的真实语言的基础。

堆栈将是中心结构。从上面我们已经看到的内容,您应该对如何使用它来实现基本算术有所了解,但是它也将成为实现循环和条件执行(如果)甚至函数调用的基础!我们将在构建玩具虚拟机时讨论所有这些问题。

与基于堆栈的VM密切相关的是基于寄存器的虚拟机。它们也是字节码的解释器,但是它们的设计有很大不同,因为它们不使用堆栈作为操作数,而是使用一组寄存器。尽管它们往往更复杂,但它们通常在运行时也更快,因为它们映射到CPU的位置更紧密(正如我们将在后面看到的,它实际上是硬件寄存器机器),因此它们倾向于生成和执行效率更高的代码。

但是,基于堆栈的虚拟机不仅仅是学习玩具。有史以来最成功的VM,Java虚拟机是基于堆栈的虚拟机(CLR,.NET的基础也是如此)。此外,JVM具有极高的性能,同时仍然非常简单-尽管通过开发投入了大量资金,而不是通过其体系结构的某些特殊特性,可以实现更大的收益。

基于寄存器的虚拟机最著名的示例可能是LUA,它可以实现惊人的性能,并在许多视频游戏中用作脚本语言。

我希望这段简短的介绍能激发您的好奇心。如果您想开始阅读更多内容,这里有一些链接: