2011-03-02 15 views
3

有沒有什麼好的理由用數字識別記號,現在?我正在關注Crafting a Compiler爲什麼使用整數作爲標記?

作者提出的代碼是在這裏:

public class Token { 
    public final static int ID = 0, FLTDCL = 1, INTDCL = 2, PRINT = 3, 
      ASSIGN = 4, PLUS = 5, MINUS = 6, EOF = 7, INUM = 8, FNUM = 9; 

    public final static String[] token2str = new String[] { "id", "fltdcl", 
      "intdcl", "print", "assign", "plus", "minus", "$", "inum", "fnum" }; 

    public final int type; 
    public final String val; 

    public Token(int type) { 
     this(type, ""); 
    } 

    public Token(int type, String val) { 
     this.type = type; 
     this.val = val; 
    } 

    public String toString() { 
     return "Token type\t" + token2str[type] + "\tval\t" + val; 
    } 
} 

,而不是使用醜陋的陣列,豈不是更聰明修改構造函數以接受type變量,而不是整數,字符串?那麼我們可以擺脫

public final static int ID = 0, FLTDCL = 1, INTDCL = 2, PRINT = 3, 
      ASSIGN = 4, PLUS = 5, MINUS = 6, EOF = 7, INUM = 8, FNUM = 9; 

或者它是否需要以後使用字符串反而會更糟?

+1

我認爲這只是速度 - 編譯器真的需要他們可以得到的速度,並使用字符串傷害緩存位置。但也可能有另一個(更好的)理由,我不知道(因此爲什麼我沒有發佈這個答案)。 – Mehrdad

+0

隱蔽標識符是夠糟糕的,但至少他可以鍵入的字符串版本出來... – delnan

回答

2

有幾個好處:

  • 它的速度更快,因爲比較兩個整數需要(在一般的編譯語言)只有幾個指令,而比較字符串需要O(ñ)時間,其中ñ是更大的令牌的長度。 Compilers need this extra bit of speed
  • 在C,C++和Java,你可以switchint但不是一個字符串。
  • 錯誤輸入令牌的名稱將是一個編譯時錯誤,而不是一個難以調試運行時錯誤。
+0

其實,我建議定義了一堆常量每當一個字符串,原來是一個小的,固定的,有限集的成員。它更快*和*更安全。 –

+1

當然,'enum'會是最好的選擇。 – Mehrdad

+0

「錯誤輸入令牌的名稱將是一個編譯時錯誤,而不是一個難以調試運行時錯誤。」我懷疑它是一個很難調試運行時錯誤。你可以爲每個標記創建一個子類,因此仍然有編譯時錯誤。 –

相關問題