当前位置: 首页 > 面试题库 >

基于堆栈的机器是否取决于基于寄存器的机器?

耿锦
2023-03-14
问题内容

普通CPU(例如Android设备)是基于寄存器的计算机。Java虚拟机是基于堆栈的计算机。但是基于堆栈的计算机是否依赖于基于寄存器的计算机工作?由于基于堆栈的计算机不是OS,因此不能单独运行吗?除了JVM,是否有任何基于堆栈的计算机示例?有人说1个操作数,2个操作数;你为什么需要这个?


问题答案:

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方面失去了很多基础,但仍广泛用于需要在各种平台上呈现可伸缩图形的环境中。从技术上讲,它是一种图灵完备的编程语言,尽管很少有人那样使用它。



 类似资料:
  • 在为另一种语言构建解释器时,通常建议创建一个基于堆栈的虚拟机,该虚拟机可以解释实际解释器生成的字节码。然后,解释器将由两部分组成:翻译器,它将高级语言的指令转换为虚拟机的字节码,以及虚拟机本身。 我的问题是:口译语言有哪些替代方案?例如,跳过虚拟机并使用C中的函数实现所有指令是否可能(而且切实可行)?在某种程度上,在我看来这应该是可能的,但也许您最终会实现某种类型的最小VM,以实现更复杂的功能。还

  • 我正在寻找一个随机数生成器,我可以创建一个种子,并采取两个输入x和y来生成数字。每次使用相同的输入和相同的种子时,我都需要相同的数字。 我正在使用这个来随机分配一个坐标网格上的纹理,所以我需要它每次都是一样的。所以每次我在x=100,y=120的时候,在同一个种子里,我需要相同的随机数,所以相同的纹理被分配在那个点上。

  • 问题内容: 我想定期执行一个程序,如何在MySQL中做到这一点? 问题答案: 如果您拥有MySQL 5.1,则可以使用事件。 http://dev.mysql.com/doc/refman/5.1/zh- CN/events.html

  • 本文档说明了如何使用基于域名的虚拟主机。 基于域名的虚拟主机和基于IP的虚拟主机比较 基于IP的虚拟主机使用连接的IP地址来决定相应的虚拟主机。这样,你就需要为每个虚拟主机分配一个独立的IP地址。而基于域名的虚拟主机是根据客户端提交的HTTP头中标识主机名的部分决定的。使用这种技术,很多虚拟主机可以共享同一个IP地址。 基于域名的虚拟主机相对比较简单,因为你只需要配置你的DNS服务器将每个主机名映

  • 本文向大家介绍基于Python和Scikit-Learn的机器学习探索,包括了基于Python和Scikit-Learn的机器学习探索的使用技巧和注意事项,需要的朋友参考一下 你好,%用户名%! 我叫Alex,我在机器学习和网络图分析(主要是理论)有所涉猎。我同时在为一家俄罗斯移动运营商开发大数据产品。这是我第一次在网上写文章,不喜勿喷。 现在,很多人想开发高效的算法以及参加机器学习的竞赛。所以他

  • 我在Kubernetes集群上运行了一个openjdk:8映像。我添加了内存HPA(水平Pod自动缩放),它可以很好地扩展,但由于JVM不会将内存从堆释放回操作系统,所以Pod不会缩小。以下是hpa。亚马尔 解决这个问题的一种方法是使用正确的GC并使其释放内存,但由于JVM被设计为不经常从堆中释放内存,因此这样做不是一个好主意。库伯内特斯有没有办法解决这个问题?就像不检查操作系统的内存使用情况一样