前言
深入理解java虚拟机
java是编译运行的,因此,在运行之前,会进行编译操作。在java中,有三种类型,如下:
- 前期编译器:将.java编译成.class,常见的如javac
- JIT编译器(just in time compiler):将.class字节码转化为机器码,如hotspot的C1,C2
- AOT编译器(Ahead Of Time Compiler):将.java文件直接转化为机器码的过程
javac的编译过程
javac的编译过程分为下面三个步骤:
- 解析与填充符号表的过程
- 插入式注解处理器的注解处理过程
- 分析与字节码生成过程
解析与填充符号表的过程
解析过程包括词法分析与语法分析两个过程。
- 词法分析 词法分析是将源代码的字符流转化为标记(Token)集合,标记是编译过程中的最小元素、关键字、变量名、字面量、运算符等都可以成为标记
- 语法分析 是根据token生成抽象语法树的过程
注解处理器
这个过程就是处理我们编译时注解的过程。
语义分析与字节码生成
- 语义分析
- 标注检查,检查的内容包括变量使用前是否已被申明、变量与赋值过程的类型是否匹配等,在这个过程中,会进行一个重要的操作,叫做常量折叠,如 int A = 1 + 2,编译成 int A = 3
- 数据及控制流分析,对程序上下文逻辑更进一步的验证,检查程序局部变量在使用前是否有赋值、方法的每条路径是否有返回值等等问题。
- 解语法糖,包括自动拆箱、装箱等
- 字节码生成 将前面各个步骤生成的信息,写入到磁盘中。
Java中语法糖
- 泛型与类型擦除,讲ArrayList
,ArrayList 擦除程同一种类型 - 自动装箱、拆箱与遍历循环
- 条件编译 如果发现只会为true,或者false,只会编译对应分支。
参考资料
来自经典好书 深入理解java虚拟机。建议入手一本,