sun javac编译过程 JavaCompiler类
1.解析与填充符号表过程
2.插入式注解处理器的注解处理过程
3.分析与字节码生成过程
* .java————-解析与填充符号表 —–>注解处理——->语义分析与字节码生成——>class
| 循环 |
—--—————————————————–
解析与填充符号表
1.词法语法分析
词法分析:把源代码的字符流变成标记(Taken)如: int i = b+2; int、a、b、+、2 javac.parser.Scanner类
语法分析:根据Taken序列构造抽象语法树(AST abstract synax tree)语法树每一个节点都代表程序代码的一个语法结构
例如包括:包、类型、修饰符、运算符、接口、返回值、代码注释 JCTree
2. 填充符号表
符号表:符号地址+符号信息 K-V 实现不一定是哈希表,也可以是有序符号表、树状符号表、栈结构符号表
在编译的不同阶段都要用到 语义分析中用于语义检查和产生中间代码
目标代码生成阶段 对符号名进行地址分配时,符号表是地址分配依据
填充符号表:com.sunsun.tools.javac.comp.Enter 此过程出口是一个 待处理列表,包含了 每一个编译单元的抽象语法树的顶级节点,以及package-info.java(若存在)的节点
注解处理器
可以看做一组编译器插件,在这些插件里面可以读取修改添加抽象语法树中任意元素,若在出理期间对语法树进行了修改,编译器将回到解析与填充符号表 过程重新处理,直到没有新的注解处理器对语法树进行修改为止!一个循环称为一个Round
语义分析及字节码生成
语义分析任务是对结构正确的语法树源程序进行上下文有关性质的审查 如类型审查 即int boolean相加等
1.标注检查
检查变量使用前是否已经被声明、变量与赋值之间数据类型是否匹配等
2.数据及控制流分析
对程序上下文逻辑更进一步验证,可检查如局部变量使用前是否赋值、方法的每一条路径是否有返回值,是否所以的受查异常都被正常处理
3.解语法糖
增加程序可读性,从而减少程序代码出错的机会。
4.字节码生成
实例构造器,类构造器在这个阶段添加到语法树中,生成Class文件
Java语法糖
1.泛型与类型擦除
影响重载,拒绝编译, sun jdk1.6 返回值不同可以编译通过重载成功
2.自动装箱、拆箱与遍历循环
Integer a =1;
Integer b = 2;
Integer c =3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
System.out.println(c==d); true
System.out.println(e==f); false
System.out.println(c==(a+b)); true
System.out.println(c.equals(a+b)); true
System.out.println(g ==(a+b)); true
System.out.println(g.equals(a+b)); false
== 不遇到算术运算符不会自动拆箱,equals不处理数据类型转型
3.条件编译
java进行条件编译 方法是 条件为常量的if语句