00:00
那下边呢,我们再来强化一下,或者说叫温习一下Java代码的一个执行流程啊,呃,那执行流程的话呢,这有一个这样的图,这个呢大家应该都见过哈,比较清楚了,那我们写的Java源文件啊,点Java结尾的,首先呢,经过编译的过程生成自节码文件啊,一个或多个,呃,每一个自节码文件呢,我们说都对应着一个具体的类是吧,一个Java层面的类啊,然后呢,自己码文件呢,进行解释执行啊,是运行在我们具体的操作系统上的GM当中啊,这个图呢,大家都都见过哈,类似的图很多,那我们这里边儿呢,想把它再展开说一下,那那就大家看到了这样一张图,那这了原文件的话呢,首先这个经过编译器。扎编译器我们也称作叫做前端编译器,生成呢自解码文件,那在这个过程当中呢,我们编译器中涉及到了呃这样的一些具体的细节,诶词法分析,语法分析啊,生成这个抽象语法,呃,这个利用抽象语法数,然后呃语义分析等等,那这个过程的话呢,对于学过汇编的同学应该并不陌生啊,应该并陌生,那现在的这些关于前端的这些细节呢,大家就不需要过多的去关注了,除非呢,你去涉及到开发一门语言啊,你就是大家也可以考虑做这个事儿啊,你自己开发一门语言,然后呢,让他解释运行,你这里呢,就可以借助于Java的虚拟机啊,那你只需要呢,要求你生成的这个自解码文件满足Java虚拟机规范就可以了,呃,重点呢,你去设计这个语言的语法以及呢,它的编译器,就是所谓的前端编译器就可以了啊,是这样子的啊好,那这里边我们想强调的问题呢,就是说在原文件编译的过程当中,任何一个环。
01:44
环节如果出失败了,那么我们都不能够正确的去生成自金码文件,昨天我们也看官方文档了,就是Java语言呢,在这个自激码文件方面呢,要求是非常严格的啊,必须能够准确的识别,我们才可以去解释运行,否则呢,就会有一些恶意的攻击,所以任何一个编译器的环节失败了,都不能够正确的生成一个自解码文件啊,是这样子的啊好,那么自解码文件我们也说了,呃,Java虚拟机它执行的是自解码文件,那不管你是什么语言,只要呢,这个你遵循这套规范就可以了,那这个自己码文件说白了它也是一个跨平台的啊呃,那么自己码文件呢,我们经过Java虚拟机,这是我们要讲的一个核心,首先呢是类的装载,然后涉及到自解码的一个校验器,呃,接着呢是呃翻译自解码解释解释执行,或者呢,使用叫GI解释编译器啊进行一个编译,嗯,这块呢,实际上就是我们所提到的执行引擎啊,这也是我们。
02:44
讲到为什么指引引擎是非常重要的一个原因,因为呢,咱们说操作系统它并不识别自解码指令,那操作系统呢,只能够识别机器指令啊,就0101这样的机器指令,那在这个过程当中呢,呃,大家还可以再看这样一张图。
03:05
嗯,诶看这张图哈,就是我们所说的这个执行,对于操作系统或者说这个底层的硬件来讲呢,哎,只能够识别机器指令啊,那机器指令咱们现在写程序呢,肯定不会去写这个指代的,这个打打孔了是吧?那汇编呢,我们现在都很少写了,都是高级语言,那么高级语言呢,需要翻译成汇编,那这里边就涉及到一个编译的过程哈,然后汇编呢,呃,包含一些具体的一些呃诸级符了啊,然后呃,跟机器指令或者它再翻译成机器指令哈,那很多情况下,我们可以把汇编呢跟机器指令就合成一体了也可以啊呃,然后呢,在我们具体的操作系统上去执行,那高级语言翻译成机器指令,这个过程呢,刚才我们也强调过,其实就是主要由执行引擎来完成的,所以这也是我们提到它为什么是呃,整个GM非常重要的一部分的原因。啊,是这样的一个情况啊,那目前呢,市面上比较主流的这个虚拟机的话呢,都采用了叫呃解释执行和即时编译并存的这样一种方式,那这里边儿这个解释器它呢,是主要来呃保证这个响应时间的。
04:14
啊,保证响应时间就一上来呢,我们就逐行的去针对于自解码指令呢,进行一个解释执行,那GI编译器呢,它可以针对咱们这个自解码指令啊,其中有一些代码是反复要执行的,我们把它呢就称作叫热点代码,那这个热点代码呢,我们可以在呃使用这个git编译器,直接呢就把它呃再编译成机器指令,注意这出现了一个二次编译哈,第一次编译呢,是把原文件编译成自解码文件,第二次编译呢,是把自解码文件中的自解码指令把它编译成机器指令,同时呢,把这个机器指令,由于它是反复执行的热点代码嘛,我们还给它缓存起来了,诶放在这个方法区当中直接缓存起来,诶下次可以直接调用,所以呢,Gid编译器呢,主要来负责程序的一个叫什么,呃,执行的一个性能。
05:05
啊,所以现在呢,主流的虚拟机都采用二者并存的这种方式啊来实现的啊,那大体上就把这个过程呢,稍微解释一下啊,这个大家要清楚。
我来说两句