javac編譯原理(一)

  咱們都知道,計算機只能識別二進制語言,是不能直接識別java c c++等高級語言的。將高級語言轉化成計算機能夠是別的二進制語言,這個過程就叫編譯。java

  有次面試,面試官問了一道「java的編譯原理是什麼」,當時給懵了,只知道是把java文件轉換成class文件,而後由jvm執行,具體流程就不知道了。今天看了許令波編著的《深刻分析java web技術內幕》一書,其中有一章講的就是javac的編譯原理,看了一遍,感受有點雲裏霧裏,不是很明白,接下還得多看看幾遍,多上網查查資料深刻透徹的學習一下。c++

  今天先將javac編譯的總體流程總結一下,而後再仔細分析學習各個流程的細節。web

  編譯器是將源碼編譯成目標機器碼,即計算機能夠識別的二級制碼,也即cpu執行的指令集合。而javac編譯器和c c++ 彙編語言等不太同樣的地方,是javac是將java這種高級語言編譯成java虛擬機(Jvm)可以識別的一種語言,而後再由jvm將jvm語言轉換當前機器可以識別的機器語言,這就是java能夠跨平臺的最根本緣由。javac的任務是將java源碼編譯成java字節碼,也是一般說的將.java文件轉化成.class文件。面試

  javac編譯的基本流程:jvm

  一、詞法分析學習

    讀取源代碼,一個字節一個字節的讀取,找出其中咱們定義好的關鍵字(如java中的if  else  for等關鍵字,識別哪些if是合法的關鍵字,哪些不是),這就是詞法分析器進行詞法分析的過程,其結果是從源代碼中找出規範化的Token流。編譯器

  二、語法分析源碼

    經過語法分析器對詞法分析後Token流進行語法分析,這一步檢查這些關鍵字組合再一次是否符合java語言規範(如在if後面是否是緊跟着一個布爾判斷表達式),詞法分析的結果是造成一個符合java語言規範的抽象語法樹。虛擬機

  三、語義分析for循環

    經過語義分析器進行語義分析。語音分析主要是將一些難懂的、複雜的語法轉化成更加簡單的語法,結果造成最簡單的語法(如將foreach轉換成for循環 ,註解等),最後造成一個註解事後的抽象語法樹,這個語法樹更爲接近目標語言的語法規則。

  四、生成字節碼

    經過字節碼生產器將通過註解的抽象語法樹轉化成符合jvm規範的字節碼。

 

javac的主要模塊有4個,分別是詞法分析器、語法分析器、語義分析器、代碼生成器。

相關文章
相關標籤/搜索