00:00
下面呢,我们来说一下GM的一个架构模型啊,那我们首先说呢,这个指令级的架构模型呢,其实分成两种啊,这个一种呢叫基于站的指令机架构啊,另外一种呢,叫基于寄存器的指令机架构啊就这两种方式,那首先呢,我们需要明确的是呢,是houseport虚拟机呢,这个除了PC寄存器之外啊,它再没有包含其他的寄存器了啊,只有PC寄存器啊,这个program,呃,Counter,这个register啊,就是PC寄存器,我们通常这样叫啊,那house power当中任何操作呢,其实都需要经过一个入站和出站的操作,那这是我们说这个站呢来管这个运行是吧?那由此可见呢,Househol它这个执行引擎架构呢,其实就是基于站的一个直行架构了,那这个首先大家要明确哈,是这种,当然呢,我们这里边也要,呃对比一下,说这个基于站的这种指定架构和寄存器的指定架构两种有什么区别呢?诶我们带大家来看一下,那基于站呢,我们说它的。
01:00
设计和实现呢,要更简单一些啊,适用于资源受限的系统啊,资源受限的系统,比如说我们说嵌入式的一些设备啊,一些小型设备,像机顶盒呀,诶打印机啊等等,这属于资源受限的一个场景,因为最初呢,这个诶高斯林这个团队呢,在设计这个Java语言的时候呢,也希望呢,他们能够应用在这个资源受限的这个系统当中啊,是这样子的,然后设计和实现更简单,这个我们后边也会讲啊,就是Java程序的运行呢,我们说都是通过一个一个的方法来实现的,那每执行一个的方法,我们就可以理解成一个入站操作啊,那在占领呢,就是我们当前正当前正在执行的方法,那这个方法执行完以后呢,它就做一个出站的操作就可以了,所以呢,设计和实现呢,是比较简单的啊,这样然后下一个呢,说叫避开的寄存器的分配难题,呃,这呢也提到叫零地址指令啊这样的一个情况啊,那下边也提到了基于站的这种方式呢,它的指令呢,大部分都是。
02:00
零地址指令的,那它的操作呢,依赖于这个操作站啊,这个零地址指令对应的呢,就有这个叫一地址指令,二地址指令,还有三地址指令啊,这个一说大家可能有点懵哈,就正常我们去做一个指令的执行的时候呢,它需要具有两部分,一部分呢叫做地址。啊,就是我们要执行一个指令的时候啊,一个是它的地址,比如说地址是一,然后下个呢,就是它的一个操作数,比如说这个数值呢是三啊你想呃,拿着三做一个运算哈,这个一是它的地址,三呢是它的操作数,那么这个一地址指令呢,就是我刚才我写的它是有一个地址,然后一个操作数,那二地址指令呢,就是有两个地址啊这个意思,那所谓的零地址呢,就是说它没有地址,只有操作数,这叫零地址指令,那占为什么是这样的呢?因为这个这个内存中大家都知道这个站的结构了啊,这个站呢,它只是有一个入站出站的操作,只针对这个站点数据呢进行操作,其他的数据呢,现在不操作,所以呢,我们就不需要地址它。
03:03
呃,通过这样的一个方式,呃,相当于是呢,呃不像地址一样啊,分配起来稍微麻烦一些,我们呢,选的是零地址。啊,就是更容易去实现啊,这是它占的一个特点啊,然后下一个情况呢,就是不需要硬件的支持,可一致性更好,更容易呢去实现跨平台,这呢也是非常重要的一个特点,我们说GVM呢是可以实现跨平台的,对吧?就是可以在不同的平台呢上去装GM,然后让同一个Java文件呢,呃,实现一个跨平台的执行啊,那我们就需要考虑基于这样的一种站时结构啊,还是因为这个站呢,它是个内存级别,内存层面的啊,不需要跟硬件打交道,所以呢,它有更好的可移植性。那对应的基于寄存器架构的特点,那典型的话呢,就像叉八六,我们传统使用的这个计算机的叉八六的这种架构方式,以及呢,诶大家用的安卓的像单位虚拟机,哎,这都是基于叫寄存器的方式啊,像谷歌呢,在安卓上呢,它就选择了基于寄存器的这种方式啊,那这种方式的优点是什么呢?就是性能优秀啊,执行更高效。
04:11
那缺点呢,就是它的这种指定级的架构呢,需要依赖于硬件,可一致性呢较差,这呢是非常明显的它的优点和缺点啊,那这个里的优点缺点呢,原因都是一样的,就是它需要完全基于它的这个CPU,呃指令呢需要由CPU呢来进行执行啊,在高速缓存区当中进行一个执行啊,它速度呢,比我们说的这个站呢,确实速度要快,但是呢,因为你涉及到这个指令直接由CPU来执行了,所以它跟硬件呢就耦合度就比较高啊,是这样子的啊,那我们这个安卓的话呢,呃,希望呢它能够执行的效果更好一些,所以呢,选择了这种呃寄存器的架构啊,是这样的一种方式啊嗯,那下一个问题呢,说花费更少的指令啊去完成一项操作。
05:00
呃,这里边我们想强调的一个点哈,就是占的这种方式呢,叫指令集更小,指令集更小,因为呢,它是我们说叫零地址指令啊,这个零地址指令我们后边呢,专门讲这个呃字节码的时候呢,会说这个零地址指令的字节码文件当中,它是每八位字节啊进行对齐的啊,我们到时候带大家去分析具体的一些这个字节码了啊字节码文件了,它是每八位为一个基本单位呢,而基于这种寄存器的架构方式呢,呃,它是采用16位双字节的方式呢进行对其设计的,所以呢,这个站的这种指令集更小。但是啊,指令集小,但是什么呢,这个完成同样的操作,这个寄存器呢,用的指令更少,就是上边这个站呢,用的指令多啊,当然它的指令极小,但是指令多。啊,这个你看看我们这写的一个例子哈,呃,这呢是我们想进行一个非常简单的二加三的一个操作啊,先泛泛的大家感感性上来理解一下啊,二加三这样一个操作的话呢,诶,我们呢,使用的相应的这个涉及到这个操作数站的一个问题了啊,后边我们会具体展开讲,呃,要想做这样一个事儿,我们有这样的一些具体的指令啊,一共写了有八行指令,这叫指令,而基于寄存器的这种方式呢,我们写两个指令就可以了,所以从指令上来讲。
06:26
寄存器的指令更少,这个基于站的方式呢,指令更多,但是它的指令极小啊啊,因为它是八位的啊,这个寄存器呢,是16位的啊。呃,那下个问题呢,咱们刚才那会儿强调过了啊,就是他们的这个优缺点呢,也是比较明显的啊,这个大家呢需要清楚,那这块呢,不妨咱们给大家举个例子啊,在整个呢,售购过程当中,咱们也会涉及到一些代码啊,这呢一共是咱们有16章啊,那咱就在第一章当中,像刚才说到的这样一个问题,我们去新建一个Java文件啊,关于这个站的一个它的呃架构的一个呃测试啊。
07:09
行,那进来以后呢,比如我这写一个解,要比较简单的一个操作,比如我就定一个int型的I等于二加上一个三,非常简单,就这一行代码啊,嗯,跑一下,那就直接做一个运行就OK了。那这一行代码的话呢,我们看一下在这个加载到内存中以后,呃,谈不上加载到内存中以后啊,它这个自节码文件呢,是怎么来来生成它这个相应的指令的啊,那这块我们需要做一个反编译哈,嗯,首先呢,我运行了一下,那么运行以后的字节码呢,是存在这个out。啊。那第一张这个我们先把它打开啊。OK,这呢是我们刚才运行完这个程序以后出现的一个自解码文件,然后呢,我对这个自建码文件呢,进行一个反编译操作,诶我们打开这啊。嗯,反编译操作的话呢,我们需要先进入到当前的指定的Java这个目录下。
08:15
嗯,T0好,我先跑一下啊,怕这个中间写单词写错了,好,然后再接着CD。OK,进来以后的话呢,我们执行反编译,咱们后边呢,也会专门讲这些指令,大家呢,先了解一下啊GAP,然后杠V啊我boss啊杠V,然后呢,把我们这个自检码文件的名字啊全称写上。OK,回车一下,那这呢,就是我们反编以后呢,生成的这个自解码的一个指令的情况啊,嗯,我们看一下这个当中的一个main方法,那这个main方法当中扣的这块就是它的一些指令了,呃,这是它这个具体的,呃,相当于是我们后边要说的这个PC寄存器啊,它识别的这个地址啊012,嗯,这是五直接呢,相当于我们做一个二加三的话呢,编译完以后。
09:10
这个不是在解释执行的时候呢,实现的二加三啊,直接编译的时候,编译完以后呢,就直接呢,能够识别成是一个五这个数字了,跟我们直接在这写个五呢,其实是一样的行,那我们把这个呢,程序稍微变一变啊,比如我在这个呢,我这样来定义我一个I等于一个二啊int阶呢等于3K呢,等于I加上J,好写了这样的三行操作。行呃,写完以后的话呢,可以不去运行了啊,但是这个自解码文件需要,但是这个程序呢,需要我们重新编译一下,可以在build这块有一个叫re compile啊,重新编译。那现在呢,生成的就是一个新的自己码文件啊,这时候我们按一下上重新的编译一下,好再往上找。OK。行这呢大家能看到啊,那在这儿的话呢,就是我们这个没方法,诶下边呢,就是咱们相应的这些执行的指令啊,刚才这个代码大家应该还比较清楚,哎,我这样方便一下啊。
10:22
诶拿上来行,那我们这呢是定一个变量I2皆是三,那首先呢,我们这里边啊,相当于是生成了一个常量啊,这个呢是二,然后把它呢保存起来,这个一呢,其实是操作数占的一个索引位置,保存到这个一的这个操作数站当中,然后呢,又定义了一个常量三,保存在这个索引为二的这个位置,然后接下来呢,我们把I根接呢分别给它加载进来,呃,做一个求和的操作,然后求和以后的这个K呢,把它保存在诶索引是三的这个操作数站当中。啊是这样的一个意思,那这个大家目前看的话呢,可能看的不是特别明白啊呃先呢,有一个意识就是这呢,就是我们这个指令,哎,我们做这样的三行代码呢,指令需要有八行,那如果对应咱们是用寄存器来做的话。
11:11
那寄存器的话呢,这个代码的行数呢就非常少了,那只有两行,这样大家先有一个感性的认识啊,嗯,对,然后下边这块呢,我又举了一个例子啊,又举了例子,然后这呢是它对应的反编译以后的这个资金码的这个指令,呃,下边有对应的这个图,涉及到操作数占局部变量表,程序记录器,呃,这块的话呢,我就不想先详细的给大家去解释这个问题了,因为我们后续呢就要讲,诶虚拟机站啊,这些问题呢,都会讲到啊,行,那么总结一下。哎,总结一下啊,我们说呢,呃,由于这个跨平台的设计啊,Java指令呢,都是根据站的这个方式呢来进行一个设计的,呃,不同平台的CPU架构呢不同,所以呢不能够设计为基于寄存器的,呃,那总结一下,我们说一下基于这个站的一个特点是什么呢?首先呢,提到了它的一个叫跨平台性。
12:09
这个我们希望呢,呃,在任何的平台上,平台上呢都可以去诶执行我们Java程序啊呃这个跨平台性的一个考虑,呃另外呢,是在这个呃性能比较低的这个呃设备上呢也能够使用啊呃这这个然后呢它的指令。啊,指令集小,但是它的这个指令多啊,这是相较于我们说的这个,呃,寄存器的来讲啊,这算是它的优点,那缺点是什么呢?那就是执行性能比寄存器啊差一些。哎,这个任何事物呢,我们说都有利有弊啊,它的执行的一个性能比寄存器要稍微差一些,那寄存器的典型缺点呢,就是这个跟硬件的耦合可一致性呢,要差一些啊行,这呢是我们强调的这个它的一个主要的特点啊,大家关注一下。
13:01
那下面呢,这块抛了一个问题,说时至今日呢,尽管嵌入式平台已经不是Java程序的主流的运行平台了啊,准确的说呢,是因为house power虚拟机呢,它的宿主环境呢,不仅限于嵌入式平台了,那为什么不将这个架构方式改成寄存器的架构呢?哎,大家想想这个问题,哎,我们该怎么去说呢?对吧,那首先呢,我们讲这个基于战士的架构呢,在设计和实现上呢,确实要简单一些啊,战的就是入战出战是吧?哎,我们每一个进来的这一个战的一个结构,这叫我们叫战争了后,后边会说啊,这一个战争呢,其实就一个方法,你执行哪个方法,哪个方法就以战争为单位呢,诶加载到这个战当中啊就可以了,然后呃,最上边的这个战略元素呢,就是当前执行的这个站,当前的这个方法啊,那执行完以后就出去,所以它的这个设计和实现上呢,非常的简单啊,这个其次的话呢,就是在这种非资源受限的这种场景当中。
14:02
啊,这个嵌入平台我们都认为是这个资源受限的平台啊,那基于站的这种结构,在非受这个这叫什么非资源受限的这个场景当中也是可以用的,那这是完全没有问题的,所以呢,我们也没有必要呢,这时候再做一个更换了,还是基于它的一个优点啊来看的行,那关于两种这个架构方式,执行级架构方式的一个对比,诶这个大家呢,熟悉一下。
我来说两句