2012-12-20 70 views

回答

4

最佳做法是「不要爲帶有gotos的語言解釋AST」。

從根本上說,如果語言主要處理標量,那麼樹行走中的任何一種不連續都會造成嚴重的減速。 (如果您的語言主要處理複雜的值,如數組語言APL,則無關緊要)。

您可以希望得到的最好結果是預先行走樹並確定gotos實際在AST中的位置,並將其記錄到關聯緩存中。然後當你遇到goto時,只需查詢緩存而不是搜索樹。

但是,這是編譯之路的第一步,例如,在執行之前預先計算可執行的內容。

+0

謝謝。什麼是解釋語言的最佳方式?我已經寫過構建AST的解析器。 – dcast

+3

一個更好的方法恕我直言是走你的AST,生成所謂的線程代碼,並執行它。線程代碼是一個由操作碼組成的虛擬指令集,它實際上是指向操作碼執行例程的指針。解釋器在彙編中實現爲「通過模擬PC獲取下一個線程代碼操作碼;增加模擬PC;通過指針間接跳轉」。這段代碼被附加到每個操作碼執行例程的* end *。這樣的解釋器很容易生成代碼,並且在執行方面對於解釋器來說非常快速。 –

+0

謝謝:)。有沒有關於生成線程代碼的教程或指南?我認爲解釋這些說明並不困難([link](http://www.complang.tuwien.ac.at/forth/threaded-code.html#switch-threading))。但起初我必須定義自己的虛擬指令集? – dcast