2013-09-30 22 views
3

我正在創建一個編譯爲字節碼並在定製虛擬機上運行的小型語言,該虛擬機的體系結構很大程度上受到我所閱讀的內容的影響Python和Lua。有兩個堆棧 - 一個存儲函數參數,本地變量和臨時值的數據堆棧和一個包含每個活動函數調用一個入口的幀堆棧。幀堆棧中的每個條目都包含諸如當前函數,指令指針(當前函數的字節碼數組索引)和基指針(指向數據堆棧的索引 - 標記函數的參數/本地開始位置)等信息。以字節碼編譯語言實現REPL/eval

在哪裏我已經變得沒有實現REPL,或者更具體地說,執行eval()。到目前爲止,這個想法一直是在同一個堆棧框架內不斷評估用戶輸入 - 但我看不到一個乾淨的方法來允許在eval()內部創建新的局部變量。因爲臨時數據總是在堆棧上的本地人之上(堆棧向上增長),所以我能想到的唯一方法是注意到由eval()創建了新的本地數據,然後使用一些hackery重新排列堆棧 - 但這在一般情況下會產生問題。例如,如果有條件使用的遞歸函數eval()我需要走幀幀,並可能調整每個幀的數據棧。

我的VM能支持eval()的合理實現嗎?如果是的話,上述方法是否合理?如果不是,需要進行哪些架構更改?

回答