1. 程式人生 > >JAVA虛擬機器(五):Javac編譯原理

JAVA虛擬機器(五):Javac編譯原理

1、Javac編譯器的基本結構

Javac主要有4個模組:詞法分析、語法分析、語義分析、程式碼生成。

2、詞法分析

(1)功能:讀取原始檔的字元流,解析出符合Java語言規範的Token序列。

(2)關鍵類:

com.sun.tools.javac.parser.Scanner:讀取原始檔的字元流,解析出符合Java語言規範的Token序列。

com.sun.tools.javac.parser.Tokens$TokenKind:規定了Java語言所有的合法關鍵詞,如 Token.CLASS,Token.INT 等。

com.sun.tools.javac.util.Names:用來儲存和表示解析後的詞法。

(3)詞法分析解析出Token序列示例:

程式碼:

package compile;

public class Cifa {
  
}

解析後的Token序列:

3、語法分析

(1)功能:將Token序列構造成更加結構化的抽象語法樹。

(2)關鍵類:

com.sun.tools.javac.tree.TreeMaker:構建生成語法節點。

com.sun.tools.javac.tree.JCTree:抽象語法樹的每個節點都是JCTree的子類,並且每個語法節點都會實現一個類如 IfTree、MethodDeclTree 的介面。例如,JCMethodDecl 語法節點(即方法語法節點)繼承了 JCTree 並且實現了 MethodDeclTree 介面。

(3)語法分析構造出的抽象語法樹示例:

程式碼:

public class Yufa {
    int a;

    private int c = a + 1;

    public int getC() {
	return c;
    }
}

構成成的抽象語法樹:

4、語義分析

(1)功能:在語法分析生成抽象語法樹的基礎上再做一些處理。比如,給類新增預設建構函式,檢查變數在使用前是否已經初始化,檢查操作變數型別是否匹配,解除Java的語法糖,等等。

(2)關鍵類:

com.sun.tools.javac.comp.Enter:將在類中出現的符號輸入到類自身的符號表中;給類新增預設建構函式。

com.sun.tools.javac.processing.JavacProcessingEnvironment:處理annotation(註解)。

com.sun.tools.javac.comp.Attr(標註):檢查語義的合法性並進行邏輯判斷。例如:變數的型別是否匹配;變數在使用前是否已經初始化;推導泛型方法的引數型別;字串常量的合併,等等。

com.sun.tools.javac.comp.Flow:資料流分析和進一步語義分析。例如:檢查變數在使用前是否都已經被正確賦值;保證final修飾的變數不會被重複賦值;變數的自動轉換,如將 int 自動包裝成 Integer 型別;解除語法糖,如將 foreach 轉化成更簡單的 for 迴圈形式。

5、程式碼生成

(1)功能:遍歷語法樹,生成最終的Java位元組碼。

(2)關鍵類:

com.sun.tools.javac.jvm.Gen:遍歷語法樹,生成最終的Java位元組碼。

注:以上內容學習自《深入分析JavaWeb技術內幕》。