Jvm编译与程序优化
关于编译
编译的过程
.java - 解析&填充符号表 - 注解处理 - 分析字节码生成 - .class
- 解析与填充符号表
1.词法、语法分析
敌法分析师将源码中的字符流转变为标记(Token)集合,单个字符是程序编写的最小元素
int a = b + 2 -> 6个标记语法分析是根据Token序列构造抽象语法树的过程
2.填充符号表
符号表是由一组符号地址与符号信息构成的表格,类似k-v对,符号表中等级的信息在编译不同阶段都要用到,作用是语义检查和产生中间代码 -
注解处理器 通过注解处理器,允许我们通过代码干涉编译器的行为
- 语义分析与字节码生成
int a = 1; boolean b = false; char c = 2; int d = a + c; 只有这个能通过编译 int d = b + c; char d = a + c;1.标注检查
语法分析分为标注检查 & 数据控制流分析
标注检查主要是检查变量是否被声明,赋值数据类型是否能匹配,还有常量折叠int a = 1 + 2;常量折叠后,将会被折叠为字面量3; a = 1 + 2 与 a = 3在运行期并没有增加cpu指令的运算量2.数据控制流分析
对程序上下文逻辑进一步验证,检查变量使用前是否赋值、每条路径是否有返回至、是否异常都被正常处理等public void foo(final int arg){ final int var = 0 } 与 public void foo(int arg){ int var = 0 } 编译后在class内两个是一致的,在编译阶段就已经做了赋值检查,对运行期没有影响3.解语法糖
4.字节码生成
将前面各步骤的信息转化为字节码写到磁盘,还有少量代码添加和转换(例如()和 ())
完成对语法树遍历和调整后,最终会输出Class文件,结束编译
