首先,必須明確Java語言規範和Java虛擬機規範不是一回事。
數據結構
Java語言規範描述了Java語言有哪些詞法和語法,而Java虛擬機也有Java虛擬機規範,它們都有本身的詞法和語法解析規則,並且解析規則也是不一樣的。
spa
那麼如何才能讓Java的語言規則適應Java虛擬機的語法規則呢?
翻譯
這個任務就由Javac編譯器來完成的,它的任務就是將Java語言規範轉化爲Java虛擬機語言規範,完成」翻譯「工做。
編譯器
Javac是一種編譯器,可以將一種語言規範轉化成另一種語言規範虛擬機
Javac的任務就是將Java源代碼語言先轉化爲JVM可以識別的一種語言(Java字節碼),這種字節碼不是針對某種機器、某種平臺的for循環
如何消除不一樣種類、不一樣平臺機器之間的差異,這個任務就由JVM完成,VM將JVM語言(Java字節碼)轉換成當前機器可以識別的機器語言。編譯
首先是讀取源代碼,找出這些字節中哪些是咱們定義的語法關鍵詞,如Java中的if、else、for等關鍵詞。foreach
詞法分析的結果:從源代碼中找出一些規範化的Token流。循環
這一步就是檢查關鍵詞組合在一塊兒是否是符合Java語言規範,如if的後面是否是緊跟着一個布爾判斷表達式。語法
語法分析的結果:造成一個符合Java語言規範的抽象語法樹
這一步的主要工做就是把一些難懂的、複雜的語法轉化爲更加簡單的語法。
語義分析的結果:完成複雜的語法轉化成簡單的語法,對應到Java中,如將foreach語句轉化成for循環結構,還有註解等。最後造成一個註解事後的抽象語法樹,這棵語法樹更接近目標語言的語法規則。
經過字節碼生成器生成字節碼,根據通過註解的抽象語法樹生成字節碼,也就是將一個數據結構轉化爲另一個數據結構。
代碼生成器的結果:生成符合Java虛擬機規範的字節碼。
按照上述編譯步驟來,能夠將Javac編譯器分爲4個模塊:詞法分析器、語法分析器、語義分析器和代碼生成器。