JVM在任何地方都没有提到寄存器的存在。从它的角度来看,内存仅存在于少数几个地方,例如每个线程的堆栈,方法区域,运行时常量池等。也就是说,如果您想实际实现遵守JVM的物理设备,则d几乎肯定需要寄存器来保存执行某些字节码时生成的某些临时值,或在侧面维护一些额外的暂存信息。例如,尝试查找该
multianewarray指令,看看是否可以在没有寄存器的情况下实现它。:-)
如今,您可以在实际的CPU中找到一个与之并行的地方,那就是尽管程序员可以使用一组专用的寄存器,但是大多数CPU都有大量的寄存器供内部用于各种用途。例如,大多数MIPS芯片具有大量用于流水线的寄存器。它们包含诸如先前指令中的控制位之类的东西。如果x86与众不同,我将被震撼。
要记住的是,不是寄存器真正定义了基于寄存器的计算机与基于堆栈的计算机的工作方式。在大多数体系结构中,您都有专用于内部使用的O(1)寄存器。甚至JVM都有这些-
每个方法都有一个“局部变量数组”,该数组最初保存函数的参数,但是如果需要,也可以用作暂存空间。使堆栈计算机与其他计算机区分开的最重要部分是可扩展内存的工作方式。在大多数计算机中,内存是随机访问的,您可以随时从任何位置读取数据。也就是说,在n个存储单元中,您可以随时读取O(n)个存储器。在基于堆栈的计算机中,您只能访问堆栈的前几个位置,因此您一次只能读取O(1)个存储位置。
从理论上讲,因为JVM应该代表完整的虚拟机,所以您可以启动一台计算机并仅运行不带任何操作系统的JVM(或者说,JVM将是OS,而您的“程序”就是Java字节码和类文件)。
还有其他一些基于堆栈的语言,其中第一个可以想到的是Forth。我之所以提到Forth,是因为它是基于堆栈的语言。您所做的每件事都以操纵操作数堆栈的方式表达。关于您的原始问题,这很酷,因为Forth过去在业余爱好者中非常受欢迎,因为您可以很容易地将其移植到嵌入式设备上。要使完整的Forth解释器正常工作,您不需要强大的操作系统-
您只需要命令解释器即可。如今,Forth并不那么流行,但它仍然是一种非常酷的语言。
另一种广泛使用的基于堆栈的语言是Postscript,它在PDF方面失去了很多基础,但仍广泛用于需要在各种平台上呈现可伸缩图形的环境中。从技术上讲,它是一种图灵完备的编程语言,尽管很少有人那样使用它。



