4
在ast-walking解釋器中,代碼是逐節點執行的。我如何實現goto,break或continue等功能?我停止當前執行並跳轉到另一個節點?有沒有最佳做法?在ast-walking解釋器中執行跳轉語句
在ast-walking解釋器中,代碼是逐節點執行的。我如何實現goto,break或continue等功能?我停止當前執行並跳轉到另一個節點?有沒有最佳做法?在ast-walking解釋器中執行跳轉語句
最佳做法是「不要爲帶有gotos的語言解釋AST」。
從根本上說,如果語言主要處理標量,那麼樹行走中的任何一種不連續都會造成嚴重的減速。 (如果您的語言主要處理複雜的值,如數組語言APL,則無關緊要)。
您可以希望得到的最好結果是預先行走樹並確定gotos實際在AST中的位置,並將其記錄到關聯緩存中。然後當你遇到goto時,只需查詢緩存而不是搜索樹。
但是,這是編譯之路的第一步,例如,在執行之前預先計算可執行的內容。
謝謝。什麼是解釋語言的最佳方式?我已經寫過構建AST的解析器。 – dcast
一個更好的方法恕我直言是走你的AST,生成所謂的線程代碼,並執行它。線程代碼是一個由操作碼組成的虛擬指令集,它實際上是指向操作碼執行例程的指針。解釋器在彙編中實現爲「通過模擬PC獲取下一個線程代碼操作碼;增加模擬PC;通過指針間接跳轉」。這段代碼被附加到每個操作碼執行例程的* end *。這樣的解釋器很容易生成代碼,並且在執行方面對於解釋器來說非常快速。 –
謝謝:)。有沒有關於生成線程代碼的教程或指南?我認爲解釋這些說明並不困難([link](http://www.complang.tuwien.ac.at/forth/threaded-code.html#switch-threading))。但起初我必須定義自己的虛擬指令集? – dcast