領域特定語言
2008 年 5 月 15 日
領域特定語言 (DSL) 的基本概念是一種電腦語言,針對特定類型的問題,而非針對任何類型的軟體問題的一般用途語言。領域特定語言已經被討論,並使用幾乎與運算一樣長的時間。
DSL 在運算中非常常見:範例包括 CSS、正規表示式、make、rake、ant、SQL、HQL、Rails 的許多部分、JMock 中的期望、graphviz 的 dot 語言、FIT、strut 的設定檔....
我做了一個重要且有用的區分,即內部和外部 DSL。內部 DSL 是使用主機語言的特定方式,讓主機語言具有特定語言的感覺。這種方法最近在 Ruby 社群中很受歡迎,儘管它在其他語言中已有悠久的歷史,特別是 Lisp。儘管這通常在像那樣的低儀式語言中比較容易,但你可以在 Java 和 C# 等更主流的語言中執行有效的內部 DSL。內部 DSL 也稱為嵌入式 DSL 或 FluentInterfaces
外部 DSL 有自己的自訂語法,你寫一個完整的解析器來處理它們。在 Unix 社群中,有非常強烈的傳統做法。許多 XML 設定最終成為外部 DSL,儘管 XML 的語法並不適合此目的。
當今最常見的 DSL 是文字的,但你也可以使用圖形 DSL。圖形 DSL 需要類似於 語言工作台 的工具。語言工作台較不常見,但許多人認為它們有潛力徹底改善我們編寫程式的方式。
DSL 可以透過解釋或產生程式碼來實作。解釋(讀取 DSL 指令碼並在執行時間執行它)通常最容易,但有時程式碼產生是必要的。通常產生的程式碼本身是一種高級語言,例如 Java 或 C。
我在 2010 年底出版了 一本關於 DSL 的書。我有一個 指南頁面,我在其中彙整了我對 DSL 的研究。