00:00
行,那么关于刚才这几个概念清楚以后啊,咱们下边呢,重心呢就是来讲一下,哎,这里边提到了一个叫解释器,哎这块呢叫即时编译器,那我们Java语言呢,称为叫半解释型半编译型语言,主要原因呢,也是基于我们这个直行引擎当中呢,哎,是由这个解释器和git即时编译器这样的两种行为导致的啊,那我们就分别来看一下,首先呢提一下这个叫解释执行啊,涉及到这个叫解释器。对吧,还涉及到这个解释器,那涉及到这个解释器的话呢,我们知道张化成这个GGM啊,它主要呢,是针对这个字节码来讲的。啊,针对这个资金码来讲的,那刚才呢,大家有没有这样的一个疑问。啊,这个哎,我在这个一开始学习的时候呢,我就会有这样的一个疑问,说咱们Java程序呢,是叫跨平台的,咱们呢是先成先生成这个叫自解码文件,然后呢,这个自解码文件的话呢,实际上它也是具有这个跨平台的特性,对吧,因为我们直接呢,是不是在不同的这个,呃,这个操作系统上,你装不同版本这个虚拟机就行了,这个资金码文件呢,实际上就是打的一个包啊,一个炸包啊,在不同平台上呢,实际上都可以跑。
01:04
啊,那为什么一开始呢,就设计成这样子的啊,因为咱们刚才说了这呢是不是叫高级语言呀,这个高级语言的话呢,我们说往下边翻译的时候呢,你直接就整个虚拟机里边提供一个这个执行引擎,你直接呢,就用这个执行引擎去翻译成这个汇编语言,汇编语言呢,再翻译成这个机器指令就执行呗,然后呢,你这个不同的操作系统,你提供不同版本的这个,呃,我们说这个渣va虚拟机现在对应的你翻译成这个,呃,不同平台这个指定的这个集,这个对应方式呢是不一样的,不就完了吗?这不也是具有一个跨平台的特性吗?大家能理解我刚才说的这个问题吧,就是说我为什么干干嘛我要这块突然加一个词解码呀,我直接呢,就高级语言往下翻译不就完了吗?是吧?诶那这个我一开始呢,就有这样一个问题,那么这个问题的话呢,呃,我是这样来理解的啊,看大家呢能不能去认可啊,呃,那实际上的话呢,如果我们直接把这个Java源文件啊,就是所谓的这个高级语言直接呢,给它翻译成对应平台这个GM呢去执行可不可以呢?实际上呢也是可以的。
02:04
啊也是可以的,而且这呢,其实也是叫跨平台的。这个,但现实情况呢,咱们是先要生成一个资金码文件,然后资金码文件呢,再去,呃,Java不同的这个版本操作系统的这个Java虚拟机上呢,去节日执行啊去运行,那为什么要这样做呢?诶我是这样理解的啊,你看我这写了个时间就是,嗯,应该这样说啊,就是不同的人啊,他擅长做不同的事儿。啊,擅长做不同的事,我们这个Java的原文件呢,咱们呢,先给它翻译成一个中间的一个产品,然后这个产品的话呢,非常容易的被我们Java虚拟机呢去识别,然后去做个执行,那么这些人呢,就是我们称为呢叫后端的工程师了。啊,那么这个呢,咱们称为呢叫前端工程师,就是前端这个编译器的工程师,这呢称为叫后端编译器的工程师,你一开始Java语言有的时候呢,你让这个工程师呢,它呃直接呢去翻译我们这个原文件,然后呢,翻译成这个,诶不同这个操作系统上的这个机器指令,然后翻译成Windows,翻译完Windows以后呢,再去翻译Linux或者Mac,那么这呢,对这个人的要求啊太高了。
03:10
啊,他做不到这样啊,没办法,这个前后都会写啊,全占了是吧?啊类似于咱们说的那个全占了他他搞不定怎么办呀,那咱们就先呢,整一个中间产品啊叫资己码文件,那这个文件格式呢,诶再被再被我们这个不同版本这个系统上的这个GM呢,去识别的时候呢,就要更容易一些啊就相当于把这个工作呢,给它这个分割了一下,对吧,那就好比是呢,比如咱们以这个小米手机为例啊,诶这个小米手机呢,它先呃成立的时候呢,你指望着让小米手机现在去造这个CPU啊,去造这个电池等等,呃,它呢搞不定啊,那这时候呢,他就考虑说这个CU啊,要不咱们就直接用这个高通的,或者咱们用这个三星的是吧,那个CPU呢,直接就现成了,就有点像呢,这个环节呢,呃,三星呢,直接或者要高通呢,专专门呢给大家去把这个CPU呢就提供好了,然后小米公司呢,诶包括还有其他的一些这个硬件是吧?诶你主要呢,来负责的就是这个设计啊,你把这个手机这些元器件呢,怎么很好的排到你这个手机上啊,然后呢,你再去设计你的软件系统。
04:11
同让整个呢,这个呃,手机的性能啊,达到一个最佳性能的一个发挥啊,然后呢,你再去营销你的品牌,就是不同的人呢,干不同的事儿,这呢就成为我们叫编译器的前端工程师,这叫编译器的后端工程师。啊,这就有不同的这个分工啊,我是从这样的角度来考虑的啊,就是你要说完全从这个原文件直接打通呢,去各个平台上去跑可不可以啊,实际上也是可以的啊,实际上也是可以的啊这呢花了五个小时做成这个事儿,然后这呢都需要十个小时,但是你让这个人呢,一一通全做完,他可能需要20个小时,那不妨呢,我们就分开来做。哎,这样的来理解啊,行,那我们现在呢,提的这个解释器也好,还是说下边提的叫git编译器也好,都是针对于这块环节来讲的,这个呢是不属于咱们Java虚拟机的这个范畴的,对吧?诶,明白啊,行,呃,那么下边呢,来解释说明说这个解释器啊,真正意义上它所承担的角色啊,就是一个呃,这个运行时的一个翻译者将自解码文件中的内容啊,翻译成对应平台的一个机器指令啊去解释执行啊这样说呢,当你把上一条呃,这个上一条这个执行码指令这个执行完以后呢,你就接着去这个PC寄存器当中,或者叫计数器当中,你接着取下一条指令就可以了啊这个非常简单是吧?然后接着我们来看说这个解释器啊,在Java的发展过程当中,一共出现了两种主要的解释器。
05:33
一种呢是比较古老的叫做自解码解释器,一种呢是叫模板解释器啊,这个大家了解释就行啊,这个自解码解释器呢,就是逐条翻译啊,把这个使用纯软件的方式呢,把我们这个自解码呢,给大家翻译成这个机器指令去执行,这个效率呢10/10分的低下啊了解一下啊,然后这个模板解释器啊,一说到模板呢,就想到我们这个模板的设计模式了,对吧?诶那这个只要提到模板这个想法呢,都是类似的,大家写作文的话呢,有模板这个我还记得我小时候呢,这个吃月饼的时候啊,当时我妈哎,就用这个一个专门这样一个模子嘛,把这个馅做好以后,然后呢放到这模子里边一样,然后呢去烧,最后呢就刻出来一个月饼啊,其实当时那个月饼,现在想想觉得吃的是真好吃。
06:14
啊,现在的话呢,这个买的都是现成的,比当时这个料呢要好很多,但是呢,总感觉少了当时的那个味道是吧。行,这都是一个模板啊,那这个模板解释器呢,就是把每一个字解码,诶和一个模板函数呢,给它关联在一起,这个模板函数呢,直接呢就能够产生,这叫自解码的一个机器码了。啊,直接产生这套资金码执行的这个机器码,很大程度上呢,能够提高解释器的一个性能啊,解释器个性能下边是house包的虚拟当中,这个解释器呢,又分成了两个主要的模块啊,这个大家了解就行啊,就不多说了,那这呢给大家举个例子哈,这个我是以这个在呃cython为例哈,C Python呢,就是我们呃,首先pthon这个语言呢,我们有具体的解释器,这是用C语言呢来实现的一个解释器啊,叫c Python,那么在这个get上的话呢,我看到它这个一段的源码,正好这段源码呢,跟我们这里边所说的这个模板呢,是一样子的啊,我们来解释一下,整个呢这块我画的这个框呢,实际上是我们这个C语言的这个诶。
07:08
流程控制是吧,那在这个流程控制当中,我这呢放了几个这个红框,这几个红框呢,就是我们Python的这个算是它的一个自解码指令,那么把这个自解码指令呢,嵌套到我们这个C语言的这个函数当中,哎,进行一个解释执行,哎能够使得这个效率更高,那这个套路就是在我使用这个C语言,我们呢,去解释执行这个Python的这个自解码是吧,跟咱们现在呢,想提到的这个,嗯,咱们用Java里边这个所谓的模板呢,去解释Java语言的这个自解码是一样的道理。啊,是一样的道理啊,行,那大家呢,能够理解这个过程就可以了,行,那么下边呢,我们来提一下,这个叫现状啊,嗯,咱这呢相当于是两条腿走路,一个呢叫解释器,一个呢叫节日编译器,那现在呢,我们想说的是这个,呃,这条腿解释器的这条腿啊现在呢,被理解成是一个叫哎低效的代名词。
08:00
啊,不管呢,你是用最初的这个古老的字解码解释器,还是用我们说后来的这叫模板解释器都一样,它呢整个解释器都认为是一个低效的代名词,因为对于我们这个C和C加这个语言来讲呢,它更多的呢,实际上是哎,我们说这个过程。对吧,哎,它是直接呢,就是由高级语言到这个汇编到这个这个这个诶机器指定一个过程啊,诶或者说呢,我们这个C语言的话呢,它其实是这样的一条路径是吧,当然后来的话呢,这个C呢,其实也增加了这样一条解释执行的路径啊,当然毕竟呢,人家下边这条路径呢,是更高效的一个代表。哎,更高效的一个代表啊,行。哎,找到下边这个PPT。嗯嗯,很多语言呢,他们都有对应的这个解释器。哎,都有这个解释器,但是你要是只有这种解释器的方式呢去执行,这就是一条腿走路,就被认为是低效的代名词,那Java的话呢,已经今非昔比啊,Java最开始的时候呢,我们说也是只有解释器的,对吧,那么现在的话呢,我们Java有了一个叫即时编译器这样一个技术。
09:00
那即时编译器呢,就能够及时的去避免函数呢被解释执行,将整个函数体翻译成机器码,然后呢,我们还会把这个翻译成的机器码呢,给它做一个缓存,当你再去执行的时候呢,直接就执行机器码,那你想想直接执行机器码,不用我们再去将这个诶生成的这个资金码文件呢,再去做一个,诶这个这个。汇编等等这样的一个过程,这个是不是我们的执行效率就更高了呀,大幅度的提升了这个程序的这个执行。对吧,哎,这呢,就是我们提到Java呢,越来越高效的原因呢,是因为呢,我们有了第二条腿啊,叫做GI即时编译器啊,然后最后呢,一个盖棺定律,盖棺定论是吧,即使呢,我们现在这个解释器呢,这个。虽然说呢,作为这个绩效的一种代名词了啊,但是呢,在这个语言的发展过程当中啊,也存在着不可磨灭的贡献啊,就像我们现在呢,说这个功能机一样,这个原来的2D手机是吧?虽然说呢,现在没有人再去用这个,呃,功能机,包括呢当时的这个BB机啊,BP机应该叫是吧?呃,不知道大家呢,有没有听说过这个词啊哎,我上初中的时候呢,有这个BP机啊,当时呢,一说这个BB机上面能够显示一一串信息啊,随时呢都能显示啊,觉得非常的神奇是吧,而且呢,当时还有一个这个工种,是不是就BP机的这个叫客服啊啊就是美丽的小姐姐啊,声音呢也非常甜啊,现在呢,这个都没有这个BP机这块的一个客服了。
10:21
啊,就完全的业务都没有了啊,那么虽然说我们现在不用这个BB机和2D的那个手机了,大哥大是吧,但是呢,在这个手机的发展历程当中啊,那我们说BB机也好,这个大哥大也好,啊,都做出了不可磨灭的贡献啊,踩着他们的肩膀呢,然后我们才有了今天是吧?啊,那对于咱们张号程序来讲呢,并不是说咱们这个解释器呢,后来就干掉不要了啊,那他呢,还是要发挥作用的,那么这时候我们就要谈到说既然即日编译器呢已经很好了,干嘛还要留这个解释器,这呢就提到说诶它的一个优点和缺点是吧,需要我们这个解释器呢来进行弥补,OK,哎,那么接下来呢,我们再说的就是这个,诶即时编译器。
我来说两句