java前端编译和后端编译理解

导读

将源代码翻译为目标代码的过程,称为编译过程。

在这里再次把JDK、JRE、JVM三者是什么解释一下:

JDK是java开发工具包,包括: bin、db、include、jre、ilb文件。其中:

bin是JDK的编译器(javac.exe);db是自带的数据库;Include是java和JVM交互的的头文件;Jre是java运行的环境,jre文件里面的bin文件可以看成jvm,lib文件则是jvm工作时所需要的的类库,jvm和lib一起称为jre.

1.前端编译

        java前端编译是指:通过javac编译器(JDK的bin文件)把*.java文件转换为*.class文件的过程 。

优点:

许多Java语法新特性("语法糖":泛型、内部类等等),是靠前端编译器实现的,而不是依赖虚拟机;

编译成的Class文件可以直接给JVM解释器解释执行,省去编译时间,加快启动速度;

缺点:

对代码运行效率几乎没有任何优化措施;

解释执行效率较低,所以需要结合下面的JIT编译;    

前端编译器:Oracle javac、Eclipse JDT中的增量式编译器(ECJ)等;

前端编译过程如下图:

2.后端编译

         后端编译也称为及时编译(just-in-time compiler), 通过Java虚拟机(JVM)内置的即时编译器(Just In Time Compiler,JIT编译器),在运行时(文件加载内存中运行)把Class文件字节码编译成本地机器码的过程;            

2.1 为什么需要后端编译(及时编译)呢?

        Java程序最初都是通过解释器进行执行,解释一句,执行一句,效率很低。当发现某个方法或者代码块被运行得非常频繁,即多次执行字节码需要重复翻译为本地代码时,我们可以这些代码就被认为是热点代码,为了提高这些热点代码得运行效率,虚拟机会把热点代码编译成本地机器码,并进行优化,当再次需要执行只写代码时,直接调用就行了,而不需要再次编译或者解释了。所以出现了及时编译。

2.2 怎么样才被认为是热点代码呢?

        JVM中会设置一个阈值,当方法或者代码块的在一定时间内的调用次数超过这个阈值时就会被编译,存入codeCache中。当下次执行时,再遇到这段代码,就会从codeCache中读取机器码,直接执行,以此来提升程序运行的性能。整体的执行过程大致如下图所示:

后端编译描述如下图: 

参考文章链接地址:

Java | 聊一聊编译过程(编译前端 & 编译后端) - 知乎

                                  基本功 | Java即时编译器原理解析及实践 - 美团技术团队

猜你喜欢

转载自blog.csdn.net/qq_35207086/article/details/123758442