1

我用JavaScript編寫了一個使用jison的小語言解釋器,它是野牛的JS端口。該語言用於評估表達式和條件。現在評估與解析混合在一起。哪個更快,更乾淨,生成AST並迭代或生成代碼?

我想優化它,瓶頸是詞法分析器和解析器。所以我決定先解析它,然後只在運行時進行評估。

的問題是,哪一個是更快或更清潔,之前生成的JS代碼,只運行或產生AST和迭代它在運行時?

+0

'eval' =調用編譯器=昂貴。 –

+0

看起來你基本上想知道編譯或解釋代碼是否更快。編譯後的代碼幾乎總是會更快,但它可能會導致比解釋更令人頭疼的問題。 – Bubbles

+0

@JanDvorak一件事是,這一切都發生在一個nodejs上,所以我有足夠的啓動時間。我之前調用'eval'來解析它,然後在運行時運行結果函數。 –

回答

1

通常情況下,生成任何最接近機器代碼的東西總是更快。在你的情況下生成JavaScript會更快。

生成的JavaScript代碼將由底層的C/C++解釋直接執行(並且在編譯JIT成機器代碼某些情況下)。相比之下,在javascript中編寫自己的VM來執行AST將運行在額外的VM層上 - javascript。

*注:有一些角落情況下,翻譯有時可以執行快本地代碼。作爲一個例子,因爲它的解釋器很簡單 - 它只是一個函數指針表。

+0

如果你的編譯時間很長,即使編譯的方式很簡單,解釋器也可以更快。權衡很簡單:「編譯時+執行時間(編譯程序)」與「解釋時間」。如果您有能力構建編譯器,請選擇在您的情況下經常獲勝的那個。 –

+1

@IraBaxter:編譯時間只發生一次。所以即使時間更長,這也是一場勝利。此外,無論是否解釋,它都是在這種情況下編譯的(OP提到他正在編譯爲AST)。最難的部分是獲得AST。從AST生成指令是微不足道的(事實上,速度足夠快,通常可以直接解釋AST而不生成任何可執行的輸出)。 – slebetman