本次主要分享下关于,java的编译期优化方面的知识,其实是一个不确定的操作过程,因为“编译期间”又可以继续细分为
- “前期”(.java编译为*.class文件过程);
- “后期”:JIT编译器把字节码转变为机器码的过程;
“静态提前编译”:直接将java文件编译为本地代码过程。
jvm解析java文件时,主要进行了如下步骤:
词法:将源代码的字符流转变为标记(Token)集合,单个字符是程序编写过程中的最小元素,而标记则是编译过程的最小元素,关键字,变量名,字面量,运算符都可以称为标记。如:int a =b+2,这个代码中包含了6个标记,分别是int ,a,b,+,=,2
- 语法分析:是根据Token序列构造抽象语法树的过程,抽象语法树(abstract syntax tree)是一种用来描述程序代码语法结构的树形表示方式,语法树的每一个借点都代表着程序代码中的一个语法结构,例如,包,类型,修饰符,运算符,接口,返回值,代码注释等都是一个语法结构。
- 填充符号表:是有一组符号地址和符号信息构成的表格,该表中的信息在编译的不同阶段都要用到,如在语义分析中,会根据其内容做语意检查和产生中间代码,在目标代码生成阶段,当对符号名进行地址分配时,符号表是地址分配的依据。
- 注解处理器:JDK1.6,提供了标准的API,可以在编译期间对注解进行处理,有了标准API后,可以干涉编译器的行为,可以通过插入式注解完成只能在程序代码中完成的事情。
- 语义分析:对结构上正确的源程序进行上下文,有关性质检查,如类型审查,如果审查失败则编译失败。
- 字节码生成:是javac编译过程的最后一个阶段,字节码生成阶段不仅仅是对前面各个步骤所生成的信息转化成字节码写到磁盘里,编译器还进行了少量代码添加和转换工作。如:实例构造器方法和类构造器方法就是在这个阶段添加进去的(注意:如果代码中没有添加任何构造函数,则编译器会添加一个没有参数,访问性与当前类一致的默认构造函数,但如果类中已经有含有参数的构造器方法,则编译器不会自动增加无参数构造器,需要用户自己编写)