• 我要写整个中文互联网界最牛逼的JVM系列教程 | 「JVM与Java体系架构」章节:区分栈的指令集架构和寄存器的指令集架构


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

    JVM的架构模型

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

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

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

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

    基于栈式架构的特点

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

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

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

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

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

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

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

    在这里插入图片描述

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

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

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

    接着,我们来看一下第三个特点,即指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。此外,指令集更小,编译器容易实现

    零地址指令上面我已经给大家解释过了,正是由于基于栈式的架构使用的是零地址指令方式来进行的分配,所以它就不像其他地址指令那样还得分配地址搞得那么麻烦了,那显然编译器就会比较容易实现了。

    最后,我们来看一下最后一个特点,即不需要硬件支持,可移植性更好,更好实现跨平台

    以上是一个非常重要的特点,所以我得给大家好好唠唠。

    相信大家都知道JVM具有跨语言的平台的这样一个特征,就是可以在不同的平台上去安装JVM,然后使得同一个Java源文件能实现跨平台的执行,而正是鉴于此,我们才需要去考虑基于栈式的这样一种架构。而且,由于栈是内存层面上的一个概念,所以基于栈式的这样一种架构就不需要和硬件打交道了,当然,可移植性也就会变得更好了。

    基于寄存器架构的特点

    基于寄存器架构的典型应用便是x86的二进制指令集了,比如传统的PC以及Android的Davlik虚拟机等选择的就是基于寄存器的这样一种架构。

    那基于寄存器的这样一种架构有什么特点呢?带着这样一个疑问,大家就继续往下读吧!

    基于寄存器架构的第一个特点是指令集架构完全依赖硬件,可移植性差。很明显,这也是基于寄存器架构的一个缺点。

    基于寄存器架构的第二个特点是性能优秀和执行更高效。很明显,这也是基于寄存器架构的一个优点。

    之所以基于寄存器架构有以上优缺点,是因为它需要完全依赖于CPU,由CPU来直接执行指令,而且,指令还得在高速缓存区当中进行执行。这当然就会导致基于寄存器架构的指令执行速度就要比基于栈式架构的快了,但是,由于指令直接是由CPU来执行的,所以基于寄存器的这样一种架构就跟硬件的耦合度比较高了,可移植性当然就会比较差了。

    基于寄存器架构的第三个特点是花费更少的指令去完成一项操作。关于这一特点,下面我得给大家好好唠唠才行,一定要讲得让大家理解透彻才罢手。

    上面我们说了,基于栈式架构的其中一个特点便是指令集更小,原因就是因为基于栈式的这样一种架构指令流中的指令大部分是零地址指令。关于这个零地址指令更加详细的内容,我会留到下一篇(即字节码与类的加载篇)专门来给大家进行讲解,这里,大家只须知道一点即可,即零地址指令的字节码文件要求是保持8字节对齐,到时候。。。

  • 相关阅读:
    27_Scala功能函数
    Ubuntu18中的连接网络图标恢复
    JAVA在线招投标系统计算机毕业设计Mybatis+系统+数据库+调试部署
    网络安全(骇客)—技术学习
    排序——交换排序
    Java 9 响应式流(Reactive Streams)
    LVGL 日历组件
    HGAME-week3-web-wp
    WebSocket小案例(spring-boot-starter-websocket)
    ARM按键中断实验
  • 原文地址:https://blog.csdn.net/yerenyuan_pku/article/details/126377726