Java虛擬機規範和Java規範是不一樣的,他們都有自己的詞法和語法解析規則。所以javac要將Java語言規範解析成Java虛擬機的語法規範,Javac作爲‘翻譯‘’。
Javac是什麼?
機器能夠識別和運行的都是機器碼,但人去寫機器碼的話太困難,太不友好、所以人們通過編譯器將高級語言轉換成目標機器碼。
javac編輯器就是將Java語言編譯成jvm所能識別的語言,最後jvm將jvm語言轉換成當前機器能夠識別的語言。
這種轉換雖然比其他語言多了一層步驟,犧牲了一些執行步驟,但是卻擁有了平臺無關性。
在Java編譯原理中,將會了解到Javac的語法樹結構、Javac的工作流程(包括詞法分析、語法分析、符號表構建、annotation處理、標註和語法檢查、數據流分析、類型轉換、語法等)、java如何實現內部類、如何實行對異常的處理、javac與其他編譯器的對比。
Javac將java語言轉換到jvm語言需要經過以下幾個步驟:
1、詞法分析
2、語法分析
3、語義分析
4、代碼生成
要讀取源代碼,就需要一個單詞一個單詞地讀取,從中找出規範的token流,就像人類語言一樣,要能識別出哪些是標點符號,哪些是動詞,哪些是名次。
語法分析檢查單詞之前的組合是否符合Java規範,比如if後面是否接了布爾判斷表達式,就像人類語言中主謂賓的組合是不是能夠理解的。
語法分析形成一個符合Java語言規範的抽象語法樹,抽象語法樹是一個結構化的語法表達形式,它的作用是把語法的主要詞法用一個結構化的形式來組織起來。
語義分析將複雜的語法解析成簡單的語法,比如將foreach轉爲for,註解轉爲代碼。
最後,通過字節碼生成器生成字節碼,將會根據經過註解的抽象語法樹生成字節碼,也就是將一個數據結構轉爲另一個數據結構。