节:Java代码执行流程

Posted 李阿昀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了节:Java代码执行流程相关的知识,希望对你有一定的参考价值。

这一讲,我们来重新温习一下Java代码的一个执行流程。

在这之前,大家不妨来看一下下面这张图,相信大家或多或少都看过了,因为类似的图有很多。

从上图中可以看到,我们写的Java源文件,即.java结尾的文件,首先需要经过一个编译的过程生成一个或多个字节码文件,当然,相信大家都知道这每一个字节码文件它都对应着一个具体的类,然后生成的字节码文件才能被解释执行。注意,字节码文件是要运行在具体操作系统之上的JVM当中的。

看完上图还不够,这里我还想将上图再来展开说一下,展开之后的图如下所示。

从上图中大家同样可以看到,Java源文件首先还是得经过Java编译器(也可以称作前端编译器)生成字节码文件,只不过在这一过程中,会涉及到Java编译器的诸多具体细节,具体一点来说,就是编译这一过程会包括词法分析、语法分析以及语义分析等详细步骤,甚至于抽象语法树也有用到。

这一过程相信对于学过汇编的童鞋来说,应该并不陌生,不过没有学过,也不打紧,因为我们的重点并不在前端编译器涉及到的诸多细节上,除非你是要自己开发一门语言。当然,如果大家有时间和兴趣,那么不妨考虑自己开发一门语言玩玩,开发一门语言的重点就是你要如何去设计这门语言的语法以及所谓的前端编译器,而且在开发完成之后,你依旧可以借助Java虚拟机来解释执行这门语言写就的程序,只不过要满足一个要求,要求就是源文件生成的字节码文件必须满足Java虚拟机规范。

说了这么多,我其实想说的是在源文件编译的过程当中,如果编译器的任何一个环节失败了,那么都是不能够正确生成字节码文件的。而且,Java虚拟机规范中也提到过了,就是Java虚拟机对字节码文件的要求是非常严格的,字节码文件必须要能被Java虚拟机准确识别,只有这样,Java虚拟机才能去解释运行字节码文件,否则Java虚拟机是免不了要遭受一些恶意程序的攻击的。

总之,只要任何一门编程语言的编译结果满足并包含Java虚拟机的内部指令集、符号表以及其他的辅助信息,那么它就是一个有效的字节码文件,就能够被虚拟机所识别并装载运行。说白了,字节码文件其实也具有跨语言的平台的这样一个特征。

Java源文件一旦经过编译过程生成字节码文件之后,就肯定要被加载到内存中去了,不用我说,相信大家都知道这一过程肯定是要涉及到类装载器子系统的。然后,经过字节码校验器之后,接着再翻译字节码并解释执行,或者使用JIT即时编译器进行编译紧接着再执行。实际上,在上一讲我给大家讲解执行引擎的内部结构时就已提到过这些了,不知道大家还有没有印象。

接下来,我想跟大家探讨一个问题,就是为什么执行引擎是Java虚拟机当中最重要的结构之一。

对于操作系统或者底层的硬件来说,它们其实是并不识别字节码指令的,而是只能够识别像0101···这样的机器指令。像现在咱们编程,肯定是再也不会通过纸带打孔这种方式来编写程序了,甚至汇编也很少写了,相信大家都知道目前市面上绝大部分程序或者应用都是使用高级语言来写就的。

说了这么多,大家不妨来看一下下面这张图。

可以看到高级语言也是需要翻译成汇编语言的,不难知道这其实就是一个编译过程。然后,汇编语言会被再翻译成机器指令,实际上,很多情况下,我们也可以将汇编语言跟机器指令混为一体。最后,机器指令再由具体的操作系统去执行。

而对应到Java虚拟机当中,相信大家也不难知道一点,就是高级语言翻译成机器指令这个过程,其实主要是由执行引擎来完成的,至此,大家该知道为什么执行引擎是Java虚拟机当中最重要的结构之一了吧!

最后,我还想给大家说一点,就是目前市面上比较主流的虚拟机都是采用解释执行和即时编译二者并存的这样一种方式来实现的。其中,解释器主要是用来保证响应时间的,具体一点说,就是解释器一上来就会针对字节码指令逐行进行解释执行;而JIT即时编译器则主要是来保证程序的执行性能的。

这里提到了JIT即时编译器主要是来保证程序的执行性能的,关于这点大家可能一时半会还想不明白,不过没关系,这里我会给大家解释清楚。

大家要知道,字节码文件中有一些代码是要被反复执行的,而这些要被反复执行的代码我们就会称之为热点代码,对于热点代码,它们是需要使用JIT即时编译器被再次编译成机器指令的,同时,这些机器指令还会被缓存到方法区当中,以方便下次可以直接调用。这里,大家一定要注意,就是这块一共出现了二次编译,第一次编译是把源文件给编译成了字节码文件,而第二次编译则是把字节码文件中的字节码指令编译成了机器指令。

以上我便稍微给大家讲解了一下Java代码的执行流程,对此,大家能看懂搞清楚就行。

以上是关于节:Java代码执行流程的主要内容,如果未能解决你的问题,请参考以下文章

节:Java代码执行流程

《快乐编程大本营》java语言训练班-第4课:java流程控制

《快乐编程大本营》java语言训练班-第4课:java流程控制

节:如何看待Java上层技术与JVM?

节:如何看待Java上层技术与JVM?

Python开发第4节Python分支结构与循环结构