2008-11-25 56 views
4

這經常出現:您的應用程序已經足夠廣泛,現在是時候在其中添加一些可編程性以使其具有靈活性。一個例子可能是財務應用程序 - 您想要添加公式編輯器,以便您可以創建自己的自定義公式,而無需重新編譯代碼。創建一個DSL與嵌入現有語言

您必須做出選擇:您是否創建了自己的標記器,解析器和解釋器/編譯器鏈,這可能需要很長時間並且可能會不正確地完成?或者你是否剛剛嵌入了另一種腳本語言,它存在的問題是它可能會膨脹你的代碼並使你的應用程序暴露於安全漏洞。

您將如何平衡權衡並作出此決定?

回答

3

沒有任何交易 - 嵌入了一個經過全面測試,有據可查的解釋器。否則,你最終會像MAXScript一樣受到憎惡。

+0

如果我嵌入類似Python或Perl的東西,我必須經歷很多以確保它們不能執行任意代碼,對嗎? – Claudiu 2008-11-25 18:17:23

0

我會使用現有的解析器生成器(如ANTLR或Haskell/Scala的解析器組合器)創建自己的解釋器。它並不像所有那樣辛苦,對於簡單的語言來說,它確實非常簡單。我在一個下午創建了一個非常簡單的DSL實現,並且它第一次完美運行(沒有錯誤)。

就是說,你不想要設計自己的圖靈完整語言。如果您的需求非常複雜,那麼您應該嵌入一種腳本語言。如果你在JVM上,JRuby和Clojure是這類事情的最佳人選,尤其是考慮到他們在內部DSL領域的優勢。

2

插件系統如何?有幾個優點:

  • 允許客戶開發人員在開發源應用程序的環境中開發。
  • 在現代的開發。平臺,你通過軟件合同獲得了很多控制和安全。
  • 如果設計正確,那麼您可以適當地將引起膨脹和失敗的原因歸咎於造成它的插件 - 就像Chrome在其他第三方插件崩潰時那樣。
  • 易於通過許可/證書添加額外的安全性。
  • 如果令人驚歎,並且希望所有客戶都擁有該插件,可輕鬆將插件與應用程序合併。
1

除非DSL足夠簡單,解析器/解釋器適合單個頁面,否則我會建議嵌入現有的腳本語言。

我最近花了好幾個月的時間研究一個我繼承的項目,其中包含一個完全本土化的腳本語言。我花了很多時間理解解析器&解釋器,以便我可以修復錯誤,使其線程安全,擴展,優化。此外,還有時間來學習和理解這種新的腳本語言的詭異,這種語言與我已經知道的其他語言幾乎一樣但不完全相同。 我寧願用這段時間來嵌入像Ruby或Lua這樣的現有語言,並調整它以適應我們的需求。

用戶本來可以從一門更容易編程的語言中受益,但卻沒有什麼怪癖和困難。我會從深入理解精心設計的流行語言的內部而獲益,而不是在'myScript'中獲得相對不值得的專業知識。