2010-02-01 27 views
5

假設語言的解釋器(可以是從PHP到Ruby的任何東西)用C編寫。 變量(或更復雜的數據結構不僅包含名稱和值)是如何定義的,它由當前正在腳本執行,存儲和讀出?我對C的認識很差,最終會得出這樣的結論:只能用數組來完成。腳本語言如何設置/修改/讀出變量?

// Variable type definition would go here 
var* variables; 

var型將包含兩個字符串namevalue

好的。所以一個腳本定義了例如:30個變量。現在,如果必須讀出其中一個變量,函數getVar(或類似的東西)將不得不遍歷所有30個變量,並將它們的name與所請求變量的名稱進行比較。想象一下,請求一個循環

  • 我是否完全錯誤?如果是,那麼(現代?)腳本語言如何處理變量?他們如何存儲和讀出?

  • 在通過語法(PHP:$myVar)明確定義變量的語言中,解釋器可以在解析過程中用數值替換所有變量。 (我對嗎?) 這是這種情況嗎?

+0

@lamas - 祝你好運。有時你會想把你的頭髮拉出來......但是編譯器和解釋器很棒。 – 2010-02-02 00:02:10

回答

3

哈希表,範圍鏈表,引用 ...有很多吧。

你問的是半抽象的,實現是可變的。

取決於實現:

  1. 標識符可被編譯成存儲器地址,或相對存儲器地址,或者通過字節碼引用無名位置。
  2. 標識符可能在運行時

可以查找到的動態的範圍。在基本腳本語言,encoutered時將被放入一個範圍結構如包含哈希表中的連接表的變量名用於在該範圍內查找標識符的實現。

當引用變量時,運行時代碼在散列表中查找它並獲取與該值相關的某個值(例如結構的內存地址)。結構可以被用來實現變量:

enum stype = { INT, STRING, FLOAT, BOOL }; 
struct scalar { 
    enum stype type; 
    generic_blob_t *heap_blob; 
}; 

還是我的一些壞榜樣源的變化。

一些好書是「Modern Compiler Implementation in C」和Dragon Book。閱讀這個主題是一個好主意;我會推薦給任何程序員。

2

他們幾乎可以肯定地使用更復雜的數據結構。

struct Var 
{ 
    char *name; 
    int type; 
    union value; .... 
    }; 

,然後將它們存儲在一個樹(哈希或二進制),使他們可以通過名稱檢索

+1

哈希表(而不是樹)很可能,因爲以排序順序訪問變量不太可能需要。 – caf 2010-02-01 23:56:25

2

通常,腳本語言實現將使用相當複雜的C數據結構來表示腳本語言中的變量。對於其中C擴展明確的語言,文檔是現成的:

[SO編輯:隨意添加到更多的參考資料以上列表]

+0

+1破解用於綁定的C到類型交互的示例。我喜歡Python的方法。 – 2010-02-02 00:01:24