天天看點

MDSF:DSL(Domain Specific Language)介紹

問題域、問題空間

文法、語義

案例、方法、工具

DSL腳本(DSL Script):每一個DSL的核心都是一個域模型,它定義了這一語言所代表的各種概念,這些概念的屬性,以及它們之間的關系

在問題域中用于建構、配置或者其他用途的一種語言

可以是文本,也可以是圖形,或者兩者混合使用

 圖形語言不隻是圖表,否則使用Visio之類的畫圖軟體就行了,它實際上是要建立模型,這個模型要能夠從概念上描繪你正在建立的系統,并對其内容進行圖表化的表示。一個模型可以同時由多個圖表來表示,每個圖表表示模型的某個方面

 文本語言使用者輸入,可以快速的打字。

 文本語言的優勢在于可以進行比較和合并,而圖形表達式可以更容易的看出内容之間的關聯。

 相對來說,文本語言比圖形複雜

語義模型(Semantic Model)

DSL腳本的一種記憶體完整表示

有時候這個就是抽象文法樹(AST)

分離Parse和Generate

生成代碼(Generated Code):DSL的一個最重要的應用是用來生産簡單的文本形式的工件,例如源代碼、資料庫腳本

DSL腳本的一種可執行表示

解釋語義模型

進階别的重用:如果僅适用通用程式設計語言,則每次隻能解決一個問題,但如果應用特定領域開發方法設計并實作一些特殊語言,每個特殊語言可以高效地解決一類相似的問題

使用DSL的軟體架構可以跨接軟體工程過程各階段之間的鴻溝,特别是通過代碼生成可以很好的進行設計和實作階段的銜接

讓領域專家參與開發過程,不僅僅是需求階段,架構階段也需要參與

通過在問題空間工作,可以讓不熟悉如何實作技術的人,包括商業人士,也能夠更了解模型

使用DSL表達的模型,可以在問題空間這個較高的抽象層次進行驗證,這意味着可以在開發周期的更早期發現因為了解和表述而造成的錯誤。

一個模型中具備了重要的業務知識,将解決方案從一種技術遷移到另一種技術,或在同一技術的不同版本之間遷移,就變的相對容易。一般通過适當修改生成器或解釋器就可以做到。 

  外部DSL可以擺脫内部DSL寄宿語言的限制,可以重新設計一種新的語言,但是增加了學習新的語言的學習成本,并且需要工具的支援。

  為了降低風險,我們并不是馬上就從頭開始開發架構及其DSL,而是應該從現有的可以在某些應用中使用的代碼開始,逐漸的對其進行參數化,逐漸的發現那些在不同應用中變化的部分,然後使這些部分依賴于DSL。

  自上而下的方法傾向于快速建立一個完整且自包含的模型,具有更長遠的考慮,有助于保證結構的一緻性。但是從另一方面看,這種方法容易導緻在概念層設計出很複雜的模型,并且該模型難于實作。是以在實際應用中,将自上而下和自下而上兩種方法交替使用會更有效。采用漸進的方式可以避免早期投入過大風險,但是需要定期進行一緻性檢查。

識别可變性與發現DSL:DSL是用你的架構具體的實作你的體系架構模式中可變的部分

開發領域模型捕獲可變性

定義标記:在适當的地方使用常見标記法或與标記法相關的約定

開發驗證的限制:識别樹形之間的依賴性,認出快照中的強制或禁止的循環

開發并演進架構:了解你的DSL針對的代碼體系結構,并在架構中編寫它

測試DSL:包括驗證的限制與規則、生成器與指令、以及生成的代碼

演化和移植DSL:確定舊的模型在新版本的DSL中能夠使用

識别好的DSL:範圍、最小性、常見标記法,适度的備援,合理的使用句法空間,使用使用者術語

<a href="http://book.douban.com/subject/4775030/"></a>

<a target="_blank" href="http://www.jot.fm/issues/issue_2009_09/column6/index.html">Best Practices for DSLs and Model-Driven Development </a>

<a href="http://www.cnblogs.com/zhoujg/archive/2010/07/26/1785002.html">讀書筆記:Visual Studio DSL工具特定領域開發指南</a>

<a href="http://www.cnblogs.com/zhoujg/archive/2010/05/19/1739145.html">DSL的演進</a>

 本文轉自 jingen_zhou 51CTO部落格,原文連結:http://blog.51cto.com/zhoujg/517119,如需轉載請自行聯系原作者