特定領域語言指南
特定領域語言 (DSL) 是一種電腦語言,針對特定類型的問題,而不是針對任何類型軟體問題的一般用途語言。特定領域語言已被討論,且使用時間幾乎與運算時間一樣長。
DSL 在運算中非常常見:範例包括 CSS、正規表示式、make、ant、SQL、許多 Rails 位元、JMock 中的預期、graphviz 的 dot 語言、strut 的設定檔....
我做了一個重要且有用的區分,在於內部和外部 DSL。內部 DSL 是使用主機語言的特定方式,讓主機語言具有特定語言的感覺。這種方法長期以來一直是 Lisp 傳統的一部分,並且在過去十年中由 Ruby 社群重新注入能量。儘管在像那樣的低儀式語言中通常較容易,但您可以在更主流的語言(例如 Java 和 C#)中執行有效的內部 DSL。內部 DSL 也稱為嵌入式 DSL 或 流暢介面
外部 DSL 有自己的自訂語法,您撰寫一個完整的剖析器來處理它們。在 Unix 社群中,有執行此項工作的強大傳統。一種變化是將 DSL 編碼在資料結構表示中,例如 XML 或 YAML。
當今最常見的 DSL 是文字的,但您也可以使用圖形 DSL。圖形 DSL 需要一個類似於 語言工作台 的工具。語言工作台較不常見,但有些人認為它們有潛力大幅改善我們編寫程式的方式。
DSL 可以透過解釋或產生程式碼來實作。解釋(在執行時間讀取 DSL 腳本並執行它)通常最容易,但有時程式碼產生是必要的。通常產生的程式碼本身就是一種高級語言,例如 Java 或 C。
martinfowler.com 上關於特定領域語言的材料指南。
特定領域語言
語言工作台:特定領域語言的殺手級應用程式?
軟體開發中的大多數新想法實際上都是舊想法的新變種。本文描述了其中一種,即我稱之為語言工作台的一類工具的興起概念,其中包括 Intentional Software、JetBrains 的 Meta Programming System 和 Microsoft 的 Software Factories。這些工具採用一種舊式的開發方式,我稱之為語言導向程式設計,並使用 IDE 工具來嘗試使語言導向程式設計成為一種可行的途徑。雖然我還不足以預測它們是否會實現自己的目標,但我確實認為這些工具是軟體開發領域最有趣的事情之一。足夠有趣,可以寫這篇文章來嘗試解釋它們是如何運作的,以及它們未來用途的主要問題,至少要概述一下。
重構為適應性模型
我們的軟體邏輯大部分都是用程式語言寫的,這些語言提供了最佳的環境來撰寫和演化此類邏輯。但有些情況下,將此邏輯移到我們的命令式程式碼可以詮釋的資料結構中會很有用,也就是我所稱的適應性模型。以下我將展示 JavaScript 中的一些產品選擇邏輯,並說明如何將其重構為編碼在 JSON 中的簡單產生式規則系統。此 JSON 資料讓我們可以使用不同的程式語言在裝置之間共用此選擇邏輯,並在不更新這些裝置上的程式碼情況下更新此邏輯。
商業可讀 DSL
DSL 是否允許商業人士在不涉及程式設計師的情況下撰寫軟體規則?
當人們談論 DSL 時,通常會提出商業人士自行撰寫程式碼的問題。我喜歡將 COBOL 推論套用在此一思維中。也就是說,COBOL 最初的目標之一是讓人們在沒有程式設計師的情況下撰寫軟體,而我們知道結果如何。因此,當任何計畫都是為了在沒有程式設計師的情況下撰寫程式碼時,我必須詢問這次有什麼特別之處,可以讓它成功,而 COBOL(以及許多其他事物)都失敗了。
語法雜訊
在討論 特定領域語言(或任何電腦語言)時,一個常見的片語是雜訊語法。人們可能會說 Ruby 比 Java 雜訊少,或外部 DSL 比內部 DSL 雜訊少。在語法雜訊中,人們指的是不屬於我們真正需要表達內容的一部份,但卻存在於滿足語言定義的額外字元。雜訊字元很糟糕,因為它們會模糊我們程式的意義,迫使我們找出它在做什麼。
DSL 目錄
我在特定領域語言的書中使用模式結構來組織我用來描述 DSL 的概念。此目錄是該書中模式的清單。每個模式都連結到每個模式的頁面。雖然這些頁面沒有包含太多詳細資訊,但它們確實為每個模式提供參考 URI。