Javac是一種編譯器,編譯器簡(jiǎn)單來(lái)說(shuō)就是個(gè)翻譯器,將一種語(yǔ)言翻譯成另外一種語(yǔ)言,往往是將高級(jí)的語(yǔ)言翻譯成對(duì)機(jī)器友好的底層語(yǔ)言。但是不同機(jī)器之間有差別,為了實(shí)現(xiàn)在各機(jī)器能識(shí)別語(yǔ)言,這個(gè)工作交個(gè)JVM來(lái)完成。而Javac得任務(wù)就是將Java源碼轉(zhuǎn)化為JVM能識(shí)別得語(yǔ)言。
Java源碼(.java)->Javac->Java字節(jié)碼(.class 二進(jìn)制)->JVM->當(dāng)前機(jī)器能識(shí)別得機(jī)器語(yǔ)言
Javac的過(guò)程
1.源碼
2.Token流(詞法分析)
3.語(yǔ)法樹(shù)(語(yǔ)法分析)
4.注解語(yǔ)法樹(shù)(語(yǔ)義分析)
5.字節(jié)碼(代碼生成)
詞法分析:
Javac的接口類是com.sun.tools.javac.parser.Lexer 默認(rèn)實(shí)現(xiàn)類為 xxxxx.Scanner
Scanner會(huì)逐個(gè)讀取Java源文件的單個(gè)字符,然后解析出符合Java語(yǔ)言規(guī)范的Token序列
語(yǔ)法分析:
將token流更加結(jié)構(gòu)化成為一個(gè)語(yǔ)法樹(shù)
語(yǔ)義分析
對(duì)語(yǔ)法樹(shù)進(jìn)一步細(xì)化,去掉無(wú)用代碼,變量自動(dòng)轉(zhuǎn)化,代碼檢查,去除語(yǔ)法糖等
代碼生成
遍歷語(yǔ)法樹(shù),生成最終的字節(jié)碼