java 語(yǔ)言的編譯期有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è)過(guò)程破停。
【1】 解析與填充符號(hào)表翅楼。包含 a 詞法、語(yǔ)法分析? b 填充符號(hào)表?
a? ?將 源碼的字符流裝變?yōu)?token(標(biāo)記) 集合真慢,單個(gè)字符是編寫的最小元素毅臊,而標(biāo)記則是編譯過(guò)程的最小元素,比如 關(guān)鍵字黑界、變量名管嬉、字面量、運(yùn)算符都是標(biāo)記朗鸠,比如 int a= b+c 有 6個(gè)標(biāo)記? 分別是? int 蚯撩、 a、 = 烛占、b胎挎、 + 、c。從而生成了 語(yǔ)法樹犹菇。
b 由一組符號(hào)地址和符號(hào)信息構(gòu)成的hash結(jié)構(gòu)德迹。用于 語(yǔ)義檢查和產(chǎn)生中間代碼。
【2】 注解處理器项栏。
一個(gè)插件浦辨,可以修改蹬竖、讀取沼沈、添加抽象數(shù)的任意結(jié)構(gòu)。
【3】語(yǔ)義分析和 字節(jié)碼生成币厕。
以上之后生成的抽象語(yǔ)法數(shù)列另,可以保證是源程序的抽象,但是無(wú)法保證是否符合邏輯旦装。語(yǔ)義分析來(lái)保證其符合邏輯页衙。
【標(biāo)注檢查】:檢查包括,變量是否被聲明阴绢,變量的類型是否滿足賦值運(yùn)算店乐。
【數(shù)據(jù)及控制流分析】對(duì)邏輯下文進(jìn)一步驗(yàn)證。檢查包括:方法是否有返回值呻袭,所有異常是否都被處理眨八。
生成 字節(jié)碼。
java? 語(yǔ)法糖
泛型
java 里的泛型 是一個(gè)偽泛型左电,它不像c#的泛型一樣廉侧,在編譯的時(shí)候生成不同的編碼。比如篓足,List<String> 和 List<Integer>,在 c# 里 編譯后生成的是兩個(gè)對(duì)象段誊,而在java 里生成的都是 List。用了 擦除法栈拖,將參數(shù)列表省去了连舍。
自動(dòng)裝箱 和 拆箱 遍歷循環(huán)
條件編譯