节:区分栈的指令集架构和寄存器的指令集架构

Posted 李阿昀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了节:区分栈的指令集架构和寄存器的指令集架构相关的知识,希望对你有一定的参考价值。

这一讲,我们来说一下JVM的架构模型。

JVM的架构模型

首先,大家要知道一点,就是Java编译器输入的指令流基本上是一种基于栈的指令集架构,而另外一种指令集架构则是基于寄存器的指令集架构。从这点也能看出,指令集的架构模型一共分为两种,一种是基于栈的指令集架构,一种是基于寄存器的指令集架构

我之所以会讲Java编译器输入的指令流基本上是一种基于栈的指令集架构,是因为HotSpot虚拟机当中的任何操作都得经过一个入栈和出栈的过程,而这就是我们通常意义上所说的栈管运行,因此,不难知道HotSpot虚拟机中的执行引擎架构其实就是一种基于栈的指令集架构

此外,大家还要明确的一点是HotSpot虚拟机除了PC寄存器(英文的叫法是Program Counter Register)之外,它就再没有包含其他的寄存器了。

当然,接下来我们也会对比一下基于栈的指令集架构和基于寄存器的指令集架构这两种架构之间的区别。

基于栈式架构的特点

首先来看第一个特点,即设计和实现更简单,适用于资源受限的系统。

看到这里,有些小伙伴可能心想,完了,这什么鸡儿意思啊,我也看不懂啊😊!看不懂,很正常,谁也不是什么天才,不过要是经过我下面的解释你还不懂,那你趁早该干嘛就干嘛去吧!

之所以基于栈式的架构的设计和实现更简单,是因为Java程序的运行都是通过一个一个的方法来实现的,而每执行一个方法,我们就可以理解成是一个入栈操作,很显然,位于栈顶的就是我们当前正在执行的方法,而每当一个方法执行完毕之后,那就意味着是做了一个出栈操作了。

上面还说了,基于栈式的架构还能适用于资源受限的系统,我想这里我不得不举一个例子来给大家说一下了。就拿嵌入式的一些小型设备来说,例如机顶盒、打印机等等,它们就属于一个资源受限的场景,最初高斯林这个团队在设计Java语言的时候,也是希望它能应用在资源受限的系统当中。

然后,我们再来看一下第二个特点,即避开了寄存器的分配难题,使用的是零地址指令方式来进行的分配。

既然这里提到了零地址指令,那么对应的肯定就会有一地址指令、二地址指令以及三地址指令。看到这里,大家肯定会一脸懵逼,心想这他妈都是些什么啊😊!还是那句话,看不懂,非常正常,正是鉴于此,下面我就必须得给大家解释解释了。

一个指令正常被执行的时候,它是需要具有两部分的,一部分是它的地址,例如地址是1,而另一部分则是它的操作数,例如操作数是3,画图表示如下。

以上就是一个一地址指令,即只有一个地址和一个操作数。

至此,那二地址指令就很好理解了,无非就是二地址指令会有两个地址和一个操作数罢了。同理,三地址指令就是有三个地址和一个操作数了。至于所谓的零地址指令,那就是没有地址,只有操作数了。

为什么栈它不需要地址呢?我想大家都知道内存中栈的内存结构吧!栈是只有一个入栈/出栈操作的,而且它只针对栈顶的数据进行操作,对于其他的数据则暂时不操作,所以栈就不怎么需要地址了。

基于寄存器架构的特点

。。。

以上是关于节:区分栈的指令集架构和寄存器的指令集架构的主要内容,如果未能解决你的问题,请参考以下文章

节:区分栈的指令集架构和寄存器的指令集架构

基于栈的指令集与基于寄存器的指令集

JVM基础认知篇(下)

基于栈的指令集与基于寄存器的指令集的区别

精简指令集和复杂指令集的区别

STM32学习-嵌入式微处理器指令集架构