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語句