1、编译分类:
1)前端编译器:将java文件编译成.calss文件;
2)JIT 编译器:将字节码转换成机器码(java团队将优化主要集中在这个过程中,兼容性好,屏蔽不同语言区别);
3) AOT 编译器:将java文件直接转换成机器码文件的过程;
2、javac 源码调试
3、编译的三个过程
(1)解析与填充符号表的过程;
1)词法、语法分析
词法分析: 将字符流转换成标记(token)集合;字符是程序编写的最小元素,集合是编译过程中的最小元素(关键字、变量名、字面量、运算符等);
语法分析:生成抽象语法树;每一个树节点代表一个程序代码中的一个语法结构(包、类型、修饰符、运算符、接口、返回值、注释等);
此过程之后,编译器的操作都建立在这个语法树上;
2)填充符号表:
enterTrees ()方法中实现 符号地址和符号信息构成;
(2)插入式注解处理器处理过程
(3)分析与字节码生成;
1)标注检查
检查变量是否已被声明、变量与赋值之间类型是否匹配等;
特例:常量折叠( int a = 1+2 与 int a =3 执行效率等效)
2)数据及控制流检查
检查局部变量使用前是否赋值、方法的每条路径是否都有返回值,是否所有的受查异常都被处理等;编译时期的数据及控制流分析与类加载控制流分析目的基本一致;
3)解语法糖
语法糖也成为糖衣语法;java 相对于其他语言(C#)是低糖语言;
java 中最常用的语法糖是泛型,变长参数、自动拆装箱、for-each等;而虚拟机是不支持这些语法,所以在编译阶段这些代码被还原成简单的基础语法结构;
4)字节码生成
由com.sun.tools.javac.jvm.Gen 类完成,字节码生成阶段不仅仅是把前面各个步骤所生成的信息(语法树、符号表)转化成字节码写到磁盘中;
4、泛型:
(1)泛型与类型擦除
(2)自动装箱、自动拆箱、遍历
(3)条件编译
5、插入式注解处理器
参考:周志明《深入理解 java 虚拟机》