详解Javac将java⽂件编译为class⽂件的过程
Java编译器总的来说分为前端编译器,JIT(just in time compiler)编译器,AOT(Ahead Of Time Compiler)编译器三种。
gnu编译器前端编译器: 将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把所有的编译器优化⼯作都放到了后端及时编译器中。
Sun Javac编译器
Sun javac编译器编译过程分为三个步骤,解析填充符号表,插⼊式注解处理器的注解处理过程,分析与字节码⽣产过程
**Javac编译器的⼊⼝是ls.javac.main.JavaCompiler类,主要逻辑集中在compile和compile2⽅法中
1. 解析填充符号表
词法分析:将源代码的字符流转变为标记(Token)集合 ls.javac.parser.Scanner类进⾏词法分析
语法分析:⽤标记序列构造抽象语法树(AST,Abstract Syntax Tree)。Eclipse AST View插件可以⽤来查看抽象语法树
2. 注解处理器
Java1.5之后提供了对注解(Annotations)的⽀持,注解处理器可以理解为抽象语法树的⼀组插件,这些插件可以对抽象语法树直接进⾏读取,修改,添加操作。
如果在解析注解期间,对语法树进⾏了修改,那么编译器回到解析及填充符号表的过程重新处理,直到所有的插⼊式注解处理器没有对语法树进⾏修改为⽌。
JavacCompiler 类中initProcessAnnotations()⽅法对注解处理器进⾏初始化,JavacProcessingEnvironment类的
doProcessing()⽅法⽣成新的JavacCompiler对编译的后续过程进⾏处理。
3. 语义分析与字节码⽣成
语法分析之后编译器得到程序的抽象语法树表⽰,语法树表⽰⼀个结构正确的源程序抽象,但⽆法保证源程序是符合逻辑的,语义分析就是对结构正确的源程序上下⽂进⾏审查。
语法分析与字节码⽣成总共分为,标注检查,数据及控制流分析,解语法糖,字节码⽣成四个过程。
标注检查,和数据及控制流分析主要是对程序上下⽂环境进⾏分析检查。
解语法糖:在Java中常⽤到的解语法糖就是泛型,在Java虚拟机是不⽀持泛型的。只是通过语法糖进⾏语法扩展。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论