参考文章:Stack Machines: Fundamentals
本系列将探讨虚拟堆栈机的设计和实现。即,其操作基于堆栈的虚拟机。这篇文章将介绍基础知识。
堆栈,数据结构
那么什么是堆栈?这是一个具有两个操作的数据结构:push和 pop。您可以将值压入堆栈,然后从堆栈中弹出它们。这是按照LIFO(后进先出)的顺序进行的。
此数据类型是堆栈计算机设计的基础。实现堆栈非常容易,尤其是当您拥有一个数组时,该数组包含一个离散大小的单元格列表并且是可索引寻址的。
除了用于数据存储的数组之外,您还需要具有一个堆栈指针。它仅指向堆栈的当前头部,并随着元素被压入和弹出而递增和递减。
这是C语言的基本实现:
int sp = 0;
double val[MAXVAL];
void push(double f)
{
val[sp++] = f;
}
double pop(void)
{
return val[--sp];
}
许多语言已经内置了这样的数据结构。PHP具有 array_push和array_pop函数以及一个SplStack类。ECMAScript在数组原型上具有 push和pop方法。
指示
为了真正有用,堆栈机还需要说明。它需要定义一个指令集,并且需要一种存储和访问这些指令的方法。
指令通常从堆栈中弹出一个或多个值,进行一些计算,然后推入结果。
指令集可以包含诸如推压值之类的操作,诸如加,减,乘,除之类的算法,影响执行哪条指令的控制流,甚至包括特定于主机的操作(如I / O)。
执行
在上面的示例中,有三个指令:
- 推值3
- 推值4
- 弹出两个值并添加它们,然后推入结果
机器按顺序执行它们,逐一读取指令。通常有一个指令指针(有时也称为程序计数器)指向下一条指令,并在每次操作后递增。
在执行这些步骤期间,堆栈的状态会更改。最终状态应该是这样的:
通常,当到达指令末尾时,堆栈顶部的值将返回给调用方。在这种情况下,将从堆栈中弹出值7并返回。
概括
- 虚拟堆栈机由堆栈和指令组成。
- 堆栈是具有两个操作的数据结构:推入和弹出。
- 指令使用堆栈上的值。