第10章 前端編譯與優化
10.1 概述
1>前端編譯器:Javac命令。 【.java文件->.class文件】
2>即時編譯器:Hotspot.C1.C2 【.class文件->機器碼】
3>提前編譯器:JDK的Jaotc等【.java->機器碼】
10.2 Javac 編譯器
10.2.1 Javac的源碼與調試
1>初始化插入式注解處理器
2>解析與填充符號表過程
3>插入式注解處理器,注解處理過程
4>分析與字節碼生成
10.2.2 解析與填充符號表
1>詞法分析、語法分析
詞法:字符流=>標記
語法:標記=>抽象語法樹
2>填充符號表
登記信息
10.2.3 注解處理器
lombook通過注解處理器影響了編譯器的結果,在字節碼中生成了代碼
10.2.4 語義分析與字節碼生成
1>標注檢查
檢查變量使用前是否已聲明、數據類型匹配等
2>數據及控制流分析
局部變量賦值、方法路徑等檢查
3>解語法糖
方便于程序員開發的語法,如:泛型、自動裝箱等都由在編譯期還原為原始基礎語法結構
10.3 Java語法糖的味道
10.3.1 泛型
1>Java與C#的泛型
Java:擦除式,字節碼中會替換為裸類型,不可進行類型判斷、創建對象及數組
c#:具現化式
2>泛型的歷史背景
Java向后二進制兼容:JDK1.2的字節碼能運行在1.2之后的全部JVM上
3>類型擦除
缺陷:
1.強制類型轉換
2.無法使用原生類型作為泛型,不斷裝、開箱
3.無法獲得泛型類型
List< String>與List< Integer>對于JVM來說是相同的
4>值類型與未來的泛型
略
10.3.2 自動裝箱、拆箱、與遍歷循環
略
10.3.3 條件編譯
條件編譯只能在if(常量)下成立,會自動消除無法達到的語句。
10.4 實戰:插入式注解處理器
10.4.1 實戰目標
略
10.4.2 代碼實現
可以通過AbstractProcessor相關API,對抽象語法樹進行修改,以重新生成詞、語法并生成字節碼