领域特定语言

領域特定語言（英語：Domain-specific language，縮寫：DSL），也稱為特定域語言，是專門針對特定應用領域的计算机语言，和可以用在多種領域的通用語言（英语：general-purpose language）（GPL）恰好相反。像HTML專門用在網頁設計上，就屬於領域特定語言，也有些領域特定語言只用在一個或幾個軟體上，例如MUSH（英语：MESH）軟體碼。領域特定語言還可以依使用的語言分類，像是領域特定的標記語言、領域特定的建模語言（或更廣義的規格語言）以及領域特定的程式語言。從電腦發明開始，就已出現特定用途的電腦語言。而「領域特定語言」一詞是隨著特定域建模（domain-specific modeling）的興起，才開始廣為使用。簡單的領域特定語言（特別是只有單一應用程式使用的領域特定語言），有時也會稱為迷你語言。 領域特定語言和通用語言之間沒有明確的界線，因為可能某计算机语言原來有一些適用於特定領域的特徵，但也可以應用在更通用的範圍，相反的，也有可能某计算机语言理論上可以用在多種領域，但實務上只用在特定領域中。像Perl一開始是設計為文字處理語言以及膠水語言（和AWK、shell script的領域相同），但後來成為通用的程式語言。相反的，PostScript是圖靈完備的語言，但實際上只用作頁面描述語言（領域特定語言）。 設計及使用適合的語言，是領域工程（英语：domain engineering）中重要的一環，作法可能是選擇適合此領域的現有語言（可能是某個領域特定語言或通用電腦語言），也可能是開發一種新的領域特定語言。面向语言的程序设计會把為了描述問題而創建特定語言一事，視為問題解決流程的標準步驟之一。假如用一種新的領域特定語言描述某種問題，會比用現有語言描述更加清楚，而且這種問題又常常出現，那麼創建此一領域特定語言（以及配合的軟體）就是值得的。領域特定語言可以針對特定的問題領域、特定的問題表示方式、特定的解決方案技術，或是某一領域的其他層面。 领域特定语言是在設計和實現上有特定目的的語言（或是宣告的語法或是文件）。领域特定语言可以是視覺對話語言（visual diagramming language），例如Generic Eclipse Modeling System（英语：Generic Eclipse Modeling System）中建立的語言，可以是程式化抽象，例如Eclipse Modeling Framework，也可以是文字語言。例如，命名列工具grep中正则表达式語法，可以在文字中尋找特殊排列規則的文字。sed工具定義了匹配和取代正则表达式的語法。一般來說，這些小工具可以在殼層內整合使用，以達到複雜的系統工作。 有時领域特定语言和腳本語言之間沒有清楚的分界，不過领域特定语言多半沒有處理檔案系統的低階功能、跨行程控制、以及一些全功能程式語言或腳本語言必須有的功能。許多领域特定语言不會編譯成字节码或是可執行檔，而會轉換為許多不同的媒體格式。像GraphViz可以輸出PostScript、GIF檔、JPEG檔等。Csound則會編譯成聲音檔。像是POV-Ray之類的光線追蹤（ray-tracing）领域特定语言會轉換為圖形檔。像是SQL之類的電腦語言會有種特殊的情形：SQL是針對特定領域（存取和維護關聯資料庫）的，所以的確是领域特定语言，也常會其他應用程式呼叫，但SQL的關鍵字及函數比許多腳本語言都多，一般也會視為是獨立的語言，有可能是因為在程式中資料庫使用的普及性，以及要成為此語言專家需要有的掌握程度。 許多领域特定语言也有提供API，因此可以在其他程式執行時呼叫此API，不影響原程式的流程，此運作方式類似程式的函式庫，和腳本語言之間的差異就更小了。 有些领域特定语言會隨著時間擴展，加入全功能的程式開發工具，因此更增加了該語言是否是领域特定语言的問題難度。 在模型驱动工程中，有許多领域特定语言的例子，像是用斷言說明模型的OCL（英语：Object Constraint Language）、或是领域特定的轉換语言QVT（英语：QVT），不過统一建模语言（UML）反而是通用的建模語言。 有一個類推可以說明超小型語言及领域特定语言：超小型語言像是刀，有許多不同的使用方式，從切食物到鋸樹都可以。领域特定语言像是電鑽，也有很多不同的使用方式，不過都是用來在東西上鑽洞上。通用特定语言是完整的完整的工作台，有許多特別用來進行特定工作的工具。程式設計師使用领域特定语言的方式類似他們看工具台，知道他們需要一個較好的電鑽，而且找到一個剛好適用的领域特定语言。 領域特定語言的一些優點如下： 領域特定語言可以使解決方案以較簡潔的方式呈現，而且達到問題域上的抽象層次。意思就是領域專家自身可以理解、驗證、修改，甚至開發領域特定語言的程式。不過，可以達到此程度的例子不多。 領域特定語言可以達到領域層次的计算机安全。只要其語言構造（language construct）是安全的，以此寫的所有程式碼可以視為是安全的[來源請求]。 領域特定語言有助於將商業資訊系統的開發，從傳統的軟體開發者轉到領域專家身上，此一群體人數較多，對此一領域有較深入知識，但程式技術較為不足。 若領域特定語言的scope較小，會比較容易學習。 領域特定語言的一些缺點如下： 學習新語言的成本。 應用範圍受限。 設計、實現及維護領域特定語言以及開發工具（集成开发环境）的成本。 尋找、設定及維護適當的語言scope。 設計領域特定語言時，需在領域專門的語言構造，以及通用的語言構造之間取捨平衡。 相較於程式設計師撰寫的程式碼，領域特定語言的效率可能會比較低。 同一領域可能有計多種非標準語言，例如不同保險公司開發、使用的領域特定語言。 非技術背景的領域專家不容易自行撰寫或修改領域特定語言的程式。 領域特定語言和（用通用語言撰寫的）IT系統其他模組不易整合。 特定領域特定語言的專家人數較少，會帶來人力成本的增加。 不容易找到相同領域特定語言的程式碼範例。 此處的領域也可能是指业务领域（business area），例如壽險政策、戰鬥模擬、薪資計算、帳單管理等 語言工作檯（英语：Language workbench） 架構描述語言 專門用途語言（英语：Language for specific purposes） 行話 元語言抽象（英语：Metalinguistic abstraction） 程式設計領域（英语：Programming domain） Marjan Mernik, Jan Heering, and Anthony M. Sloane. When and how to develop domain-specific languages. ACM Computing Surveys, 37(4):316–344, 2005.doi:10.1145/1118890.1118892 Diomidis Spinellis. Notable design patterns for domain specific languages （页面存档备份，存于互联网档案馆）. Journal of Systems and Software, 56(1):91–99, February 2001. doi:10.1016/S0164-1212(00)00089-3 Freudenthal, Margus. Domain Specific Languages in a Customs Information System. IEEE Software. 1 January 2009: 1. doi:10.1109/MS.2009.152.  Aram, Michael; Neumann, Gustaf. Multilayered analysis of co-development of business information systems (PDF). Journal of Internet Services and Applications. 2015-07-01, 6 (1) [2022-10-08]. S2CID 16502371. doi:10.1186/s13174-015-0030-8 . （原始内容存档 (PDF)于2015-09-07）.  Miotto, Eric. On the integration of domain-specific and scientific bodies of knowledge in Model Driven Engineering (PDF). [2010-11-22]. （原始内容 (PDF)存档于2011-07-24）.