2010-07-22 59 views
5

夥計們...女孩們,我正在研究一個項目,我認爲這個項目可以通過實施一個領域特定語言來定義一組規則和/或某些類型的工作流程條件。在Java上使用DSL的第一步?

我想牢牢把握主題,基礎知識,最佳實踐等,特別是如何用Java以某種方式實現它們。

你有什麼建議?

+2

嚴重的建議:使用Groovy,Scala或Clojure實現它。 – Mike 2010-07-22 04:14:39

+0

這完全取決於你想要DSL的複雜程度。 – NawaMan 2010-07-22 04:18:48

+0

+1,因爲這沒有使用Java。如果有的話,我會使用Ruby(或JRuby)。 – cletus 2010-07-22 04:23:30

回答

8

首先,我會建議由Kernighan和派克閱讀第9章的The Practice of Programming(符號)。

當你這樣做的時候,回到這裏,回答如何將這一章中的概念映射到你想解決的問題的特定設計的具體問題。

基本模式是編寫一個解釋器,該解釋器傳遞'command'參數,可能還有'environment'參數並執行該命令(在環境中)。然後,您可以選擇編寫一個解析器,該解析器需要一個「腳本」字符串並將其轉換爲有效的「命令」對象(即外部DSL)。或者您提供了一個庫來幫助用戶使用您正在使用的相同語言(內部DSL)顯式地創建「命令」對象。

Kernighan和派克做得很好,既能展現口譯員的瑣碎又複雜。如果你想更深入的話,那麼我建議閱讀丹尼爾弗裏德曼等人的The Essentials of Programming Languages。其中每章至少構建一個不同的解釋器,並演示如何實現諸如變量,函數,範圍,對象,類,靜態類型和延續等功能。

但是,我會建議先試一試微不足道的DSL,否則這些都只是理論 - 當你根據以前的經驗將它變得相關和實用時,一本書會更加有趣。

+0

如果我不清楚,我的建議是: 1.閱讀編程實踐的第9章。 2.嘗試實施簡單的DSL 3.遇到問題時詢問具體問題 4.當您開始希望在您的DSL中包含更「編程性」的功能時,請閱讀「編程語言基礎」,即。變量,函數,範圍等... – Recurse 2010-07-22 06:51:43

+0

有趣的是,我現在打開了那本書的第216頁,我想我會搜索'符號'和作者的名字,然後就出現了。我很高興看到這一章(我只拿到8美元這本書!) – Rob 2011-03-27 04:25:53

+0

哇,我一直在玩正則表達式和(對我來說)pg上有一個小錯誤。 225,我沒有看到他們的勘誤。如果你這樣做:調用grep應該是if(grep(argv [1],f,argc> 2?argv [i]:NULL)> 0)/ * NOT argc> 3 */ – Rob 2011-03-28 00:57:34

3

正如其他人所評論的,Java確實不是創建DSL的絕佳選擇。 Scala,Clojure,Groovy,Ruby/JRuby都是很好的選擇。但是,考慮到您正在考慮使用Java,我認爲Groovy或Scala看起來是最自然的選擇。這兩種語言的Java開發人員的學習曲線是相當漸進的。這裏有一些鏈接,將讓你開始:

+0

我會明確地看看斯卡拉和Groovy :) – 2010-07-22 14:48:10

0

一旦我使用openArchitectureware來定義和使用DSL。 oAW是一個eclipse插件,現在是eclipse建模框架的一部分,但它當然也可以在EMF之外使用。

我喜歡它,因爲它很容易定義一個DSL,並且oAW會自動生成一個帶有syntacx突出顯示和DSL錯誤檢查的編輯器。

它提供了一個模板引擎,如果您打算使用您的DSL中編寫的文檔來自動生成Java,XML或其他文件,那麼它非常舒服。

(我已經聯繫了老oAW的URL,因爲該網頁還提供了一些細節和所有鏈接到Eclipse項目頁)

0

只是一個除了@Recurse。我實際上做的正則表達式的例子在第9章,他指的是,它沒有工作,直到我在主函數中改變了一行:

  if (grep(argv[1], f, argc>3 ? argv[i] : NULL) > 0) 

真的應該是:

  if (grep(argv[1], f, argc>2 ? argv[i] : NULL) > 0) 

通知argc> 2。它在那之後爲我工作。是不是在書勘誤(鑑於它的年齡這並不令人驚訝)。

是的,這是一本書的密集但寶藏,所以我不得不說我同意@Recurse。老實說,這是一本爲學生設計的時間敏感書(我可能會在幾年前感到困惑)。