三类编译器:
- 前端编译器,将JAVA编译成CLASS文件,JAVAC,ECJ
- JIT编译器,把字节码转换成机器码的过程,HOTSPOT VM的C1,C2编译器
- AOT编译器,静态提前编译器,直接将JAVA编译成本地机器码的过程
Annotation,可以看作是一组编译器的插件,这些插件可以读取,修改,添加抽象语法树的任意元素,如果这些插件对语法树进行了修改,那么编译器将回到解析及填充符号表的过程重新处理,知道所有的annotation都没有再对语法树的修改位置,每次循环成为一个round.
常量折叠:int a= 1+2; -> int a=3;
JAVA语法糖
主要包括泛型,变长参数,自动装箱等
泛型,在JAVA中,只在程序源码中存在,编译后泛型将被替换成原生类型(在相应位置插入强制转型代码)。
在JAVA泛型中,两种情况值得注意,
public static void method(List<String> list)
public static void method(List<Integer> list)
这两个方法是不能并存的
但如果返回值不一样,就可以通过编译了,因为CLASS文件格式中,方法描述符包括返回值
自动装箱,是通过valueOf实现的
遍历循环是通过Iterator实现的
JAVA编译时,如果碰到常量作为判断条件,则会自动执行为真时的语句,而省去为假时的语句