00:00
那关于局部变量表呢,咱们就告一段落了,下面呢,咱们来说一下这个战争里边的第二个啊,非常重要的一个结构叫做操作术战,哎,操作术呢,翻译成叫oper,然后站呢就是stack,哎,所以呢,我们看到这个操作术站呢,它也是一个站这样的特点,也是站这特点,这个站呢,咱们翻来覆去说啊,这呢是一个这个数据结构中的一种啊,叫先进后出这样的一个特点,那站呢,具体实现是吧?占的具体实现呢,这个大家不知道清楚清楚不清楚啊,这个在这咱们多说一句,站呢,呃,它的具体实现呢,其实它可以是考虑使用数组来实现。是吧,也可以考虑使用这个诶链表来实现,呃,就是我们这写完整啊说可以使用呃数组或诶列表来实现。诶是有这样的一个特点,就是数组也好,链表也好,这属于咱们讲的叫真实的数据结构,就是真实的存在着数组和链表这样结构,而这呢,我们可以看成是满足特殊条件的一个数组或者是列表,那数组呢,咱们正常来讲,诶,你可以从呃数组创建好以后哈,咱们正常来说,你通过索引位置可以操作任何一个位置,给它重新复个值,或者把它删掉,或者说我们在这个位置呢,再插入一个元素,那就是插入到这儿,其他元素都往后移,对吧?这呢是针对数组,那嗯占呢,我们可以列成一个特殊的数组,就是比如我们只允许它从这个尾部进行一个添加或者删除,中间其他位置上元素是不允许修改的,那这样呢,就相当于是一个站的特点。
01:34
那么咱们这里边儿这个操作数站啊,它呢,其实就是用数组来实现的。哎,咱们刚才讲这么多呢,其实并不是没有用的啊,诶它就是用数组来实现的,那想强调的点呢,就是它既满足战的特点啊,就是先进后出,或者叫后进先出,哎,然后呢,哎,它还有这个数组的特性,就是按照顺序存放,然后有索引哎这样子的啊行,多说了几句,哎,我们回过来看一下这个操作数战,说每一个独立的战争当中啊,除了包含这个局部变量表以外呢,它还包含一个后进先出的一个操作数战,诶我们也称为叫表达式战。
02:10
呃,你叫expression stack也可以啊,就是这个叫法呢,其实用的稍微少一些,更多呢,咱们还是习惯上叫做操作鼠站。啊行,呃,这个呢,说完以后其实没有什么有效的信息啊,咱们刚才也强调过,它就是个站嘛,所以就是占统一的特点,下边说操作的站呢,在方法执行的过程当中。注意啊,在方法执行的过程当中,根据字节码指令呢,往站里边这个站呢,就是咱们说的操作站啊,写入数据或者提取数据啊,写提取这呢,其实就是一个入站出站的操作,只要是站只能有这两个操作啊,这个翻来覆去的强调啊,这里边所谓的方法的执行过程,其实呢,就是咱们自解码指令的一个执行过程。啊,比如说咱们这个之前的写的这些代码是吧,呃,咱们也呢通过这个呃张P或者咱们通过这个j class lab呢,都看过哈,就是在这里边。
03:04
呃,咱们打开这个code在这看也可以啊,诶在这里边,这就是咱们这个自建码这个指令是吧?这呢就是这个操作的一个呃地址或者叫偏移地址了,这就是咱们这个操作的指令了,这个指令的话呢,在他们这个执行的过程当中啊,执行的过程当中有一些操作呢,是需要呢,往我们这个操作站里边写数据的,有些呢是需要出数据的。哎,就是这个意思啊,这里边儿呢,咱们就用到了这个叫,哎操作数站。那说到这儿的话呢,形象点去理解,大家还记不记得咱们一开始讲,诶,咱们说这个站馆运行的时候呢,你看啊,咱们讲过这个菜叫做佛跳墙,上面这些呢,其实大家就可以理解成是咱们的局部变量表啊,我们存储的一个一个的数据,相应的这个索引位置上对吧?呃,它呢是一个数组结构。然后咱们这个下边呢,具体的做法说,我从哪儿这个取出来东西往哪放,哎,我要比如说有的时候需要你洗一洗,洗完了以后呢,我再干点别的,然后再把它再拿出来就是啊,一会儿呢是放进去,一会儿呢又取出来啊,一会儿呢再放进去,就是这个操作的过程啊,其实呢,你可以理解成就是咱们的,呃,这个操作数站啊,它的一个执行过程啊。
04:15
行,这咱们再回过去。呃,再回过去,接着来说说某些字字解码指令呢,将这个值呢,压入操作数站啊,比如我们是这个又变革了哈,哎,比如说我们像这个操作里边这个push操作,它就相当于是往这个操作站里边去压入数据啊,那嗯,有一些操作呢,是要从这个操作站里边呢,把数据再取出来,呃,再给大家取出来。呃,这个是我们存到这里边了,呃然后漏的呢,相当于是我们从这个呃局部变量表里边呢,再给它放进去,取出来的话呢,我们做一个求和,求和呢就是取出来求和,呃这个过程就这样的一些操作啊呃取出来以后呢,运算完以后把结果呢再压入这个站里边啊就比如说我们这有一个15加八的一个操作,呃这这呢,咱们用的这就是呃操作数站啊呃上边呢是这个占顶,呃下边呢是这个占底啊呃先进来15,后进来八,然后呢,诶这就相当于是入站的操作,现在呢,你有一个ii的操作呢,我就把这两个呢,诶给它取出来以后啊加了一个呃做了一个求和啊给我们CPU运算23,呃23呢,再给我们放到咱们这个操作数站当中。
05:25
啊,就是这样一个过程啊,那这个过程呢,都需要咱们自检码指令的一个执行啊,根据它呢,咱们去做操作。那这个操作过程当中呢,其实呃,就是借助的谁啊叫执行引擎是吧,执行引擎帮我们呃,结合着这个操作站去做这样一个过程啊,那说到这儿呢,咱们就哎不妨看一下这句话啊,说Java虚拟机的解释引擎是基于站的执行引擎,那其中这个站呢,指的就是操作数站啊,就是刚才咱们这个呃,85加八的这个过程运算的二兼果23这个结果再放进去,其实都是由这个执行引擎诶帮我们去做的这个运算啊,咱们这个具体的这里边的大家看到的这是自解码指令,那这个字解码指令呢,CPU是不认识的。
06:06
啊,那这个自解码指令在这个执行的过程当中,首先呢,需要用到操作站,其次的话呢,我们执行引擎会将这些指令,诶翻译成机器指令。诶翻译成机器指令我们去做执行啊,行,这就是咱们说的这个事儿啊。好,再回过来,嗯,这呢是一个求和运算,哎,过了,然后这儿呢,是咱们比较简单的一个程序。那左边呢,是咱们写的这个Java代码,诶bad型的IJK,然后右边呢,是我们这个字解码,通过javap咱们做了一个解析以后,诶拿到的这个,诶它的一个信息啊,这左边跟右边呢,它是对应关系,这个咱们一会呢看这个代码啊,一会儿看这个代码。好,接着我们再来把这个理论性的内容呢,先都诶过一遍操作入战啊,主要用于保存计算过存的这个中间结果,哎,同时呢,作为计算过程的变量,临时的这个存储结构,呃,临时存储结构还是说咱们刚才这个事儿啊,哎,我这呢定义了一个ii,定义了一个阶,哎这个15跟八的这一步和这一步呢,其实都是存储在我们的操作数栈当中的,哎,这都算叫临时存储啊,临时存储然后你要做一个求和运算的话呢,诶,我这是我又呃存储完以后呢,它这个占空间呢,其实就。
07:25
操作站呢,就空了哈,然后再从我们的局部变量表中呢,把它再取出来,再做求货运算,这就是一个临时存放的一个位置,存放完以后呢,诶再把它放到这个局无变量表里边,所以它也会存放一些这个临时的结果。啊,一会儿咱们画图说啊,现在大家可能一看有点懵啊,接着接着这个想说的就是这个操作作战啊,咱们是随着这个方法的调用开始的,那方法呢,对应的是个战争,那刚有战争的时候操作出战也是空的。啊,虽然说它是个占嘛,是吧,它是用的数组来存储的啊,这个站呢,是一个空的数组,相当于也是空的。
08:02
那这个咱们再回忆一个Java中的一个知识点哈,数组是空的,但并不意味着数组没有创建。对吧,哎,这个数组呢,是已经创建好了,那数组呢,我们讲过一个特点啊,数组一旦创建,其长度就是确定的。对吧,数组一旦。创建啊,其长度就是确定的,也就是说呢,我们这时候的数组呢,是有长度了,哎,是有长度了啊,那既然有长度了,我们这时候就要问一下,那这个操作站的深度是多少呢。诶,这里边我们提到这个操作站啊,跟咱们说的这个局部编量表一样啊,在编译以后呢,它就呃确定了这个站的深度啊,在编译期呢,就确定了一个明确的深度啊,这个深度呢,或者叫数组的长度保存在我们这样一个变量当中。哎,保存到这个变量当中,这个值跟咱们说的,呃,局部变量表的这个值不是一个值啊,而且它俩呢,呃,是不一定相等的,没有相关性,举个例子,嗯,咱们之前写的这些程序是不是咱们也这个扎屁股是吧?嗯,这个位置呢,是咱们说的局部变量表的一个长度,前面这个呢,就是咱们说的这个操作数占的一个最大的深度啊,这呢就是操作数占的深度,这个呢,是局部变量表的一个深度。
09:22
啊,每一个结构都有。哎,大家都能看到是吧,哎,这呢就是操作数站的这个情况啊,他俩呢用的都是数组结构。好,然后下边呢,也同样的,这个咱们操作数占呃跟局部变量表是一样的啊,你要是呃,32位的这个数据啊,这个其实这个咱们都不用多解释了啊,你像局变量表,你这个short呀,Int呀,呃,Bet呀,叉啊是吧,32位的占一个占深度,那我们这也一样,64位的像long double啊,这就占两个占深度啊,一样啊,因为占两个占单位的话呢。我们相应的这个属性这块你就得关注一下啊,你要是个浪形的变量,相当于如果只有一个的话呢,那你这个深度最起码得二,因为这一个存不下是吧,这跟咱局部变面一样啊。
10:09
哎,下边呢,咱们需要注意呃,咱们虽然是用的数组操作,这就是用到我一开始在这儿带着大家复习的这个事儿哈,我们这都是有伏笔的。拽下来有伏笔的,你想想,虽然说你这个站它是用的数组,但是呢,咱们不能通过访问索引的方式去访问数组,呃,访问数据哈,咱只能是。入战出战啊,因为人家是战啊,只不过呢,是用数组这个结构来实现的而已啊,这要注意行就这问题。嗯,最后这块呢,在呃强调一下这个问题,等下咱们来演示这个代码啊,说如果被调用的方法带有返回值,返回值呢也要呃返回值的话呢,因为你要返回上个方法了,返回上个方法的话呢,那个结果也要压入到人家这个当前这个战争的这个操作数站当中,哎,咱们来解这个,等一下来看这个代码上的一个演示情况啊。
11:01
呃,下边呢,说操作出站中的元素的数据类型跟自节码指令的这个序列严格匹配,那得得匹配,呃,人家这需要是一个int型的,你这就得用一个,呃位置你要是一个double型的,你这块对应的就得两个位置是吧?诶这个得严格匹配啊,这个编译期间呢就会验证啊,因为我们也要确定人家本身需要的深度嘛,啊这不说了,编译期。就定义好了是吧。诶,把这个我们再加上个红色啊。好了,这儿呢,咱们就是把这个呃,理论性的操作术,这样呢说了一下,大家肯定是比较迷糊的,咱们呃以代码演示一画图大家就清楚了啊,咱们先把这个停一下。
我来说两句