2

我在XNA中創建了一款遊戲,並且正在考慮創建自己的腳本語言(非常簡單)。我知道有更好的方法可以解決這個問題(而且我正在重新發明輪子),但是我希望學習體驗不僅要高效而且快速。瞭解運行時間代碼的解釋和執行

在運行時遇到代碼時,根據我的理解,通常的方法是解析機器代碼或字節代碼或其他實際可執行的代碼,然後執行該代碼,對吧?但是,例如,當Chrome第一次出現時,他們說他們的JavaScript引擎速度很快,因爲它將JavaScript編譯爲機器代碼。這意味着其他引擎不會編譯成機器代碼。

我寧願不編譯成較低的語言,所以有沒有已知的現代技術解析和執行代碼而不編譯到低級別?也許就像將代碼解析成某種樹,分支樹一樣,比較每個符號並調用一些處理該符號的函數? (在黑暗中猜測和刺穿)

+0

處理器只能理解機器語言...所以,如果你不被編譯成機器語言,別的東西將不得不這樣做,要不然也不會運行到我的知識。 – 2010-03-10 23:52:18

+0

@Tony怎麼做翻譯的工作呢? – Earlz 2010-03-11 00:00:59

+0

你說:「他們說,他們的JavaScript引擎是快的,因爲它編譯的JavaScript成機器代碼」 高德納說:「過早的優化是所有罪惡的根源。」 你似乎是優化你的腳本語言,你發明了它。 ;) – msw 2010-03-11 00:02:28

回答

2

我個人不會推出自己的解析器(將輸入轉換爲令牌)或詞法分析器(檢查語言語法的輸入令牌)。看看ANTLR解析/ lexing - 這是一個偉大的框架,並有完整的源代碼,如果你想深入瞭解它的膽量。

爲了執行你已解析的代碼,我會考慮運行一個簡單的虛擬機,或者更好地看看llvm這是一個開源(ish)嘗試標準化虛擬機字節碼格式並提供很好的功能如JITing(將您的腳本編譯成字節碼轉換爲彙編)。

我不會阻止你從機器的更高級的選項,如本機機器代碼執行,但要記住,這是一個非常專業的領域,並得到真正的複雜,真正快!

Earlz指出,我的答覆似乎暗示'你自己不要這麼做。重新閱讀我的文章聽起來有點這樣。我提到ANTLR和LLVM的原因是他們都有一堆源代碼和教程,所以我覺得這是一個很好的參考資源。以它爲基礎,發揮

+0

嗯,提到了「學習經驗」。另外,我寫在C#中的解釋,它實際上是相當容易的......(如,我受夠了,並像內2-3周編程的圖靈完備) – Earlz 2010-03-10 23:58:57

+0

@Earlz肯定,但兩者我提到有這些工具源代碼,如果你對這個領域感興趣的話,它們是很好的一般資源。不想阻止'滾動你自己',但總是很高興有一個基地來參考 – zebrabox 2010-03-11 00:04:37

+0

感謝您的鏈接。看到源代碼絕對應該感受一下如何解析和輕鬆完成 – Bob 2010-03-11 00:07:44

0

的Python作爲腳本語言非常棒。我建議你爲它的C API製作一個C#綁定並使用它。嵌入Python很容易。您的應用程序可以定義Python解釋器可以訪問的模塊內的函數,類型/類和變量。應用程序還可以在Python腳本中調用函數並返回結果。這兩個功能組合爲您提供了雙向通信方案。

基本上,您可以免費獲得Python語法和語義。你需要實現的是你的應用程序暴露給Python的API。一個例子可以是訪問遊戲邏輯功能和渲染功能。然後Python腳本會定義調用這些函數的函數,宿主應用程序將調用Python函數(帶參數)來完成工作。

編輯:看起來像IronPython可以爲您節省更多的工作。這是CPython的的C#實現,並有自己的嵌入API:http://www.ironpython.net/