### Javac 源码与调试 编译过程 1. 准备过程 初始化插入式注解处理器 2. 解析与填充符号表过程 1. 词法、语法分析,将源代码的字符流转变为标记集合,构造出抽象语法树 2. 填充符号表,产生符号地址和符号信息 3. 插入式注解处理器的注解处理过程:插入式注解处理器的执行阶段 4. 分析与字节码生成过程 - 标注检查,对语法的静态信息进行检查 - 数据流及控制流分析,对程序动态运行过程进行检查 - 解语法糖,将简化代码编写的语法糖还原为原有的形式 - 字节码生成,将前面各个步骤所生成的信息转化为字节码 ### 解析与填充符号表 1. 词法、语法分析 词法分析将源代码的字符流转变为标记 (Token)的过程,单个字符是程序编写时的最小元素,但标记才是编译时的最小元素 关键字,变量名,字面量,运算符都可以作为标记 语法分析根据标记序列构造抽象语法树的过程,抽象语法树是易总用来描述程序代码语法结构的树形表示方式,抽象语法树中的每一个节点都代表着程序代码中的一个语法结构 包,类型,修饰符,运算符,接口,返回值甚至代码注释都可以是一种特定的语法结构 2. 填充符号表 符号表时由一组符号地址和符号信息构成的数据结构,符号表中锁登记的信息在编译的不同阶段都要被用到 3. 注解处理器 插入式注解器是一组编译器的插件,当这些插件工作时,允许读取、修改、添加抽象语法树中的任意元素 语法树中的任意元素都可以在插件中被访问到,通过插入式注解处理器实现许多原本只能由人工编码完成的事,例如 Lombok 4. 语义分析与字节码生成 语义分析的作用是对结构上正确的源程序进行上下文相关性质的检查,进行类型检查、控制流检查、数据流检查等 1. 标注检查 检查变量使用前是否已经声明、变量与赋值之间的数据类型是否能够匹配等,进行一个常量折叠的代码优化(a = 1 + 2) 2. 数据及控制流分析 对程序上下文逻辑更进一步的验证,可以检查出诸如程序局部变量在使用前是否赋值、分发的每条路径是否都有返回值、是否所有的受查异常都被正确处理了 3. 解[[语法糖]] 4. 字节码生成 把前面各个步骤所生成的信息转为字节码指令写到磁盘中,进行了少量的代码添加和转换工作