00:00
好,那到此为止呢,咱们就算是把战争当中最重要的两个结构,一个呢叫做操作术战,哎,不是这啊,一个呢叫做操作的占,一个呢叫做局部变量表,咱们就介绍完了,这是最重要的两个结构啊,然后剩下的结构呢,咱们一会儿再说,那么局部变量表简单稍微总结一下,局部变量嘛,其实你可以分成两个词,一个叫局部变量,一个呢叫做表。啊,那局变的呢,就是咱们以前所说的这个变量的其中的一种分类方式中的一种叫做局部变量方法的行参啊,方法内部定义的这个变量啊,哎,都算叫局部变量,那我们这块呢,说是用一个表来重装的,这个表呢,其实我们应该算叫一味的啊。跟咱们数据库里边说的那个二维的有行有列是不一样的,诶求变量表呢,用数组来实现对吧?诶用数组来实现,然后呢,再编译起呢,就确定了数组的长度。来存放我们这个局部变量的,好,这就不多说了啊,然后呢,我们讲到这个操作数占。
01:00
首先呢,也分两个词啊,首先呢叫占啊,这个占的话呢,就是咱们通常所说的内存数据结构当中的这个占的概念啊,先进后出或者呢,你叫做后进先出都可以啊,这个站的话呢,它可以理解成是一个at叫抽象数据结构。啊,这个大家学数据结构呢,应该清楚啊,那它是用我们可以真实存储的叫数组,数组结构或者叫链表结构呢来实现。那这里呢,咱们这个操作数站呢,它是选择了用数组实现啊,那就意味着呢,它这个数组一旦初始化的时候呢,长度也确定了,咱们这个操作数站啊,在编译的时候呢,它的长度呢,也就确定了,咱们前面已经说过了啊,那这块呢,需要注意的就是,虽然它是数组,咱们的局部变量表也是数组,但是既然你是占了它就只有入站出站操作,我们就不再考虑通过索引去调,指定位置上,你想调谁就调谁了,这个事儿做不到了啊,它是一个站的特点,行,然后呢,前面这个叫操作数嘛,操作数呢,你再分,其实又看成两个词,一个叫操作,一个叫数,这是一个动词,这是一个名词,是个动宾结构的是吧?哎,那你可以呃这样来理解,就比如说咱们写的这个程序里边,像这个哎push啊,像这个load呀,哎等等,哎,这都是相当于往我们这个操出站当中去放数据。
02:22
啊,ADD的时候呢,就给大家取出来了,做一个求和运算是吧,就是这种都有这种动作的操作啊,诶你列解成就是诶操作数呢是吧?哎用的是一个栈结构,这样可以浅显的来理解一下这个概念啊。行,那关于这两个结构呢,咱们就告一段落,然后下面的话呢,咱们再讲,呃,另外的叫动态链接,之前呢,咱们再说一个技术,这个技术呢,叫做占顶缓存技术。Pop stack开ing啊,这个一个技术啊,那这呢也是我们Java虚拟机当中,或者准确的说呢,是houseport Java虚拟的这个团队当中啊,诶设计出来的这样的一个技术啊,我们看为什么要有这样的技术啊,对啊,前面提到了基于战士的这个架构的虚拟机啊,它使用的是零地址指令。
03:08
这个咱们在第一章讲这个虚拟机的时候呢,提到了这个虚拟机的Java虚机的一个,呃指令架构方式,咱们选择的是战士的一个指令架构方式啊,它的特点呢,就是零地址指令啊,零地址指令就是咱们说表示一个具体的一个操作的话呢,它会有一个地址,也有具体的这个呃操作这个数据,那咱们。这个Java的这个不是虚拟机的这个战士结构呢,它就不用考虑地址了,因为呢,它就用的战马。你只有入站和出站这两个指令,就用不着地址了,诶这个区别于咱们说的。呃。诶这边没有写啊,区别于咱们说的这个存储这个寄存器,寄存器的话呢,它分成叫一地值二地值,三地值指令啊,就是甚至还有三地值指令对吧?哎,那这呢就不用了啊,所以呢,零地址指令呢,它既然少了这个信息了,所以它这个指令集呢就更小一些。
04:02
但是是吧,咱们不是说过,但是嘛,但是呢,就是呃,这个基于战士的这种结构吧,它的这个指令会很多啊,就是咱们要想完成的操作的话呢,指令会显得很多,因为呢,它有入站出站,不停的入站出站,所以指令很多,导致呢,就是咱们内存读写的次数啊,有点长,时间有点长,那内存读写次数一长的话,整个效率呢就显得差一些了。这个应该很好理解对吧,那么这个指令很多,这个事呢,咱们也很好体会啊,这是咱们这个之前写的就是这个程序嘛。哎,这个程序的话呢,咱们这个还可以再重新的给它编译一下啊,以防万一啊,编译完以后呢,咱在这个terminal这个位置啊,可以让它呢重新的做一个。诶,这个自解码文件的一个解析啊P。Stack的一个测试。好,这就过来了啊,过来以后呢,咱们随便看这里边的一个方法啊,就比如我就看这个叫test get sum这个方法。
05:07
哎,往前找行这呢,咱们就找这个方法了,你看我们这个代码当中啊,Java程序呢,其实就只有两行代码。啊,就是代码这两行,这还有个注释哈,然后但是我们这个,嗯,字节码文件当中,字节码的这个指令呢,你看从这开始一直到这,这算几行呀。注意不是八行啊,是九行,因为咱们这还有个零的啊,诶算是这个有九行那个代码在这看行或者呢,大家可以直接通过我们这个接接拉lab啊,可以考虑刷新一下,然后进来这个测试我们这个方法打开啊code,然后诶在这个位置这边能看到这九行对吧?诶然后在里边打开的话呢,我们看一下这个第一个咱这呢啊,它这这是二十七二十八二十九。啊。272829是吧,这三行,然后对应的就是我们这个啊,就是这前面是这个自建码指令的058啊,是我们这的。
06:01
这个A058了是吧,这个细节咱们前面都已经看过了啊,诶你就是知道呢,我们本身呢,就只有这两行,实际写代码的这个操作呢,在这儿翻译成了挺多行了,哎,就是因为呢,咱们用的这个站式的这种结构吧。他就会有更多的这个啊,进站呀,出战呀,这个指令最后呢会很多。啊,前面已经介绍过了啊,那么为了能够更方便的或者叫提升我们这个执行的一个速度啊,你看这里边提到了频繁的去操作话呢,显然影响速度了,那怎么办呢?诶house包扎va虚拟的这个设计者就提出了说叫占顶缓存技术,那那什么一个意思呢?他考虑呢,就是将占顶的元素。全部呢,缓存在物理的CPU的寄存器中。哎,你看首先咱们讲说这个缓存哈,就一提到缓存的话呢,大家应该有这个概念,呃,第一个就是它会存储相当长的一段时间,对吧,我们不会说呢,这个结构用完以后呢,就给它销毁掉,就像我们内存中加载一个类一样,不是说这个类用完以后,似乎马上就要把它销毁了,诶这个缓存呢,我们可以随着这个Java虚拟机的一个生命周期呢,给它保存下来啊,就是方便你后边再使用嘛啊,在内存中给你保留下来啊,不用再重新去加载啊那。
07:16
这边呢,我们提到这个缓存这个,呃,当然刚才说的缓存一个会保留哈,另外呢,就是很多时候呢,缓存的这个数据呢,都是在直接的这个内存当中,就物理的内存中去缓存啊,这里呢,我们说的缓存呢,是物理上的这个寄存器中。哎,这个跟占对应的呢,就是寄存器嘛,诶,我们将占领的这个数据啊,缓存在寄存器里面。啊,那这时候咱们再回忆一下,之前咱们说这个寄存器的时候呢,它的这个主要特点,咱就不说人家缺点了,它这个优点的话呢,就是指令是不是更小是吧?哎,然后呢,执行速度快。都是相较于咱们说的这个站来讲的哈,指令更。更少吧。那指令更少啊,那既然呢,你用这个物理寄存器啊,去对我们这个占领元素呢进行缓存了,那指令更少,那减少了你这个所谓的这个进单出站这个操作一样是吧,指令变少了,那同时的话呢,我们可以直接呢使用CPU呢,去操作咱们计算器中的这个数据了啊,比如说我们上面提到的这个叫爱的这个操作吗。
08:20
对吧,诶可以直接呢去执行了,所以呢,整个呢,呃,这个运擎的效率呢,就会更高啊,提升了我们执行行执行引擎的一个执行效率,哎,这呢就是我们提到这样一个技术啊,大家如果百度去查这个占领缓存技术的话呢,涉及到的相关信息呢,比较少啊,就这呢是houseor这个设计者们呢,提出来这样的一个呃实施的技术,那这个技术的话呢,还得需要在我们这个house包中具体进行测试,它才能够具体的应用起来,这儿呢,大家诶先做一个了解啊,清楚这样的一个新的技术跟想法就可以了。
我来说两句