详解Javac将java文件编译为class文件的过程
来源:互联网 发布:青岛网络优化推广公司 编辑:程序博客网 时间:2024/04/28 05:14
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把所有的编译器优化工作都放到了后端及时编译器中。
Sun Javac编译器
Sun javac编译器编译过程分为三个步骤,解析填充符号表,插入式注解处理器的注解处理过程,分析与字节码生产过程
**Javac编译器的入口是com.sun.tools.javac.main.JavaCompiler类,主要逻辑集中在compile和compile2方法中
- 解析填充符号表
词法分析:将源代码的字符流转变为标记(Token)集合 com.sun.tools.javac.parser.Scanner类进行词法分析
语法分析:用标记序列构造抽象语法树(AST,Abstract Syntax Tree)。Eclipse AST View插件可以用来查看抽象语法树 - 注解处理器
Java1.5之后提供了对注解(Annotations)的支持,注解处理器可以理解为抽象语法树的一组插件,这些插件可以对抽象语法树直接进行读取,修改,添加操作。
如果在解析注解期间,对语法树进行了修改,那么编译器回到解析及填充符号表的过程重新处理,直到所有的插入式注解处理器没有对语法树进行修改为止。
JavacCompiler 类中initProcessAnnotations()方法对注解处理器进行初始化,JavacProcessingEnvironment类的doProcessing()方法生成新的JavacCompiler对编译的后续过程进行处理。 - 语义分析与字节码生成
语法分析之后编译器得到程序的抽象语法树表示,语法树表示一个结构正确的源程序抽象,但无法保证源程序是符合逻辑的,语义分析就是对结构正确的源程序上下文进行审查。
语法分析与字节码生成总共分为,标注检查,数据及控制流分析,解语法糖,字节码生成四个过程。
标注检查,和数据及控制流分析主要是对程序上下文环境进行分析检查。
解语法糖:在Java中常用到的解语法糖就是泛型,在Java虚拟机是不支持泛型的。只是通过语法糖进行语法扩展。
0 7
- 详解Javac将java文件编译为class文件的过程
- 详解Javac将java文件编译为class文件的过程
- javac编译java文件
- java编译为class文件
- javac编译带有package的java文件
- Tomcat将JSP转换为Servlet.java和编译.class文件的所在位置
- javac编译后的.class文件都是unicode
- 单个java文件编译为.class文件的方法
- 用javac编译.java文件
- javac编译带包名的文件
- javac 和 java 定位.class文件总结
- javac命令编译java文件成class文件出现中文乱码问题解决
- 关于命令行中javac 编译成功,用 java 运行 class 文件出现 “ 找不到或无法加载主类 ” 的问题
- javac编译成功,用java运行class文件出现“找不到或无法加载主类” 的问题解决起来很简单
- javac编译成功,用java运行class文件出现“找不到或无法加载主类” 的问题解决起来很简单
- javac编译成功,用java运行class文件出现“找不到或无法加载主类” 的问题
- javac编译成功,用java运行class文件出现“找不到或无法加载主类” 的问题
- cmd javah 找不到类文件 javac 编译java文件 找不到符号(把class文件生成.h文件)
- WebView的详细介绍
- android-----JNI中的log打印
- Swap Nodes in Pairs
- IP网络存储iSCSI之一iSCS的概念、组成及工作原理
- Hadoop 2.0源码阅读环境配置--win7+Eclipse+Hadoop2.2.0
- 详解Javac将java文件编译为class文件的过程
- 人见人爱A-B hdu acm 2034 c++
- hdu4956 Poor Hanamichi
- 计算几何
- 把一个整数的低四位全部置为1,其他位不变
- 诺基亚通信(原诺西)web开发人员招聘
- 一个清华学生留学香港后对人生的思考
- ImageView的android:scaleType属性详解!
- LeetCode-3Sum Closest