详解Javac将java文件编译为class文件的过程

Java编译器总的来讲分为前端编译器,JIT(just in time compiler)编译器,AOT(Ahead Of Time Compiler)编译器三种。 前端

  • 前端编译器: 将Java文件编译为class文件的编译器,目前主要有如下两个,Sun提供的Javac 和Eclipse JDT中的增量式编译器(ECJ)

  • JIT编译器: 虚拟机后端运行期编译器,把字节码转换为机器码的过程。HotSpot Vm中提供的C1, C2编译器

  • AOT编译器:直接把Java文件转换为本地机器码的过程。 GNU Compiler for the java(GCJ), Excelsior JET


 * 在Java 3 之后为了使其余不经过Javac编译的其余在java虚拟机上执行的语言能够享受到编译器优化所带来的好处因此,java把全部的编译器优化工做都放到了后端及时编译器中。 java


Sun Javac编译器 后端

 Sun javac编译器编译过程分为三个步骤,解析填充符号表,插入式注解处理器的注解处理过程,分析与字节码生产过程 优化

   **Javac编译器的入口是com.sun.tools.javac.main.JavaCompiler类,主要逻辑集中在compile和compile2方法中 spa

      

  1.  解析填充符号表
    词法分析:将源代码的字符流转变为标记(Token)集合   com.sun.tools.javac.parser.Scanner类进行词法分析
    语法分析:用标记序列构造抽象语法树(AST,Abstract Syntax Tree)。Eclipse  AST View插件能够用来查看抽象语法树 

  2. 注解处理器
    Java1.5以后提供了对注解(Annotations)的支持,注解处理器能够理解为抽象语法树的一组插件,这些插件能够对抽象语法树直接进行读取,修改,添加操做。
    若是在解析注解期间,对语法树进行了修改,那么编译器回到解析及填充符号表的过程从新处理,直到全部的插入式注解处理器没有对语法树进行修改成止。
    JavacCompiler 类中initProcessAnnotations()方法对注解处理器进行初始化,JavacProcessingEnvironment类的doProcessing()方法生成新的JavacCompiler对编译的后续过程进行处理。

  3. 语义分析与字节码生成
    语法分析以后编译器获得程序的抽象语法树表示,语法树表示一个结构正确的源程序抽象,但没法保证源程序是符合逻辑的,语义分析就是对结构正确的源程序上下文进行审查。
    语法分析与字节码生成总共分为,标注检查,数据及控制流分析,解语法糖,字节码生成四个过程。
    标注检查,和数据及控制流分析主要是对程序上下文环境进行分析检查。 解语法糖:在Java中经常使用到的解语法糖就是泛型,在Java虚拟机是不支持泛型的。只是经过语法糖进行语法扩展。
相关文章
相关标签/搜索