一、概述
编译期:1)前端编译器:*.java文件转变为*.class文件
2)后端运行期编译器(JIT):字节码转变为机器码
3)静态提前编译器(AOT):*.java文件编译成本地机器代码
二、 javac编译器
编译过程的3个过程:1)解析与填充符号表过程(词法语法分析;输入到符号表)
2)插入式注解处理器的注解处理过程(注解处理器)
3)分析与字节码生成(标注;数据流分析;解语法糖;生成字节码)
- 词法语法分析
词法分析:将源代码的字符流转变为标记集合
语法分析:根据token序列构造抽象语法树
- 填充符号表
符号表由一组符号和符号信息构成的表格;所登记的内容将用于语义检查和产生中间代码。在目标代码生成阶段,当对符号名进行地址分配时,符号表是地址分配的依据
- 注解处理器
在运行期间发挥作用,可对语法树进行修改
- 语义分析与字节码生成
语义分析的任务是对结构上正确的源程序进行上下文有关性质的审查
----1)标注检查
检查内容:变量使用前是否已被声明,变量与赋值之间的数据类型是否能够匹配,常量折叠等
----2.)数据及控制流分析
检查内容:变量赋值,方法返回值,异常处理等
----3). 解语法糖
虚拟机运行时不支持泛型,变长参数,自动装箱/拆箱等语法,他们在编译阶段还原回简单的基础语法结构
----4)字节码生成
将前面步骤所生成的信息(语法树符号表)转化为字节码写到磁盘中