開發者需要了解的領域特定語言(DSL)
領域特定語言是在特定領域下用於特定上下文的語言。作為開發者,很有必要了解領域特定語言的含義,以及為什麼要使用特定領域語言。
領域特定語言(DSL)是一種旨在特定領域下的上下文的語言。這裡的領域是指某種商業上的(例如銀行業、保險業等)上下文,也可以指某種應用程式的(例如 Web 應用、資料庫等)上下文。與之相比的另一個概念是通用語言(GPL,LCTT 譯註:注意不要和 GPL 許可證混淆),通用語言則可以廣泛應用於各種商業或應用問題當中。
DSL 並不具備很強的普適性,它是僅為某個適用的領域而設計的,但它也足以用於表示這個領域中的問題以及構建對應的解決方案。HTML 是 DSL 的一個典型,它是在 Web 應用上使用的語言,儘管 HTML 無法進行數字運算,但也不影響它在這方面的廣泛應用。
而 GPL 則沒有特定針對的領域,這種語言的設計者不可能知道這種語言會在什麼領域被使用,更不清楚使用者打算解決的問題是什麼,因此 GPL 會被設計成可用於解決任何一種問題、適合任何一種業務、滿足任何一種需求。例如 Java 就屬於 GPL,它可以在 PC 或移動裝置上執行,嵌入到銀行、金融、保險、製造業等各種行業的應用中去。
DSL 的類別
從使用方式的角度,語言可以劃分出以下兩類:
- DSL:使用 DSL 形式編寫或表示的語言
- 宿主語言:用於執行或處理 DSL 的語言
由不同的語言編寫並由另一種宿主語言處理的 DSL 被稱為外部 DSL。
以下就是可以在宿主語言中處理的 SQL 形式的 DSL:
SELECT account
FROM accounts
WHERE account = '123' AND branch = 'abc' AND amount >= 1000
因此,只要在規定了詞彙和語法的情況下,DSL 也可以直接使用英語來編寫,並使用諸如 ANTLR 這樣的解析器生成器以另一種宿主語言來處理 DSL:
if smokes then increase premium by 10%
如果 DSL 和宿主語言是同一種語言,這種 DSL 稱為內部DSL,其中 DSL 由以同一種語義的宿主語言編寫和處理,因此又稱為嵌入式 DSL。以下是兩個例子:
-
Bash 形式的 DSL 可以由 Bash 直譯器執行:
if today_is_christmas; then apply_christmas_discount; fi
同時這也是一段看起來符合英語語法的 Bash。
-
使用類似 Java 語法編寫的 DSL:
orderValue = orderValue .applyFestivalDiscount() .applyCustomerLoyalityDiscount() .applyCustomerAgeDiscount();
這一段的可讀性也相當強。
實際上,DSL 和 GPL 之間並沒有非常明確的界限。
DSL 家族
以下這些語言都可以作為 DSL 使用:
- Web 應用:HTML
- Shell:用於類 Unix 系統的 sh、Bash、CSH 等;用於 Windows 系統的 MS-DOS、Windows Terminal、PowerShell 等
- 標記語言:XML
- 建模:UML
- 資料處理:SQL 及其變體
- 業務規則管理:Drools
- 硬體:Verilog、VHD
- 構建工具:Maven、Gradle
- 數值計算和模擬:MATLAB(商業)、GNU Octave、Scilab
- 解析器和生成器:Lex、YACC、GNU Bison、ANTLR
為什麼要使用 DSL?
DSL 的目的是在某個領域中記錄一些需求和行為,在某些方面(例如金融商品交易)中,DSL 的適用場景可能更加狹窄。業務團隊和技術團隊能通過 DSL 有效地協同工作,因此 DSL 除了在業務用途上有所發揮,還可以讓設計人員和開發人員用於設計和開發應用程式。
DSL 還可以用於生成一些用於解決特定問題的程式碼,但生成程式碼並不是 DSL 的重點並不在此,而是對專業領域知識的結合。當然,程式碼生成在領域工程中是一個巨大的優勢。
DSL 的優點和缺點
DSL 的優點是,它對於領域的特徵捕捉得非常好,同時它不像 GPL 那樣包羅萬有,學習和使用起來相對比較簡單。因此,它在專業人員之間、專業人員和開發人員之間都提供了一個溝通的橋樑。
而 DSL 最顯著的缺點就在於它只能用於一個特定的領域和目標。儘管學習起來不算太難,但學習成本仍然存在。如果使用到 DSL 相關的工具,即使對工作效率有所提升,但開發或配置這些工具也會增加一定的工作負擔。另外,如果要設計一款 DSL,設計者必須具備專業領域知識和語言開發知識,而同時具備這兩種知識的人卻少之又少。
DSL 相關軟體
開源的 DSL 軟體包括:
- Xtext:Xtext 可以與 Eclipse 整合,並支援 DSL 開發。它能夠實現程式碼生成,因此一些開源和商業產品都用它來提供特定的功能。用於農業活動建模分析的多用途農業資料系統(MADS)就是基於 Xtext 實現的一個專案,可惜的是這個專案現在已經不太活躍了。
- JetBrains MPS:JetBrains MPS 是一個可供開發 DSL 的整合開發環境,它將文件在底層儲存為一個抽象樹結構(Microsoft Word 也使用了這一概念),因此它也自稱為一個投影編輯器。JetBrains MPS 支援 Java、C、JavaScript 和 XML 的程式碼生成。
DSL 的最佳實踐
如果你想使用 DSL,記住以下幾點:
- DSL 不同於 GPL,DSL 只能用於解決特定領域中有限範圍內的問題。
- 不必動輒建立自己的 DSL,可以首先嚐試尋找已有的 DSL。例如 DSLFIN 這個網站就提供了很多金融方面的 DSL。在實在找不到合適的 DSL 的情況下,才需要建立自己的 DSL。
- DSL 最好像平常的語言一樣具有可讀性。
- 儘管程式碼生成不是一項必需的工作,但它確實會大大提高工作效率。
- 雖然 DSL 被稱為語言,但 DSL 不需要像 GPL 一樣可以被執行,可執行性並不是 DSL 需要達到的目的。
- DSL 可以使用文字編輯器編寫,但專門的 DSL 編輯器可以更輕鬆地完成 DSL 的語法和語義檢查。
如果你正在使用或將要使用 DSL,歡迎在評論區留言。
via: https://opensource.com/article/20/2/domain-specific-languages
作者:Girish Managoli 選題:lujun9972 譯者:HankChow 校對:wxy
訂閱“Linux 中國”官方小程式來檢視
相關文章
- 基於OpenAi通用特定領域的智慧語音小助手OpenAI
- 開發者需要了解的nodejs中require的機制NodeJSUI
- 領域本體與DDD的UL語言
- Groovy 是一門 DSL 語言
- [譯] Web 開發者需要了解的基礎色彩理論Web
- 如何從業務程式碼中提升技術:使用領域特定語言消除重複程式碼
- 微服務不是全部,只是特定領域的子集微服務
- 不安分的 Go 語言開始入侵 Web 前端領域了GoWeb前端
- 各種不同領域的程式語言一覽表
- Android開發需要了解的 IM 知識Android
- 哪種程式語言的開發者最幸福?
- 面向領域專家的語言,而不僅僅是程式設計師的語言程式設計師
- Apache Pig:您需要了解的有關Hadoop程式語言的所有資訊ApacheHadoop
- DSSA特定領域軟體體系結構
- 自動生成特定領域模型和圖表模型
- 使用函式式語言來建立領域模型函式模型
- 【虹科乾貨】Redis 開發者需要了解的快取驅逐策略Redis快取
- 40% 的雲原生開發者專注於微服務領域微服務
- 時至今日,為何C語言在軟體開發領域的地位仍無法撼動C語言
- Apache Dubbo 社群召集 Rust 語言開發者ApacheRust
- go語言開發入門:GO 開發者對 GO 初學者的建議Go
- C語言應用領域及前景怎麼樣?C語言
- 幽默:儘量用領域語言編寫程式碼
- 千“垂”百鍊:垂直領域與語言模型(1)模型
- 前端開發需要了解的瀏覽器通識前端瀏覽器
- 領域知識增強的預訓練語言模型在藥電商搜尋領域的實踐模型
- 【EMNLP 2023】面向垂直領域的知識預訓練語言模型模型
- 什麼是DDD領域驅動設計的統一語言?
- python語言的應用場景有哪些?六大領域!Python
- 後端工程師需要了解的跨域知識後端工程師跨域
- CVPR 2019 | 無監督領域特定單影像去模糊
- CVPR 2019 | 無監督領域特定單影象去模糊
- 以太坊Solidity程式語言開發框架————12、聯絡開發者Solid框架
- Kotlin 程式語言詳解:特點、應用領域及語法教程Kotlin
- 人工智慧開發者:如何選擇人工智慧領域?人工智慧
- GoLand 2023:引領Go語言開發的創新之旅 mac/win版GoLandMac
- 移動開發需要了解的UI設計知識移動開發UI
- Eclipse 不為人所知的另一面 - 企業管理軟體領域 ABAP 程式語言開發利器Eclipse