实现从代码变成字节码的过程
1.编译器编译过程:
(1).解析以及填充符号表
(2).插入式注解处理器的处理
(3).语义分析,解语法糖以及生成字节码
2.解析以及填充符号表
(1).解析 = 词法解析 + 语法解析
1).词法解析:将字符流变成标记集合。
==>字符流是程序编码的基本单位,标记是编译过程的基本单位
2).语法解析:将标记序列转化成抽象语法树
==>抽象语法树是语法结构的树的表现形式
==>语法解析之后,编译器不会再对源代码有操作,所有的操作都是基于抽象语法树
(2).填充符号表
1).符号表 = 一系列的符号地址 + 一系列的符号信息
2).符号表在后面的编译过程中会用到
==>在语义分析时,符号表用于语义检查和生成中间代码
==>在生成字节码时,当对符号名进行地址分配时,符号表是地址分配的依据
3.插入式注解处理器的处理
可以将插入式注解处理器认为是编译阶段的一个插件,通过这个插件可以对抽象语法树进行查询、增加、修改。
注:只要对抽象语法树进行了操作,就需要重新走一遍解析及填充符号表的过程
4.语义分析,解语法糖以及生成字节码
上述只是从语法层面保证代码正确,但是逻辑层面不能保证。下面操作一定程度上进行上下文有关性质审查。
(1).语义分析 = 标注检查 + 数据及控制流分析
1).标注检查
检查变量是否声明,变量和赋值的数据类型是否一致,常量折叠
2).数据及控制流分析
检查变量初始化,检查方法的每条路径是否有返回值,检查审查异常是否都被解决
(2).解语法糖
==>语法糖:对语义没有任何影响,但是有助于开发人员理解的一些写法
1).泛型==>类型擦除
2).自动装箱拆箱==>转化成对应的包装和还原方法
3).变长参数==>数组
4).循环遍历==>迭代器
5).条件判断==>没走的那一部分就被擦除了
(3).生成字节码
1).将前面的所有操作都落地成字节码保存到磁盘
2).进行一定程度的代码转换和添加
==>将语句块,变量初始化,创建父类构造器收敛到实例构造器和类构造器。保证先执行父类构造器,再执行初始化常量,再执行语句块