從開發(fā)者角度看微軟領(lǐng)域特定語(yǔ)言(DSL)工具

字號(hào):

領(lǐng)域特定語(yǔ)言(DSLs)是架構(gòu)方面的一個(gè)熱點(diǎn)。微軟開始在自己的軟件產(chǎn)品線里支持DSL,并通過最近發(fā)布的Visual Studio 2005 SDK集成到它的軟件開發(fā)流程中。盡管現(xiàn)在已經(jīng)有許多關(guān)于DSL的信息,但它仍然是一個(gè)抽象的架構(gòu)概念。現(xiàn)在看看Mike James博士是如何從一個(gè)開發(fā)者的角度去理解Visual Studio DSL工具的。
    DSL是指軟件開發(fā)中出于某特定考慮而設(shè)計(jì)的小的、目標(biāo)明確的語(yǔ)言。它們的作用是,使用某特定領(lǐng)域里慣用的符號(hào)或者表示法對(duì)該領(lǐng)域的實(shí)體或者流程進(jìn)行建模。這就是它們區(qū)別于那些提供統(tǒng)一符號(hào)表示的通用建模語(yǔ)言(如UML)的地方。另外一個(gè)區(qū)別是UML經(jīng)常被用作于(定義如此,非只能用于)文檔分析或者設(shè)計(jì)交付,而領(lǐng)域特定語(yǔ)言既可以用作建模工具,還可以用作代碼生成器。
    在他的文章中,James抱怨說:
    ……文章、案例、白皮書,甚至視頻介紹都是那么糟糕。他們浪費(fèi)了太多的時(shí)間做無(wú)用功,而恰恰嚴(yán)重忽視了最明顯的問題——使用領(lǐng)域特定語(yǔ)言工具的新手可能會(huì)遇到什么問題?大多數(shù)案例過于復(fù)雜,看上去就像魔術(shù),比如告訴你“現(xiàn)在把下面的XML粘貼到一個(gè)新的文件中”,而不解釋為什么,以及XML文件是從那兒來的,或者它有什么用等,其實(shí)這些遠(yuǎn)不是新手們所關(guān)心的問題。本文不是洋洋灑灑數(shù)千言給你解釋如何改變一個(gè)圖表的顏色,而是主要講述那些文檔中缺失的部分,如怎樣使用領(lǐng)域特定語(yǔ)言工具從一個(gè)定制的圖表中實(shí)際產(chǎn)生一些代碼。一旦你明白了如何去做,那么那些文檔看上去才會(huì)有點(diǎn)意思。
    James解釋說微軟的DSL工具提供了一種圖形化的操作方式。在開始創(chuàng)建一個(gè)領(lǐng)域特定語(yǔ)言(DSL)時(shí),是圍繞DSL設(shè)計(jì)器進(jìn)行的,設(shè)計(jì)器的功能是設(shè)計(jì)和產(chǎn)生DSL或者設(shè)計(jì)依附于可生成代碼DSL的模型。開始的時(shí)候,設(shè)計(jì)器的設(shè)計(jì)器(Designer-Designer)概念聽起來有些迷糊,但是當(dāng)你理解了這一思想后,就很明白了。完整的DSL設(shè)計(jì)包含兩個(gè)階段:
    為你的DSL文法設(shè)計(jì)相應(yīng)的圖形表示。簡(jiǎn)單地說,你必須為你的語(yǔ)言設(shè)計(jì)圖形、連接器和底層的元模型(包括文字性屬性);
    寫代碼模板,即使用存儲(chǔ)在DSL中的實(shí)例(圖表)信息產(chǎn)生對(duì)應(yīng)的代碼。
    文章中,James提供了一個(gè)基于微語(yǔ)言(MinimalLanguage)模板(裝有SDK)的DSL Hello-World例子。他一點(diǎn)兒也沒有提到如何增加圖表或者模型部分如何連接到圖形上等細(xì)節(jié)。相反,他花了很多時(shí)間解釋代碼生成的過程。
    代碼生成是基于TextTemplate(.tt)文件的。這些模板包括直接生成(復(fù)制)為訪問模型或者用于動(dòng)態(tài)生成的目標(biāo)或者元代碼(meta-code)的代碼。James說最小代碼和元代碼是非常讓人困惑的。另外, DSL模型部分所基于的(沒有文檔的)元類結(jié)構(gòu)(Meta-Class-Structure)概念,對(duì)理解這些問題也沒有實(shí)質(zhì)性的幫助。
    實(shí)際上沒有類結(jié)構(gòu)的文檔說明,只有一些沒有用的特定案例。針對(duì)文檔問題我發(fā)現(xiàn)的的解決方法是在DSL設(shè)計(jì)器里閱讀源文件。比如,在最初的項(xiàng)目中如果你打開DomainClasses.cs文件,就會(huì)發(fā)現(xiàn)那些組成模型的類的定義。
    Mike James博士總結(jié)說:
    現(xiàn)在的DSL工具難以使用,最初的學(xué)習(xí)曲線也非常陡峭,學(xué)習(xí)的投入和產(chǎn)出不成正比,很不劃算。盡管充滿了新的專業(yè)術(shù)語(yǔ)和時(shí)不時(shí)讓你百思不得其解哪兒出了問題,坦白地說,圖形設(shè)計(jì)器很容易上手。但是,代碼生成原理遇到了一直受元代碼困擾的代碼生成器或者軟件工廠問題的障礙。這個(gè)問題就是,在表示(as-is)代碼和實(shí)際執(zhí)行的代碼產(chǎn)生更多代碼后,會(huì)有一堆恐怖的混合代碼。這個(gè)組合天生就是那么難以理解,也很難控制。我們真的需要一些更大膽的新想法。
    如果要使用微軟的DSL工具,需要下載安裝Visual Studio 2005 SDK v4.0,而且機(jī)子上要安裝有Visual Studio 2005專業(yè)版或者Visual Studio 2005團(tuán)隊(duì)版的某一版本。盡管沒有明確說明,在安裝VS 2005時(shí)還是要確認(rèn)選擇Visual C++環(huán)境,因?yàn)楫?dāng)前發(fā)布的工具是使用VC++項(xiàng)目生成的附屬DLL,它存儲(chǔ)了DSL的源代碼。