早期(编译期)优化
10.1概述
Java语言的“编译期”是一段“不确定”的操作过程,因为它可能是
1)指一个前端编译器(其实叫“编译器的前端”更准确一些)把*.java文件转变成*.class文件的过程;如Sun的Javac、Eclipse JDT中的增量式编译器(ECJ)
2)也可能是指虚拟机的后端运行期编译器(JIT编译器,Just In Time Compiler)把字节码转变成机器码的过程;如HotSpot VM的C1、C2编译器
3)还可能是指使用静态提前编译器(AOT编译器,Ahead OfTime Compiler)直接把*.java文件编译成本地机器代码的过程,如GNU Compiler for the Java(GCJ)[插图]、Excelsior JET。
Javac做了许多针对编码过程的优化措施来改善程序员的编码风格和提高编码效率。相当多新生的Java语法特性,都是靠编译器的“语法糖”来实现,而不是依赖虚拟机的底层改进来支持,可以说,Java中即时编译器在运行期的优化过程对于程序运行来说更重要,而前端编译器在编译期的优化过程对于程序编码来说关系更加密切。
虚拟机设计团队把对性能的优化集中到了后端的即时编译器中,对不是Javac产生的class文件带来好处。
10.2 Javac编译器
HotSpot虚拟机那样使用C++实现;javac使用java实现
10.2.1 Javac的源码与调试
JDK_SRC_HOME/langtools/src/share/classes/com/sun/tools/javac,除了JDK自身的API外,就只引用了JDK_SRC_HOME/langtools/src/share/classes/com/sun/*里面的代码;
创建类,导入源文件(若出现Access Restriction,在java build path -libraries-access rules edit-add Accessible),运行com.sun.tools.javac.Main的main()。
编译过程大致可以分为三个过程,分别是:
□ 解析与填充符号表过程。
□ 插入式注解处理器的注解处理过程。
□ 分析与字节码生成过程。
入口是com.sun.tools.javac.main.JavaCompiler类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0oXQRBf7-1578645081964)(C:\Users\zhangli\Desktop\张丽\tu\javac编译过程主体代码.png)]
10.2.2 解析与填充符号表