程序编译与代码优化
Posted codingjav
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序编译与代码优化相关的知识,希望对你有一定的参考价值。
一早期(编译期)优化
1概述
Java语言的“编译期”是一段“不确定”的操作过程,因为它可能是指一个前端编译器(其实叫“编译器的前端”更准确一些)把*.java文件转变成*.class文件的过程;也可能是指虚拟机的后端运行期编译器(JIT编译器,just in time compiler)把字节码转变成机器码的过程;还可能是指使用静态提前编译器(AOT编译器,ahead of time compiler)直接把*.java文件编译成本地机器代码的过程。下面列举了这三类编译过程中一些比较有代表性的编译器: Ø 前端编译器:sun的javac、eclipse JDT中的增量式编译器(ECJ)。
Ø JIT编译器:HotSpot VM 的C1、C2编译器。
Ø AOT编译器:GNU Compiler for the java、Excelsior JET。
这三类过程中最符合大家对java程序编译认知的应该是第一类,在后面的讲解里,提到的“编译期”和“编译器”都仅限于第一类编译过程。限制了编译范围后,对于“优化”二字的定义就需要宽松一些,因为javac这类编译器对代码的运行效率几乎没有任何优化措施(在JDK1.3之后,javac的-O优化参数就不再有意义了)。虚拟机设计团队把对性能的优化集中到了后端的即时编译器中,这样可以让那些不是由javac产生的class文件也同样能享受到编译器优化带来的好处。
但是javac做了许多针对编码过程的优化措施来改善程序员的编码风格和提高编码效率。相当多新生的java语法特性,都是靠编译器的“语法糖”来实现,而不是依赖虚拟机的底层改进来支持,可以说,java中即时编译器在运行期的优化过程对于程序运行来说更重要,而前端编译器在编译期的优化过程对于程序编码来说关系更加密切。
2.javac 编译器
分析源码是了解一项技术实现内幕的最有效的手段,javac编译器不像HotSpot虚拟机那样使用c++语言(包含少量C语言)实现,它本身就是一个由java语言编写的程序,这为纯java的程序员了解它的编译过程带来了很大的便利。
2.1 javac 的源码与调试
虚拟机规范严格定义了Class文件的格式,但是对如何把java源码文件转变为class文件的编译过程未作任何定义,所以这部分内容是与具体JDK实现相关的。从sun javac的代码来看,编译过程大致可以分为三个过程,分别是:
- 解析与填充符号表过程;
- 插入式注解处理器的注解处理过程;
- 分析与字节码生成过程。
Javac编译动作的入口是com.sun.tools.javac.main.JavaCompiler类,上述三个过程的代码逻辑集中在这个类的compile()和compile2()方法里。整个编译最关键的处理是由8个方法来完成的,分别是:
1. initProcessAnnotations(processors);//准备过程:初始化插入式注解处理器
2. delegateCompiler =
3. processAnootations( //过程2:执行注解处理
4. enterTrees(stopIfError(CompileState.PARSE, //过程1.2:输入到符号表
5. parseFiles(sourceFileObject))), //过程1.1:词法分析、语法分析
6. classnames);
7.
8. delegateCompiler.compile2(); //过程3:分析及字节码生成
9. case BY_TODO:
10. while(! todo.isEmpty())
11. generate(desugar(flow(attribute(todo.remove()))));
12. break;
13. //generate,过程3.4:生成字节码
14. //desugar,过程3.3解语法糖
15. //flow,过程3.2:数据流分析
16. //attribute,过程3.1:标注
以上是关于程序编译与代码优化的主要内容,如果未能解决你的问题,请参考以下文章