Visual Studio 2010 DSL (一) DSL的簡介

03 August 2011 — Written by Sky Chang
#DSL#Visual Studio

最近又看到IThome的一篇文章,IBM個人電腦和MS-DOS邁入30年頭,才驚覺其實電腦真正開始發展也不過短短30年頭,而短短的30年頭,就已經佔領了每個人的生活,同樣的,程式的發展也沒幾年,所以,不要太苛求我們寫程式的了,整個軟體工程,也不過短短的幾年發展而已啊~~回想當年,以前上課所教的瀑布式開發法,直到現在,演進也算是非常快的了。

最近因為公司再導入軟體工程的一些東西,所以又開始看了一些關於架構,設計等等之類的書籍,說到軟體工程的一些東西,除了超久超久以前上課所學的瀑布式等等外,當初比較有印象的就是好幾年前在學校做專題的案例了,那時候是要寫一個網頁UI程式碼自動產生器,也就是利用UML的循序圖和類別圖來斷定必須要有那些UI介面,並讓他自動產生,而整個專案過程,是使用MDA配合UML來開發,後來隨著時間,又看了一堆敏捷、XP等等等,直到最近,因DDD的關係,不小心看到了DSL。

廢話說了一堆,那到底甚麼是DSL,今天的主題並不是要用Visual Studio 2010開發任天堂的NDSL喔…,如果是的話,我想我大概就會紅了,其實DSL的全名是Domain Specific Languages,直接翻譯就是"領域特定語言",或是倒裝一下"特定領域語言",目前看下來,"特定領域語言"這種中翻比較多人使用。

在解釋甚麼是DSL之前,我必須要先強調,DSL並不是像C#、Java這類的程式語言,也不是像UML這類的圖形語言,反而言之,他應該是可以包含C#、Java和UML等,換言之,他比較像是一種概念。其實DSL的概念,可以簡單說成,"利用你自己所定義的東西,來處理不斷重複的事情,並且最終可以產生你所預期的程式碼。"

舉例來說,Visual Studio裡面的LinqToSql和EntityFramework設計器,就是用DSL所寫出來的,所以DSL定義了每個Entity圖是代表著甚麼意義,兩個Entity之間的線是代表著甚麼關聯,最終畫出來的圖,應該怎樣產出程式碼。也因此,DSL其實是一種特別用來描述某個特殊領域的語言,而這個EntityFramework,就是種特殊的領域。除此之外,Visual Studio 2010的UML Modeling Project裡面的循序、類別圖等,也都是用Visual Studion DSL開發出來的。

我們再來看另外一個例子,大家應該常常會有這種感覺,今天做完這個專案,下次做另外一個專案的時候,有許多東西是很類似的,這時大家會怎麼做?,像我比較笨一點就會使用拷貝貼上改改改的方式來完成吧,而這種區塊,可能就是某種特定的領域,這時候,就可以考慮使用DSL來將此區段模組化,未來就可以直接使用。

像是EntityFramework設計器就是一個例子,我們不同的專案,不可能都用一套全新的設計器吧,而是所有專案都會使用EntityFramework設計器,所以今天把此領域模組化,未來就可以不斷的適用於各種不同地方。

而講到DSL,就不能不提DSD。

利用DSL所設計與開發的模式,就稱之為DSD Domain Specific Development

我們再從整個系統的角度來看,整個系統中,通常設計完後,可能會有固定不常變動的區塊和常常需要變動的區塊,而DSD的設計,就是尋找出經常需要變動的區塊,由設計人員使用DSL預先定義好所有的Domain,來讓那些站在更高層次,領域專家的角度,(或是程式設計師自己)來處理這類需要不斷重複解決問題的方法,而不需要讓程式設計師不斷的重複的撰寫這些程式,最後由DSL產生出來的程式碼,並整合於固定不變的部分,這就是一種DSD。

就如下圖一樣,一個系統裡面的Framework,除了手寫的Code外,不常變動的區塊外,還有一塊是由DSL寫出來的Model(左上角)所產生出來的,而產出的程式碼,就這樣嵌入於Framework裡面。

image

另外,我們通常設計一個程式時,最基本的,我們會分成三層,我們也可以利用DSL來定義這三層,並讓他自動產生相對應的程式碼,這樣未來我們製作其他專案的時候,就可以不需要再重複地打某些程式碼,如下圖,是Microsoft所做出來的一個例子,他們使用DSL來描述這三層式的架構。

image

我們可以知道,如果跨越層級存取,是非常嚴重的一個錯誤,所以當UI直接存取Data時,就會產生錯誤,這些也可以從DSL裡面定義。

image

說了非常多的東西,看到最後,或許有人會覺得這和UML有啥不同?,就如前面所述,DSL是一種用於解決特定領域的語言,他的關鍵在於解決,這和描述用途的UML是非常不同的,雖然現在像是類別圖也可以用來產生程式碼,但是UML最初的用意,是用來描述整個系統架構,讓開發者了解,這和DSL是有很大的差異,DSL的初本,就是去解決特定重複性的問題。

說了那麼多,未來我會帶一些範例,我想,大家就會更清楚的了解領悟。

以下是一些參考網站,大家也可以過去看看喔。

http://en.wikipedia.org/wiki/Domain-specific_language

http://msdn.microsoft.com/zh-tw/vstudio/cc963628

http://msdn.microsoft.com/en-us/vstudio/ff637756

http://msdn.microsoft.com/en-us/vstudio/ff637759

Sky & Study4.TW