天天看點

DSL簡介

領域專用語言簡介

主要回答幾下幾個問題 

1 什麼是 DSL 

2 為什麼使用 DSL 

3 何時使用 DSL

什麼是 DSL

DSL(Domain Specified Language)領域專用語言。 

要了解什麼是領域專用語言,需要先了解其建立背景。即為什麼會誕生這樣一種事物,其發明的目的是為了解決什麼問題。

總的來說 DSL 是為了解決系統(包括硬體系統和軟體系統)建構初期,使用者和建構者的語言模型不一緻導緻需求收集的困難。 

舉一個具體的例子來說。在建構證券交易系統的過程中,在證券交易活動中存在許多專業的金融術語和過程。現在要為該交易過程建立一個軟體解決方案,那麼開發者/建構者就必須了解證券交易活動,其中涉及到哪些對象、它們之間的規則以及限制條件是怎麼樣的。那麼就讓領域專家(這裡就是證券交易專家)來描述證券交易活動中涉及的活動。但是領域專家習慣使用他們熟練使用的行業術語來表達,解決方案的建構者無法了解。如果解決方案的模型建構者要了解交易活動,就必須讓領域專家用雙方都能了解的自然語言來解釋。這種解釋的過程中,解決方案的模型建構者就了解了領域知識。這個過程中雙方使用的語言就被稱為“共同語言”。

共同語言稱為解決方案模型建構者用來表達解決方案中的詞彙的基礎。建構者将這些共同語言對應到模型中,在程式中就是子產品名、在資料模型中就是實體名、在測試用例中就是對象。

在上面的描述,可以看到在需求收集的過程中,如果要成功構模組化型,則需要一種領域專家和建構者(也就是通常的領域分析師/業務分析師)都能了解的“共同語言”。但是這種共同語言的建立過程沒有保證,不能夠保證在收集過程中得到的資訊完整的描述了領域活動中所有的業務規則和活動。

如果能夠讓領域專家通過簡單的程式設計方式描述領域中的所有活動和規則,那麼就能在一定程度上保證描述的完整性。

DSL 就是為了解決這個問題而提出的。

常見的 DSL

  • 軟體建構領域 Ant
  • UI 設計師 HTML
  • 硬體設計師 VHDL

DSL 的特點

  • 用于專門領域,不能用于其他領域
  • 表現力有限
  • 不描述解答域,僅描述問題域

DSL 與通用程式設計語言的差別

  • DSL 供非程式員使用,供領域專家使用
  • DSL 有更進階的抽象,不涉及類似資料結構的細節
  • DSL 表現力有限,其隻能描述該領域的模型,而通用程式設計語言能夠描述任意的模型

DSL 分類

要了解DSL 分類需要先了解一個概念。“元語言抽象”。 

它是指通過一種語言來建構另一種語言。比如 Java 就是建構在 C 上的語言。 

其中,從什麼語言建構而來,這種建構來源的語言稱為“宿主語言”。

根據是否從宿主語言建構而來,DSL 分為:

  • 内部 DSL(從一種宿主語言建構而來)
  • 外部 DSL(從零開始建構的語言,需要實作文法分析器等)

還有一種屬于外部DSL的“非文本DSL”,即盡量使用圖形化表述。比如 JetBrains 的 MPS。

我們通常所用的架構實際上就是一種内部 DSL。比如 Rails 架構就是基于 Ruby 的用于 Web 開發領域的内部 DSL。

如何建構 DSL

建構DSL 要滿足三個原則:

  • 能夠完整描述領域
  • 簡單易用
  • 隐藏實作細節

何時使用 DSL

DSL 的建構難度比較大,從零建構不合适。建議使用比較完善的建構。

背後的概念

簡單的領域模組化

繼續閱讀