那么現在,編譯分為兩個階段:一個簡單的從目標語言到最終結果的翻譯,一個更復雜的從最初的原始語言到中間目標語言的轉換;翻譯階段是微不足道的,因此我們把精力集中于更有意思的轉換階段;至少,現在的問題簡化為了如何將模型從一種語言轉換到另一種語言;但是,有可能源語言與目標語言是完全不同的,導致轉換非常復雜,比如映射一個源節點到許多散布在目標模型中的目標節點;我們想讓定義轉換盡可能的簡單容易,因此我們需要一種模型轉換DSL來幫助我們;在MPS中,這種 DSL被稱為Transformation Language
代碼生成有三種主要的方法,我們將結合使用它們來定義模型轉換;第一種是遍歷方式,你枚舉源模型中所有節點,檢視每一個,并基于檢視到的信息生成目標模型中的一些目標節點;第二種方式是使用模板和宏來定義如何生成目標語言;第三種方式是使用模式匹配來查找在源模型中的哪些節點上應用轉換
我們通過定義DSLs把這些方式結合起來以支持任何一種方法;這些DSLs將一起工作來幫助你定義從一種語言到另一種語言的轉換;例如,遍歷方式激發了 Model Query Language的靈感,它使枚舉節點和從概念模型中收集信息變得簡單容易;你可以把它想象成某種針對概念模型的SQL;做為一種額外的獎賞,擁有一種強大的查詢語言不只是對代碼生成有用(例如,能夠使編輯器更聰明)
Templates
模板方法工作方式類似Velocity或者XSLT;模板看起來很像目標語言,但是允許你在模板的任何部分中添加宏;宏本質上是當運行轉換的時候被執行的代碼段;宏允許你檢視源模型(使用Model Query Language),并使用得到的信息對模板進行“填空”,得到最終的目標代碼
在圖5中,你可以看到為概念“Property”生成Java代碼的模板的定義,模板為屬性添加了field declarations, getters, setters等;這個模板是將代碼從Structure Language轉換為Java的生成器的一部分
既然模板看起來像目標語言,你可以想象模板是用某種基于目標語言的特殊的語言編寫的;這也是它事實上的工作方式;我們實際上使用一個生成器來為你生成模板語言,而不是手工為每一種可能的目標語言創建模板語言;它基本上是復制目標語言,并添加所有模板特定的特性,諸如宏等;甚至模板編輯器也是從目標語言編輯器產生的,因此你同樣不需要處理代碼
當你使用一種模板語言的時候,你可以認為它是用目標語言編寫的,只是某些部分的代碼是參數化的,或者是由宏來計算的;這種技術極大的幫助簡化了代碼生成;模板還可以用在其它任務上,如重構、代碼優化、還有更多...
Patterns
模型的模式匹配方法給我們一種作為Model Query Language的代替的查找模型的強大方法;你可以把模式想象成概念模型的正則表達式;與模板方法類似,我們基于源語言產生模式語言;模式語言看起來像源語言,只是添加了一些特性,來幫助你定義處理復雜源模型匹配的靈活的標準;你可以把這種方法想象成一種強大的“查找替換”的技術;再一次,模式語言不只是對代碼生成有用,例如,它們在為源語言編輯器編寫自動化的代碼檢查工具方面非常有用
文章來源于領測軟件測試網 http://www.kjueaiud.com/