java 語言的編譯期有3 種
【1】 將.java 編譯成 .class 也成為? 編譯器的前端 ,比如就javac?
【2】 將 字節(jié)碼轉(zhuǎn)換成 機(jī)器碼。 編譯器的后端。比如jit。 (just in? time compiler)
【3】靜態(tài)提前編譯器。 直接把.java 轉(zhuǎn)化為 機(jī)器碼。aot(ahead? of? time compiler)
javac 編譯器
3 個(gè)過程。

【1】 解析與填充符號(hào)表。包含 a 詞法、語法分析? b 填充符號(hào)表?
a? ?將 源碼的字符流裝變?yōu)?token(標(biāo)記) 集合,單個(gè)字符是編寫的最小元素,而標(biāo)記則是編譯過程的最小元素,比如 關(guān)鍵字、變量名、字面量、運(yùn)算符都是標(biāo)記,比如 int a= b+c 有 6個(gè)標(biāo)記? 分別是? int 、 a、 = 、b、 + 、c。從而生成了 語法樹。

b 由一組符號(hào)地址和符號(hào)信息構(gòu)成的hash結(jié)構(gòu)。用于 語義檢查和產(chǎn)生中間代碼。
【2】 注解處理器。
一個(gè)插件,可以修改、讀取、添加抽象數(shù)的任意結(jié)構(gòu)。
【3】語義分析和 字節(jié)碼生成。
以上之后生成的抽象語法數(shù),可以保證是源程序的抽象,但是無法保證是否符合邏輯。語義分析來保證其符合邏輯。
【標(biāo)注檢查】:檢查包括,變量是否被聲明,變量的類型是否滿足賦值運(yùn)算。
【數(shù)據(jù)及控制流分析】對(duì)邏輯下文進(jìn)一步驗(yàn)證。檢查包括:方法是否有返回值,所有異常是否都被處理。
生成 字節(jié)碼。
java? 語法糖
泛型
java 里的泛型 是一個(gè)偽泛型,它不像c#的泛型一樣,在編譯的時(shí)候生成不同的編碼。比如,List<String> 和 List<Integer>,在 c# 里 編譯后生成的是兩個(gè)對(duì)象,而在java 里生成的都是 List。用了 擦除法,將參數(shù)列表省去了。
自動(dòng)裝箱 和 拆箱 遍歷循環(huán)
條件編譯