Javac编译过程

Posted

tags:

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

 

Java语言的“编译期”其实是一段“不确定”的操作过程,因为它可能是指一个前端编译器(其实叫“编译器的前端”更准确一些)把*.java文件转变成*.class文件的过程;也可能是指虚拟机的后端运行期编译器(JIT编译器,Just In Time Compiler )把字节码转变成机器码的过程 ;还可能是指使用静态提前编译器(AOT编译器,Ahead Of Time Compiler ) 直接把*.java 文件编译成本地机器代码的过程。下面列举了这3类编译过程中一些比较有代表性的编译器。

 

  • 前端编译器:Sun的Javac、 Eclipse JDT中的增量式编译器( ECJ ) 。
  • JIT编译器:HotSpotVM的C1、C2编译器。
  • AOT编译器: GNU Compiler for the Java ( GCJ ) 、 Excelsior JET。

 

这3类过程中最符合大家对Java程序编译认知的应该是第一类,在本章的后续文字里, 笔者提到的“编译期”和“编译器”都仅限于第一类编译过程,把第二类编译过程留到下一章中讨论。限制了编译范围后,我们对于“优化”二字的定义就需要宽松一些,因为Javac这类编译器对代码的运行效率几乎没有任何优化措施(在JDK 1.3之 后 ,Javac的-O 优化参数就不再有意 义 )。虚拟机设计团队把对性能的优化集中到了后端的即时编译器中,这样可以让那些不是由Javac产生的Class文件 (如JRuby、Groovy等语言的Class文件 )也同样能享受到编译器优化所带来的好处。但是Javac做了许多针对Java语言编码过程的优化措施来改善程序员的编码风格和提高编码效率。相当多新生的Java语法特性,都是靠编译器的“语法糖”来实现,而不是依赖虚拟机的底层改进来支持,可以说,Java中即时编译器在运行期的优化过程对于程序运行来说更重要,而前端编译器在编译期的优化过程对于程序编码来说关系更加密切。

从Sun Javac的代码来看,编译过程大致可以分为3个过程,分别是:

  • 解析与填充符号表的过程。
  • 插入式注解处理器的注解处理过程。
  • 分析与字节码生成过程。

这3个步骤之间的关系与交互顺序如图所示。

技术分享

http://blog.csdn.net/coslay/article/details/49601603

以上是关于Javac编译过程的主要内容,如果未能解决你的问题,请参考以下文章

66.javac 编译与 JIT 编译编译过程javac 编译词法语法分析填充符号表语义分析字节码生成JIT 编译

Javac编译过程

Javac编译过程

Javac早期(编译期)

Javac 编译器

早期(编译器)优化--javac编译器