我正在設計自己的實驗性腳本語言,以便將其嵌入到我的更大的應用程序中。以解釋型語言存儲變量的數據結構
幾乎所有我想做的事情都是順利編程的,但在內存中存儲變量的「簡單」行爲似乎是最難的部分。我不知道如何存儲它們以允許所有類型檢查,全局變量和特殊標誌。首先看一個示例代碼:
a = 1
b = 2
someFunction()
print(a) --> This should read the global variable and print `1`
a = 3 --> Now `a` should become a local variable of this function
and the global `a` remain unchanged
x = 4 --> `x` should always be local of this function
end
我稱之爲變量他們level
的「局部性」因此,在嵌套塊中的變量有一個較高的水平。在上面的代碼中,a
和b
是1級變量。 someFunction的局部變量將具有級別2.函數的第一行應該讀取全局變量a
(級別1),但第二行應該創建一個變量,再次調用a
,但是級別2會從該點開始向全局變化a
。第三行應創建級別爲2的變量x
。如何在內存中存儲和跟蹤所有這些內容?
我試過到目前爲止:
方法1:存儲variable=>value
地圖中的水平排列:
variables
{
level=1 //global variables
{
a => 1,
b => 2
},
level=2 //function variables
{
a => 3,
x => 4
}
}
但是,這將使變量的查找速度很慢,因爲一個有搜索給定變量的所有級別。
方法2:存儲(變量,電平)對作爲映射的鍵:
variables
{
(a, 1) => 1, //global
(b, 1) => 2, //global
(a, 2) => 3, //function
(x, 2) => 3 //function
}
這如之前因爲我們必須嘗試對(變量,電平)與所有可能有同樣的問題給定變量的級別。
我應該使用什麼方法來優化內存使用和最快的訪問時間?
其他注意事項:
我知道變量是如何在棧和堆其他「真正的」語言管理,但我覺得很棘手做到這一點的一種解釋型語言。 「這一定不是Lua和Python如何做到的,」我一直認爲。如我錯了請糾正我。我試圖將變量存儲在地圖和內部C++結構中。
最後,這是我如何表示一個變量。你認爲它很大,可以有更多的高效內存表示? (我也嘗試把「級」作爲一個成員在這裏,但它也有同樣的問題,因爲其他的。)
struct Member
{
uchar type; //0=num, 1=str, 2=function, 3=array, etc
uchar flags; //0x80 = read-only, 0x40 = write-only, etc
union {
long double value_num;
char* value_str;
int value_func;
//etc
};
};
我會使用一個映射將每個變量名映射到一個變量實例堆棧當您在一個級別上創建一個新變量時,變量在堆棧上,堆棧中最頂層的元素用這個名字保存當前可見的變量實例,你還必須爲每個級別維護一個分配變量的列表,以便在離開該級別時從堆棧中彈出變量。感覺,我從來沒有自己設計過一種語言 – Nobody 2012-02-20 11:15:56
你可以簡單地使用一堆數組和de Bruijn索引的某種形式,執行一個原始的「compi通過解析所有名字來解釋。 – 2012-02-20 15:21:57