緒論
在定義DSL是什麼的問題上,Flowler認為目前經常使用的一些特徵,例如“關注於領域”、“有限的表現”和“語言本質”是非常模糊的。因此,唯一能夠確定DSL邊界的方法是考慮“一門語言的一種特定用法”和“該語言的設計者或使用者的意圖”:
如果XSLT的設計者將其設計為XML的轉換工具,那么我認為XSLT是一個DSL。如果一個用戶使用DSL的目的是該DSL所要達到的目的,那么它一個DSL,但是如果有人以通用的方式來使用一個DSL,那么它(在這種用法下)就不再是一個DSL了。
以Fowler的觀點,DSL首先是一種幫助用戶從一個系統中抽象出某些部分的工具。所以“當你意識到你需要一個組件,或者當你已經有了一個組件而你希望簡化操作它的方式的時候”,DSL是有用的。使用DSL確實提供了某些益處。DSL不僅提高了代碼的易讀性,讓開發者可以和領域專家更好的交流,而且是改變執行上下文的一種手段,例如:把邏輯從編譯時切換到運行時,或者當命令式編程不是很合適的時候轉用聲明式計算模型。
定義
領域特定語言(英語:domain-specific language、DSL)指的是專注於某個應用程式領域的計算機語言。又譯作 領域專用語言。不同於普通的跨領域通用計算機語言(GPL),領域特定語言只用在某些特定的領域。 比如用來顯示網頁的HTML,以及Emacs所使用的Emac LISP語言。
分類
外部DSL:不同於套用系統主要使用語言的語言,通常採用自定義語法,宿主套用的代碼採用文本解析技術對外部DSL編寫的腳本進行解析。例子如:正則表達式、SQL、AWK以及Struts的配置檔案等
內部DSL:通用語言的特定語法,用內部DSL寫成的腳本是一段合法的程式,但是它具有特定的風格,而且僅僅用到了語言的一部分特性,用於處理整個系統一個小方面的問題;
語言工作檯:一種專用的IDE,用於定義和構建DSL,具體的講,語言工作檯不僅用來確定DSL的語言結構,而且是人們編寫DSL腳本的編輯環境,最終的腳本將編輯環境和語言本身緊密的結合在一起。
優點
1、提高開發效率,通過DSL來抽象構建模型,抽取公共的代碼,減少重複的勞動;
2、和領域專家溝通,領域專家可以通過DSL來構建系統的功能;
3、執行環境的改變,可以彌補宿主語言的局限性。
處理步驟
1、DSL腳本;
2、解析腳本;
3、語義模型;
4、生成代碼或者執行模型。
基於groovy的DSL
1、不需要class檔案,可以直接執行腳本;
2、閉包等特性以及語法的簡介,使用非常靈活;
3、可以和java系統無縫的整合;
4、Groovy自身不是 DSL。 Groovy官方已經發布了較多基於 Groovy書寫的 DSL,比如 GANT, GORM, XMLBuilder, HtmlBuilder等等。
代表語言
SQL,Gradle。