2015-10-23 19 views
0

我正在寫一個js-to-js解釋器(也就是說,一個JavaScript程序需要一個Javascript程序作爲參數並執行它)。我沒有受過編譯理論的訓練,我只是在僞造它。表達式評估機器正在工作(使用一種笨重的算子優先算法),但尚未用於函數。所以這是我的問題。JavaScript解釋器實現(功能)策略 - 我有道理嗎?

我想要實現函數的方式看起來像這樣:當函數被調用時,我將爲它創建一個名稱空間/上下文,並允許訪問函數名稱空間和全局名稱空間。

我還沒有實現閉包,但是這些命名空間是爲它們設計的。基本上,據我所知,閉包只是Javascript拒絕忘記函數的上下文,因爲它沒有忘記持有該函數的變量。

所以,當函數被調用時,我會傳入它的上下文對象一個調用它的語句的副本,以及一個指向觸發函數調用的表達式的指針。該語句中已經評估過的每個表達式都會記住它的值。當我們從函數返回時,該語句成爲當前語句,然後我開始再次執行它 - 但我不重新評估已經評估過的表達式,包括剛剛完成的函數。因此,我隨着聲明的其餘部分愉快地前進,潛在地調用更多函數等。

每個語句,表達式和函數都有一個在解析過程中構建的抽象表示。在執行過程中,只有當前語句有任何實際存在的,除了從抽象表示,因爲真的所有我需要在任何給定時間要記住的是:

  • 變量在目前情況下在封閉環境中
  • 變量(也就是說,最近的一個函數的調用 - 包括全球範圍內 - 包圍當前功能)
  • 當前語句
  • 什麼語句是未來
  • 我的裏面有什麼塊(只是讓我知道當我點擊時該怎麼做之一)
  • 調用堆棧,它是一堆包含變量的上下文和觸發調用的語句及其表達式。
  • 一個指向要從函數/上下文返回值更新的特定表達式的指針。

那麼我有道理嗎?謝謝你的幫助!

+0

爲什麼你這樣做,而不是簡單地使用eval()? –

+0

因爲我想實現一個用戶友好的調試器。我沒有解釋整個項目,但我需要對接口進行非常精細的控制,如果我有eval()爲我完成所有繁重工作,我將不會得到它。感謝你的協助。 – NessBird

回答

1

你所描述的基本上是口譯員的工作,是的,但我仍然強烈建議重新考慮你的方法。在你做任何比添加數字更復雜的事情時,在Javascript中解釋Javascript會非常緩慢地運行。有沒有理由不能將調試器與實際執行分開?如果這是不可能的,我真的建議在插件中做你的解釋器或者讓你的速度更低的東西。或者考慮這樣的模式:https://developers.google.com/blockly/installation/js-interpreter?hl=en

+0

謝謝。我最終可能會增加在eval()和調試器中運行代碼的能力,所以它可以在不中斷時快速運行。無論如何,要在調試器中運行,我需要讓JS環境運行整個JS環境,因爲我需要能夠以細粒度的方式處理表達式和變量。 eval()的線束將非常複雜。 – NessBird

相關問題