00:00
那刚才呢,咱们是把操作术站的这个理论部分呢,咱们就讲完了啊,那讲完以后呢,大家肯定是比较懵的哈,那不懵呢,那说明你这个有极高的这个思维能力哈,呃,能够想象出来咱们刚才说的这个过程,那下边呢,咱们需要呢,呃,拿实际的这个代码呢给大家演示一下,必要呢咱们还得画画图,那这样呢,他大家才能真正的把这个,呃操作是操作数站的这个作用呢,能够理解清楚,好这呢就咱们这一节要说的叫代码追踪啊,那不妨呢,咱们就拿刚才说的这个15加八这样的一个操作呢来演示,那代码量大呢,其实跟这个也是一样的啊,这叫一叶之秋是吧?诶我们把这个一个小问题呢说清楚就可以啊。嗯,CTRLC一下来回过来,咱们呢,新建一个Java源文件啊,在这个Java一下。新建一个。An oper stack的一个测试啊,CTRLV粘过来啊,粘过来以后,它这里边有这个PPT里边这个换行的这个操作啊,把它删掉。
01:00
诶调一下格式,哎,可以了啊,可以完以后呢,我们现在先想看一下他这个自己码的这个指令。嗯。这个总结一下几种方式啊。两种是吧,哎,两种方式啊,呃,两种方式,一种呢就是我们使用javap,另外呢,直接使用这个j class lab啊,不管哪一种都得先针对于我们这个源程序呢,把它编译成一个Z码文件啊,这个编译的话呢,大家可以直接就点一下这个re compel就可以啊。好,编辑完以后呢,我们刷新一下,看一下我们下边有没有了,在咱们的第五章啊,这个位置啊,已经出现了啊,出来以后呢,我们先在这儿看一下Java p。呃,杠V啊,或者叫我boss啊,这个是全称了哈,都可以oper。Stack。嗯,test.class回车,OK,这就出来了啊,在这呢可以看。这就是咱们的这个方法,它涉及到的这个呃,自解码指令啊,行,这是一种情况,或者呢,大家直接呢,就在这点,咱们的这个呃接class lab啊,在这看着好像也更方便一些啊,点开好方法这块呢,你看有两个啊,这个应该清楚,Init呢,就是咱们当前这个自定义类的一个构造器,默认给我们提供的构造器啊,任何类都有构造器,所以任何类都会有这个in的一个构造器的方法啊。
02:25
然后下边这个叫test ADD operation,这就咱们定义的这个方法。哎,定义这个方法啊,这个方法呢,打开看下这个code,这就是这样的一些指令啊,就在这儿呢,啊诶就对应的是咱们的这个,哎,跟这是一样的啊跟这是一样的,行,那咱们上来呢,就先来说这个重心啊,中心呢,咱们来分析一下这里边的操作哪些呢是跟操作数占相关,哪些呢又与局部变量表相关。好来看啊,这呢,就咱们的这十行代码啊,十行代码啊,这个第一行叫BI push啊这个BI,这个BI呢,咱们这个咱们不是一开始定义的这个15是一个BAT类型的,你看到了是吧,哎这就把它呢push进去了,哎这呢其实又涉及到咱们那会儿讲的一个知识点啊,像这个BAT呀,哎short,哎这个char类型。
03:16
咱们学习Java语言的时候呢,也是这样的,诶int类型是吧,诶他们这int类型本身人家就就是啊,哎这几种类型呢,我们说他在声明哎往这个数组当中去存放的话呢,诶呃就就主要说他们仨吧,包括咱们还提到说这个有布尔类型了是吧,诶都。哎,保存为。或者叫都以,嗯,这个int型。啊,来保存。哎,就是这个意思啊,那本身的这个int呢,那当然是int了,Float float呢,就还float这个double long,那各自人家是啥是啥,嗯,比较特别的就是long跟double啊,64位是吧,占两个数组的位置啊,注意这个情况就行啊,这呢存放这个存放,其实我们这个BAT呢,仍然最后还是得以这个int类型啊来进行一个存放的啊,还是一个int类型,所以你看后边我们取的时候呢,它还是一个I,还是一个int类型的啊。
04:12
好这块的话呢,我们这个push操作的,其实就是把这个15放到了操作书站当中。现在呢,还没有局部变量表什么事呢,当然呢,这一行操作之前,操作处站呢也是空的,所以呢,我们呃一创建这个方法在调用之初,操作处站呢也是空的,局变量表也是空的,这个PD计算器呢,记录了一下,我下下一步要执行的操作呢,是这个指针零的位,呃,这个指定地址是零。啊,很清楚是吧,然后呢,我们就开始执行这个零,哎,这时候呢,把这个15放到这儿,紧接着P均集算器呢,这不就往下移这个到二这了,然后这个时候呢,S store1杠一,这个I呢,就是我们现在呢,这个位置是int类型了,不管你一开始是BAT short也好,现在已经是int了,对吧,把它呢取出来放到局部变量表当中啊放到哪个位置呢?这个杠一指的是诶索引为一的位置。
05:04
怎么上来就一呢零呢?零呢是吧,哎,咱们不是说过吗?就是你这个。诶,看这是吧,局物变量表,这是一个非静态的方法,那么它的零的位置呢,放的是Z。哎,你下边这个I,哎,这个是放到一的位置了,哎,这个这不就清楚了是吧?哎,这就能连在一起了啊哎,S store这个是放到这个局部变量表里了,然后操作入站呢,就没有了,这是一个出站操作啊,然后呢,右BI8,诶接着同样的放到这个呃,索引为零的位置啊,这个是八在这儿,然后再这个store操作,把它再放在局部变量表里边,这就又出站了。那这个PDA寄存器我就不多说了啊,它的这个地址依次会进行一个调整,所以它呢是内存最快的区域是吧?哎,执行最快的区域啊,然后I store ILO的杠一,I漏的杠二,这两个操作呢,是从局部变量表中把索引为一和二的这个位置,这个数据呢,依次取出来,哎,取出来一放到槽作数站,这就是个入站,然后取出这个索引为二的位置呢,哎,也放到槽作数站,这呢我们操作站呢就放了两个数据。
06:11
啊,然后接下来呢,进行一个叫ii的操作,那这直接就23了啊,那这个就是相当于我们把这两个数据紧接着呢给他出战。哎,出站出站以后呢,就是把它俩做一个加的运算啊,I加加I ii的嘛,你像我们这是不是一个字节码指令啊,这个字解码指令需要咱们说的执行引擎。这个这几个字还不好写啊。需要咱们这个执行引擎呢,把这个自建码指令呢,是不是翻译成机器指令,诶机器指令然后被这个CPU呢,是不是做一个运算呀?诶CPU呢,把我们这个15跟八一加A算完,结果呢是23啊就是这有这个直引引擎这样的一个操作过程啊,诶23呢又。放到了我们这个操作数站当中了,这ii的这个过程,放到这以后呢,接下来我们把这个23呢,存储在以int这个类型的方式,存储在我们居无变量表,所以为三的这个位置啊,是23。
07:13
哎,就放到这儿了。诶放到这以后呢,咱们后边呢,没有其他操作,整个这个方法呢,也是没有返回值的,最后呢,是一个return结束。哎,这就是咱们整个分析的一个过程,行,那这个过程呢,这不咱们刚才那会也强调过,像这个诶push push这个load的是吧?哎,包括这个ADD,整个这个过程这些呢,都涉及到,呃,去操作这个操作数站,呃,这个store呢,就是保存在我们局无变量表的过程啊,那另外一个点呢,就是咱们看到了啊在这呢,局部变量表你看我们这个最大的索引是三,所以这个局部变量表的最大长度呢,是不是就是四啊。哎,前面还有一个那个零的Z是吧,而我们的操作数占呢,自始至终呢,用这两个空间就可以了,所以它的最大深度呢是二,那我们也可以看一下咱们这个位置。
08:03
这是咱的一个方法,你看这个局部变量表,这是四,这个呢是二。那这不就对应上了。对吧,诶这就是咱们说的,诶这样的一个过程啊,那这里边呢,你看我这个BAT呢,是15,你看我这要改成154呢,肯定是BAT,就诶这个我我我这样吧,我来保留一下人家这个结果哈,嗯,我在这个后边这哈,我在定一个short型,呃short别short型了,我就直接定一个int型吧。IJKM,这个我写一个八。你看其实这跟我们这个街一样啊,那我这写了一个八,重新做一个编译。好,然后呢,我们在这呢做一个刷新。诶,这时候呢,我们再来看这个扣的啊,你看这个八八在这儿是不是,你看这叫BI push。呃,相当于这个八呢,在我们这个BAT的范围内啊,它就相当于是一个BAT型的一个一个字节就能存,然后呢,呃,当然我们put完以后呢,在store存储在我们局部变量表的时候呢,它就是一个int型了啊,相当于是一个BAT转换成int型的一个操作,那如果我这呢写成是一个800。
09:11
我写成800了啊,再做一个重新的编译。诶,这时候我们再做一个刷新。你看这时候呢,就变成SI push了,诶相当于把一个short类型的转化成了一个int类型,因为这时候800已经超出了咱们的bad范围啊,超出bad的范围,那这时候呢,他就认为是一个short,那你要这个数据呢,Short也乘不下了,那就是一个int类型了。啊,那要是超过这个int类型呢。超过int类型呢,这个是一个long类型了,那int搞不定啊,它就直接编译呢,就报错了,诶这个大家诶这个大家注意一下啊,就还放到里800,诶这个就注释一下啊,体会一下这个小问题就可以了啊。行,嗯,这呢是咱们说的这个事儿,然后的话呢,然后怎么着呢,我们这个刚才呢,提到过这样一个知识点。
10:03
说呢,如果被调用的方法带有返回值的话,其返回值呢,将会被压入当前战争的操作数站当中啊,并更新计算器中的下一条指令啊,下一条需要执行的最行码指令,嗯,那我们回过来这样吧,诶,我们在这个位置呢,我return一下。啊,这个return,我们把这个结构就给改了是吧,这么着吧,我在下边啊,Public写个int,嗯,咱们这呢叫get。恩萨。行,我在这呢,Int一个M是十,Int一个N,这个是20,然后我return一下。嗯,这样这样这样写也行哈,一个K等于。M加上N。Return,咱们这个K。哎,这样子啊行,然后呢,我在这个我再我再定一个方法吧,我就不破坏咱们整个这个结构了啊。Public,我去get一个test。
11:02
Get。Some。嗯,Get some这个方法。嗯,这个呢,我直接一个I来接收。下边呢,我再in一个接,咱自己定一个随便的一个变量就行,好把这个呢,我们做一个编译。编译完以后呢,我们过来做一个刷新,诶首先呢,我们看下这个get sum啊,该sum这块呢,其实没有太特别的,它唯一呢,我们想强调就是最后一个叫I return,他把这个值呢作了一个返回,那返回以后他呢,这个战争就结束了,这个战争一结束呢,我们当前的这个方法啊,又回到了,又作为了当前战争是吧,它作为当前战争,咱们看他的code。诶进来啊,一上来呢,大家看就A,诶LOAD0,诶一上来就做了个加载,咱们那会儿也说了这个漏操作呢,这不就相当于是咱们往这个操作站里边做操作嘛,也就是说一上来我就调用这个方法,然后呢,把你这个方法的这个返回值呢,就保存到了我们的操作数站这个I的位置上了。
12:09
哎,一上来就有这样的一个操作,哎,这就相当于来承接咱们,哎首先呢,上来就获取,诶是不是上一个,哎战争啊,这个返回的这个结果啊并哎哎保存在。哎,我们这个,哎操作数,哎占中是吧,哎这呢,就咱们强调的就是上边的这句话。强调的这句话啊,行,嗯,那这个呢,我们就算是说清楚了啊,然后最后这块呢,你看有一个嗯面试题,这个面试题的话呢,大家应该是被问过啊,诶很多时候呢,被问了以后呢,呃网上呢,背一背啊就会了,但是呢,你真正的是不是清楚这个事儿不一定。什么问题呢?大家看说面试过程中啊,他问你说I加加加加I的区别是什么?呃,这个时候呢,咱们看或者已经写了,说放到这个资金码篇章的时候再说哈,呃,也就是说大家你看这个事public VO这我就写成一个ADD。
13:15
哎,写这个方法了啊,这里边呢,应该说是有这样的几个递进的操作,大家你看我描述的对不对啊。嗯,我int一个I10I1加加好int一个I2呢,也是十,我是加加I2,这呢是我们的第一类问题。诶问一下这个A加加啊,和这个加加I它有什么区别,这是第一个层面的啊,然后第二个层面叫第二类问题,哎,我int一个这个I3是。啊,一个I4等于I3。哎,这个是后加加一五。十。I6加加I5,这就是咱们平时所说的这个后加加前加加,那复制以后呢,肯定这个S跟I6啊,这个不都是这个十的,哎,相当于这个I4呢,不是I4是十是吧,I4是十,然后这个I6的话呢,就变成11了。
14:17
嗯,这个呢,从字节码的角度呢,我们看怎么理解,这是第二类问题。诶第三类问题,再升级一个I7是吧,I7呢是十,然后呢,I7就直接用I7加加。这样的I8是I8。加加A8这个代码呢,大家应该开发中不怎么写的是吧,你能不能通过自己码的方式呢去解释,这是我们说的第三类问题,第四类问题,嗯,Int I9等于十。
15:00
哎,I10等于啊,I9加加,然后加上加加I9啊,有点恶心了,这个结果是多少,从词解码的角度呢来解释一下,行这呢我就列了这样的几种问题,实际上呢,大家把它编译一下。是吧,编译一下,然后呢,再直接呢接lab接class lab啊这块呢,你就能够看了。哎,那就是看看会不会解释这个事情。哎,怎么通过这个操作数占,通过这个局部变量表把它分析清楚啊,那只说第一类问题哈,这个I加加呢跟加加I,如果我们在开发中呢,就是这样写的,经常大家写for循环,呃,这个第三个部分就是I加加嘛,其实你写I加加跟加I呢是一样的啊,你看我们这里边操作这个,呃,跟这个其实都一样啊,就是这一个二,一个二是我们这个变量局变量表这个位置啊,诶索引为一的位置,索引为二的位置,哎,都是通过一啊做一个加的操作。啊,这个increase是吧,增加的操作啊,呃,它俩是一样的,下边这个问题呢,后边具体怎么来解释,咱们放到字节码的篇章的时候呢再讲。
16:05
哎,这样子啊行,那么关于操作数站呢,咱们就先告一段落。
我来说两句