王 博, 舒新峰, 王小銀, 陳 銳
(1. 西安郵電大學 計算機學院, 陜西 西安 710121; 2. 西安郵電大學 陜西省網絡數(shù)據智能處理重點實驗室, 陜西 西安 710121; 3. 西北大學 信息科學與技術學院, 陜西 西安 710127)
伴隨著信息產業(yè)的不斷深入發(fā)展,應用軟件的需求和開發(fā)環(huán)境變得越來越復雜。傳統(tǒng)軟件開發(fā)方法暴露出新技術環(huán)境下的缺陷,比如開發(fā)周期漫長,工作重復較大,同時也給系統(tǒng)的演進和維護造成了很大的困難[1]。
與此同時,新軟件開發(fā)思想和工具,也導致了軟件工程方法論發(fā)生了深刻的變化,尤其是以OMG(object management group,對象管理組織)提出的模型驅動構架MDA(model driven architecture, 模型驅動構架)成為研究的主要方向。Frankel在其《應用MDA》一書中指出,“把寶貴的時間浪費在‘紙上談兵’上是一種罪惡”[2]。當然也并非是說設計不重要,只是把一些無用的形式上的設計,甚至是開發(fā)完畢之后的設計而致使設計和實現(xiàn)脫節(jié),純屬一種資源和時間的浪費。模型驅動構架使模型成為軟件開發(fā)中的首要驅動力[3],模型不僅僅是程序員的文檔,對軟件系統(tǒng)的建模行為將直接驅動系統(tǒng)的開發(fā)[4]。
自動代碼生成,即根據用戶任務需求建模而自動生成源代碼的程序或軟件。自動代碼生成深刻影響著軟件開發(fā)的內容和形式。
(1) 減少重復的編碼工作。自動代碼生成減少很多不必要的重復代碼的編寫,基于模板或者模型,通過代碼生成引擎,自動生成海量的代碼,可以提高軟件開發(fā)效率,優(yōu)化軟件開發(fā)過程。
(2) 代碼生成風格上一致良好。不同的程序員在編寫相同功能的模塊時,最終編寫的源代碼會有很大的不同,但是通過自動代碼生成的源代碼,具有較好的一致性和規(guī)范性,同時也具有良好的可讀性。
(3) 系統(tǒng)設計成為主導。整個開發(fā)過程,選擇正確的模型至關重要。因此系統(tǒng)設計者的主要目光會放到模型的選擇和系統(tǒng)業(yè)務邏輯的設計上。因此,系統(tǒng)的設計者會把較多的精力和實踐花費在頂層設計上,提高系統(tǒng)的可用性和健壯性。
(4) 易于修改和升級。 自動代碼生成的另外一個優(yōu)勢是可擴展性。在業(yè)務層次上,從長遠來看,自動代碼生成技術使得軟件更容易修改和升級。
(5) 設計的連貫性。 自動代碼生成鼓勵程序員在編碼體系內工作,其次,自動代碼生成器良好的文檔和可維護性為項目的維護和演化也提供了一致的結構和方法。
廣義自動代碼生成技術的用途是把高級語言編譯成匯編代碼、機器指令,是語言轉換編譯不可缺少的工具[5]。狹義自動代碼生成技術是在軟件開發(fā)過程中由經驗而形成的一種軟件工程技術,通過自動生成工具或者程序半自動或者全自動的生成應用系統(tǒng)的所用到的原始框架和代碼,一般生成的是文本形式的源代碼,進而編譯部署運行。本文若不強調,特指在軟件工程的項目開發(fā)中的狹義代碼生成技術。
代碼生成技術可以分為如下的形式:代碼重塑,內聯(lián)代碼展開,混合代碼生成,局部類生成,層次化生成,全領域語言描述等[5]。
代碼生成技術經過長期的發(fā)展和演進已經獲得了很大的進步,技術實現(xiàn)上也有了長足的進展,一大批的工具隨之而出現(xiàn),尤其是基于模型構架模型驅動構架的代碼生成技術出現(xiàn)了一大批的工具和成果。目前很多國外企業(yè)和相關機構都在專注于模型驅動構架的有關研究以及相應的工具開發(fā)。下面是國外的在模型驅動架構和自動代碼生成方面的研究狀況。
自動代碼生成技術從20世紀末的萌芽階段發(fā)展之今,已經趨于平穩(wěn)和成熟,“自動代碼生成”從1991年開始出現(xiàn)相關研究,2015年達到最熱。模型驅動構架的研究始于20世紀70年代,和自動代碼生成有著同步的研究趨勢。圖1為自動代碼生成的研究熱點走勢,圖2為模型驅動構架研究熱點走勢。從統(tǒng)計圖中可以看出,代碼生成在2010年后成為熱點,近幾年受機器學習和大數(shù)據技術發(fā)展而有所回落。(統(tǒng)計圖中的縱軸代表研究成果,文中的數(shù)據統(tǒng)計于百度學術,數(shù)據截止于2018年3月20)。
圖1 自動代碼生成技術熱點走勢
圖2 模型驅動構架研究熱點走勢
早在21世紀初,對象管理組織就宣布:模型驅動構架是其發(fā)展方向,動作快的廠商發(fā)布了具有模型驅動構架特性的產品,如OptimalJ,BorlandC#Builder Enterprise[2]。另外,一些中小廠商反而特別活躍,像Interactive Objects公司著名的ArcStyler工具,還有開放源碼的AndroMDA等遵循對象管理組織標準規(guī)范的模型驅動構架工具已在一些項目中得到了廣泛的運用,并取得了顯著的成效。
除此之外,國外一些科研機構和高等學校在自動代碼生成和基于模型驅動構架的自動代碼生成方面也進行了廣泛持久的深入研究。下面給出一些國外的自動代碼生成的研究,文獻[6-9]主要從模型驅動以及模型轉換方面介紹自動代碼生成引擎,文獻[10]介紹了基于模板和可重用構件的自動代碼生成方法和策略。文獻[11-12]介紹了基于規(guī)則的代碼生成策略。文獻[13-15]介紹了基于注釋的代碼生成方法。其中文獻[6]在基于基本準則的UML(unified modeling language,統(tǒng)一建模語言)類圖的自動代碼生成方面提出了設計方法和思路,并詳細介紹了模型轉換的規(guī)則和策略。文獻[12]介紹如何通過IOPT(input-output place-transition,輸入輸出位置轉換)Petri網實現(xiàn)ANSI C語言代碼自動轉化的工具。文獻[8]給出了基于MDA的通過微軟的ATL(active template library,動態(tài)模板庫)技術轉換生成MVC2(model view controller -2,模型視圖控制器-2)的web應用生成引擎的實現(xiàn)方法。文獻[9]詳細介紹了模型驅動構架中各類不同模型比如PIM(platform independent model, 平臺無關模型)到PSM(platform specific model,平臺相關模型)以及PSM到代碼的基于知識工程策略的轉換規(guī)則和方法。文獻[1]提出采用基于模型驅動構架的方法的XML(eXtensible markup language,可擴展標記語言)語言最大化自動生成代碼的方法和策略,而且詳細的給出了代碼密度和代碼獲取量的計算方法。文獻[16]介紹自主開發(fā)的一款基于動態(tài)框架的代碼生成器,其使用SCT(specification configuration template, 規(guī)范配置模板)的方法來生成整個應用,而不僅僅只生成框架,并取得了不錯的效果。文獻[10]在支持構件化web工程中的構件重用的方面進行了深入的研究。文獻[7]介紹了UML中的活動圖和序列圖的自動代碼生成方法。文獻[14]介紹了基于注釋和注解的方法在J2EE技術中的代碼生成的解決方案。文獻[13,15]介紹了基于XDoclet的AOP(attribute oriented programming,面向屬性的程序設計)方法。
隨著國外自動代碼生成技術的發(fā)展,特別是其主要研究方向轉化為以模型驅動的自動代碼生成技術之后,國內的相關研究也逐漸開始起步。雖然缺乏堅實的理論支撐,但部分軟件企業(yè)和高??蒲袡C構也在不斷跟進,取得了相應的成果。
20世紀80年代出現(xiàn)相關研究以來,到20世紀末自動代碼生成技術發(fā)展緩慢,進展不大。但當時間跨入21世紀以后,尤其是隨著模型驅動構架技術的引入以來,國內的自動代碼生成技術有了較大幅度的發(fā)展,特別是自2005年以來,一直處于高峰研究狀態(tài)。
自動代碼生成是一個多領域多學科交叉的學科,涉及的面比較廣。隨著研究的不斷深入,出現(xiàn)了越來越多與“代碼生成”相關的研究點,形成了龐大的研究網絡,該網絡囊括:軟件開發(fā)、編譯器、模型驅動、嵌入式系統(tǒng)、設計模式和編譯程序等領域的知識。
國內的軟件企業(yè)在自動代碼生成和模型驅動構架的研究和開發(fā)中也有不少成果,比如金蝶軟件公司是首家實現(xiàn)支持模型驅動構架軟件開發(fā)的商業(yè)工程工具金蝶EAS4.0,是一個基于模型驅動構架、采用“業(yè)務模型驅動的全自動化軟件工廠”開發(fā)的企業(yè)應用平臺[17]。楚凡科技是專業(yè)復雜軟件及系統(tǒng)開發(fā)解決方案的供應商。為軟件開發(fā)的整個生命周期提供集成的產品和專業(yè)化服務,楚凡科技工具Kant Studio集合了UML建模和數(shù)據庫建模;實現(xiàn)數(shù)據庫模型和UML模型的雙向轉換;實現(xiàn)代碼和模型之間的迭代轉換[18]。
一些中小企業(yè)和開源產品在上自動代碼生成方面也有較好表現(xiàn),開發(fā)了小型的代碼生成器支持從模型或者模板到不同程序設計語言的轉化。如動軟.Net代碼生成器是基于關系數(shù)據庫元數(shù)據庫的C#自動代碼生成器,Codematic生成的代碼基于面向對象思想和三層架構設計。BBOSS自動代碼生成工具是一款為專有框架和平臺生成前端、后端代碼、WEB服務代碼、SQL配置、IOC配置的可視化配置管理工具。Code Generator生成工具是基于Freemarker和Velocity模板生成代碼的引擎,該生成器是根據關系實體的元數(shù)據來生成源代碼。
國內的眾多高校和研究機構也在代碼生成、尤其是基于模型驅動骨架的代碼生成軟件工程也進行了長期的研究,取得了眾多的成果。下面給出國內的在自動代碼生成方面研究的典型問題,文獻[19-25]在基于模型轉換和代碼生成方面給出了詳細的介紹,文獻[26-27]是基于對象關系映射方面的自動代碼生成,文獻[28-29]是基于模式的用戶界面自動代碼生成技術,其中文獻[19-20]在逆向工程和程序流程圖到自動代碼生成提出一種基于圖的生成算法,文獻[21-22]在平臺無關模型到平臺相關模型,web用戶界面建模和自動生成,用戶界面代碼自動生成方面進行介紹。文獻[23]在模型驅動構架的模型轉換方面提出一種基于規(guī)則的轉化方法,文獻[24]對MDA模型的轉換方法進行了全面的分析。文獻[25]對UML中的類圖和順序圖自動生成C++語言代碼提出了基于一種基于規(guī)則轉化的生成方法。
目前相應的模型驅動理論研究還不夠充分,仍舊需要國內學者共同努力,并開拓與開創(chuàng)新的研究領域和思路,形成系統(tǒng)的理論和方法,以期加速軟件開發(fā)效率和對中小企業(yè)的軟件開發(fā)提供持久的支持。
根據以往項目開發(fā)中的經驗,自動代碼生成器的設計應遵循一定的原則。
(1) 選擇正確的模型。正確的模型對生成的質量是至關重要的。
(2) 不對自動生成的代碼做任何手工修改。因為在開發(fā)過程中,需求會發(fā)生或多或少的變化,這樣給后期代碼重新生成造成很大困難。
(3) 要對生成的目標類型有全面的理解。在代碼生成前,要對實體對象及其關系有全面的把握和理解。掌握好哪些是固定不變的業(yè)務邏輯,哪些是易變的業(yè)務,或者是生成的代碼所在的層次,這樣才能做到有的放矢。
(4) 明確代碼生成器的輸入源與目標代碼之間的映射關系。明確輸入源與目標代碼之間的映射關系,是設計代碼生成的關鍵所在。另外,輸入源是否完整描述目標代碼,也是生成代碼易用性和效率的關鍵所在。
當前自動代碼生成技術的方法主要有:基于模型的自動代碼生成,基于模板的自動代碼生成、基于對象關系映射、基于文檔注釋和基于動態(tài)代理的自動代碼生成技術。由于目前使用廣泛的自動代碼生成主要有兩大方法,一類是企業(yè)界的基于模板的代碼生成方法,一類是理論界基于模型框架的代碼生成方法,前者注重于時效性,往往能夠生成某種類型的系統(tǒng)的框架80%或者以上的源代碼,后者更注重于統(tǒng)一性,更注重于通用語言框架的代碼生成。
基于模板的代碼生成的基本原理是把軟件的需求分成兩部分,一部分是相對來說固定不變的部分,稱為靜態(tài)部分,另外一部分是根據外部輸入變化的部分。比如實體中的屬性的名稱和方法的名稱是變化的,這一部分通過特殊標記來替代。這樣代碼生成器引擎根據輸入和模板文件,按照一定規(guī)則生成源代碼,然后添加到項目文件中[30]。
前已述及,基于模板的代碼生成是利用系統(tǒng)共性的需求(模板)和個性的需求(特定的外部輸入),通過代碼生成引擎來生成系統(tǒng)源代碼的方法?;谀0宓拇a生成工具最困難的是明確區(qū)分輸入和轉化邏輯,也就是將元數(shù)據和具體業(yè)務規(guī)則進行分離,通過使用模板引擎技術,可將業(yè)務規(guī)則抽象到模板文件中,將元數(shù)據作為動態(tài)插入數(shù)據?;谀0宓拇a生成方法涉及分層和框架技術。
2.1.1 分層技術
分層技術在當前的軟件開發(fā)中被廣泛的使用。在軟件開發(fā)過程當中,把具有不同過程的解決方案放置到不同的概念層上面,之后這整個層次形成一個不夠密封的系統(tǒng),其中每一個層次在級別上具有平等性[31]。分層的優(yōu)點在于提高系統(tǒng)的靈活性和可復用性,能夠在一定程度上提高軟件開發(fā)的效率。
軟件的分層隨著用戶的需求和軟件體系結構的發(fā)展在逐層的演進,從20世紀80年代初的小型數(shù)據庫的結構化程序設計的單層結構,基于服務端和客戶端的雙層結構,瘦客戶端下的三層體系結構,以及將業(yè)務邏輯獨立出來的分布式系統(tǒng)的四層和五層結構,見證了軟件系統(tǒng)開發(fā)中的分層技術的發(fā)展趨勢[32]。當前典型的Web系統(tǒng)的開發(fā)中,使用基于表示層、業(yè)務邏輯層、持久層三層體系結構。見下圖3所示。
表示層數(shù)據呈現(xiàn)業(yè)務邏輯層業(yè)務處理持久層數(shù)據處理數(shù)據實體模型
圖3典型的web分層體系結構
定義1(分層結構定義) 約定將n層構架的各層編號為1,2,…,n,其中層的編號越大,則越處于系統(tǒng)的高層。那么分層構架應該滿足如下的規(guī)則:
(1) 第k層(1 (2) 如果p層依賴于q層,則p的編號一定大于q。 這個原則保證了層依賴的單向性,減少和降低了系統(tǒng)邏輯的復雜性,使得系統(tǒng)在提高功能高可復用性前提下易于控制。 定義2(分層對象模型) 基于分層體系的對象模型分成數(shù)據實體對象,持久層對象和業(yè)務邏輯層對象,每層的對象可以表示為一個n元組。 (1) 數(shù)據實體對象MO= (mo_id, mo_name, attr_set, op_attr),其中:mo_id, mo_name分別對應模型實體對象MO的唯一的標識和名稱; attr_set 代表該實體的屬性集;op_attr 代表對該屬性的操作,一般對應該實體的可讀和可寫算子。 (2) 持久層對象PO = (po_id, po_name ,mo, dll_set) ,其中:po_id, po_name分別對應持久層對象PO的唯一的標識和名稱;mo為持久層關聯(lián)的模型層實體對象和實體對象集合;dll_set為持久層對應的操作集合,比如增刪改查、分頁、排序等。 (3) 業(yè)務邏輯層對象BO = (bo_id, bo_name, mo, bll_set),其中:bo_id, bo_name分別對應業(yè)務邏輯層BO的唯一的標識和名稱;mo為持久層關聯(lián)的模型層實體對象和實體對象集合;bll_set為業(yè)務邏輯層對應的操作集合,比如登錄、注冊、審核等業(yè)務邏輯層的功能。 基于模板的自動代碼生成中,在進行模板生成或者模板定制的時候,往往根據不同的系統(tǒng)構架和元數(shù)據,采用分層的策略來進行生成,分別生成模型層、持久層、業(yè)務邏輯層和表示層的類型。這種策略結構清晰、目標明確,容易生成安全和質量有保證的系統(tǒng)源代碼。 2.1.2 軟件結構框架 對于軟件結構框架,很難找到一個明確的統(tǒng)一的和公認的定義,常見的幾個定義如下: (1) 框架是一個系統(tǒng)全部或者部分的可復用設計,通常由一組抽象類和類之間的協(xié)作組成。 (2) “框架是一個能夠被開發(fā)人員實例化的系統(tǒng)骨架”[33]。 (3) 軟件框架是軟件系統(tǒng)中的一組抽象構件以及構件間的接口所組成,在軟件開發(fā)中開發(fā)人員可以根據實際需求對框架進行對象實例化與代碼重構,從而快速形成一個“半成品”的應用系統(tǒng)程序,然后通過對業(yè)務流程的分析與設計從而完成整個應用系統(tǒng)的設計與實現(xiàn)[34]。 從上述定義可見,框架是一個“部分實現(xiàn)”的容器——一種軟件體系結構,支持軟件設計復用和實現(xiàn)復用的技術[33]。 當前主流的web框架有基于MVC結構的SSH(struts spring hibernate, SSH框架)框架,SpringMVC框架,基于Lucene的Compass框架,基于Spring的可插入的MVC(model view controller, 模型視圖控制器)框架SWF(spring web flow, SWF框架)[35]。現(xiàn)有的主流Web框架基本是基于分層結構的模型視圖控制器框架,在通用框架的作為基礎平臺的基礎上,進行符合框架的代碼定制。 2.1.3 自動代碼生成策略 當前基于使用比較多得基于模板的生成技術主要用到Freemarker、XSLT(extensible stylesheet language for transformations,擴展樣式表轉換語言)技術和velocity技術,通過代碼生成引擎將輸入的數(shù)據模型替換模板文件中的可變部分來生成目標代碼。由于模板文件基于文本易于定制和調整,結合成熟的模板語言可使代碼生成過程更具靈活性,生成的代碼質量更高。故其在中小企業(yè)中是應用最為廣泛的一種方式[36]。在代碼生成方案中,以下的三個元素是必須的。 (1) 模板:在生成的代碼中,有些內容和邏輯是不變的,在基于模板的生成技術方案中,這些內容用模板存放,其中定義了生成代碼的基本結構和邏輯。 (2) 元數(shù)據:元數(shù)據的本意是描述數(shù)據內容和結構,在代碼生成技術中,元數(shù)據用于描述生成代碼的內容。 (3) 業(yè)務規(guī)則:業(yè)務規(guī)則定義了生成系統(tǒng)的數(shù)據處理邏輯,主要是模塊中的在持久層如何進行實體的持久,亦即基本的增刪改查操作,在業(yè)務邏輯層定義構建在持久層基礎上實體的業(yè)務邏輯操作。 基于模板的代碼生成過程如圖4所示。 圖4 基于模板的自動代碼生成過程 基于模板的自動代碼生成的過程如下:首先對用戶需求進行分析,進行初步的分析和設計,在實現(xiàn)階段制定要采用的框架和何種分層結構,根據功能需求,設計相應的模板文件,并根據數(shù)據庫或者元數(shù)據,使用代碼生成引擎去生成程序的源代碼。在生成的基礎的源代碼基礎上進行代碼調整和特定代碼的添加,調試之后將代碼部署到基礎框架中。 基于模型驅動的自動代碼生成及技術的方法是將要實現(xiàn)的軟件系統(tǒng)抽象成模型,然后通過模型到代碼的映射規(guī)則自動生成代碼?,F(xiàn)在流行的是基于模型驅動構架的代碼生成。模型驅動構架的思想是以模型為驅動,由模型來生成或者編譯成程序代碼,實現(xiàn)軟件需求。模型是模型驅動構架思想的核心。工作原理是先對用戶的需求進行分析建立PIM(platform independent model, 平臺無關模型),然后用相應的模型驅動構架轉換工具和技術,將PIM轉換成為PSM(platform specific model,平臺相關模型),最后將PSM通過代碼生成器生成特定平臺上的目標代碼[30]。 模型驅動構架的出現(xiàn)使得解決傳統(tǒng)軟件的開發(fā)問題并且以工廠化開發(fā)軟件成為可能。模型驅動構架支持基于可視化模型驅動的軟件設計、內容存儲與交換,是一種基于模型的軟件開發(fā)構架。其最終目標是把針對特定計算平臺的編碼工作,交由機器完成,從此將業(yè)務邏輯與實現(xiàn)技術結構。從而最大程度的提升軟件開發(fā)效率和質量、降低開發(fā)成本、延長軟件壽命,實現(xiàn)工廠化開發(fā)軟件[37]。 2.2.1 模型層次結構 模型驅動構架中的模型組織分成四層結構[38],依次為M0到M3。層次結構上,上一層是下一層的基礎,下一層是上一層的應用。M3是元-元模型,MOF(meta object facility,元對象機制)位于該層。MOF提供了定義M2層元模型所需要的更抽象一級的建模支持。MOF是M2層所有元模型的元模型,同時它也是自描述的,即MOF可以描述MOF元模型本身。在MDA框架中,M3層只有MOF這一個模型,它是MDA中最基礎和核心的標準。為模型驅動構架中的所有模型/元模型提供統(tǒng)一的語言基礎,為模型語言(元模型)定義提供公共標準。M2層為元模型,代表建議MOF之上的各種模型語言,提供對應不同領域的領域建模語言,為M1層的建模提供建模符號。M1層為模型層,是建模人員通常面對的模型,即采用模型語言為企業(yè)應用建立的模型描述。MDA的CIM(computation independent model ,計算無關模型)、PIM和PSM模型都位于該層,M0層為實例層,是M1層模型的實例化,對應模型的具體應用程序,是模型描述的最終目標。MDA四層元模型體系結構如圖5所示。 圖5 MDA四層元模型體系結構 2.2.2 MDA應用模型 MDA的應用模型包括計算無關模型CIM,平臺無關模型PIM和平臺特定模型PSM。 它們與實例模型中的實現(xiàn)特定模型ISM(implementation specific model, 特定實現(xiàn)模型)的關系如圖6所示。 CIM計算無關模型用于描述系統(tǒng)需求、功能、行為和運行環(huán)境,也稱為業(yè)務模型。PIM平臺無關模型是抽出的業(yè)務邏輯,不包括與實現(xiàn)平臺的技術相關的特定信息。PSM平臺特定模型,從相應的PIM轉換而來。ISM實現(xiàn)特定模型是PSM的實例化,包括PSM用于構建一個系統(tǒng)并使之運行的所有信息,如程序代碼、裝載規(guī)格、部署說明以及配置規(guī)范等,是一個可以實際運行的軟件系統(tǒng)[39]。 圖6 應用模型之間的轉換關系 用戶界面工程中的用戶界面代碼生成也是自動代碼生成中重要的組成部分。MDA的應用框架,也類似于UI模型的卡梅隆(Cameloen)參考框架[28]??仿⒖伎蚣芏x的四種模型分別是任務和概念、AUI(abstract user interface, 抽象用戶界面)、CUI(concrete user interface, 具體用戶界面)和FUI(final user interface, 最終用戶界面)??仿⒖寄P偷某橄蠼缑妾毩⒂谠O備和平臺,與任務特征相關,考慮輸入輸出的表示問題,是對界面的功能描述;具體用戶界面模型與設備相關,與平臺無關,考慮具體的實現(xiàn)問題,是界面模型的代碼轉化,轉化時,引入具體設備特征,將抽象用戶界面轉化成具體用戶界面,然后引入具體平臺特征,再將具體界面模式轉換為最終用戶界面,具體參見圖7。模型驅動構架的自動代碼生成對用戶界面的自動生成也具有指導意義。 任務和概念(Task and Concepts)抽象用戶界面(AUI)具體用戶界面(CUI)最終用戶界面(FUI) 圖7Cameleon參考框架 2.2.3 基于模型驅動的自動代碼生成過程 基于模型驅動的自動代碼生成的過程如下:首先根據用戶的需求編寫PIM,再根據PIM和目標平臺編寫轉換規(guī)則,MDA代碼生成引擎根據轉換規(guī)則自動將PIM轉化成PSM,最后將PSM轉換成代碼。MDA通過兩次模型轉換和代碼生成技術提高軟件開發(fā)的效率,并使得系統(tǒng)具有較好的可一致性和可復用性。基于模板的代碼生成過程參見圖8。 圖8 基于模型的代碼生成過程 2.2.4 兩者的優(yōu)缺點和融合 基于模板的自動代碼生成具有較高的靈活性,定制和開發(fā)較為容易,提高了軟件開發(fā)的可復用度。但也有其確定,模板化的程序可讀性差,生成的代碼依賴于某種語言和框架,移植性差。在其他類似項目中使用,如果采用的框架不同或語言不同,需要重新構建新的自動代碼生成引擎。 模型驅動構架相比于傳統(tǒng)的軟件開發(fā)方式和基于模板的自動代碼生成方式,具有開發(fā)效率高、可維護性可擴展性強的特點,系統(tǒng)具有良好的可移植性[40]。但是模型驅動構架也存在一些缺點:雖然模型驅動構架的目標遠大,但是實現(xiàn)模型驅動構架的技術模糊,基礎規(guī)范MOF和UML都存在著語義不精確、語言不可執(zhí)行的問題;另外構成平臺的元素還不是很確定,這就導致從系統(tǒng)的抽象模型到精確模型的轉化可能包括多個階段,而且每個階段相對于前一階段可以說成是平臺相關的。那么從這個意義上來說,PIM到PSM的轉換是模糊的[37]。 基于模板的自動代碼生成和基于模型的自動代碼生成兩者各有其優(yōu)點和缺點,前者更注重于時效性,后者更注重于通用性,兩者之間有一道鴻溝不可逾越?;谀0宓拇a生成可以認為更關注類似PSM到代碼的生成,基于模型的自動代碼生成更關注于模型的轉換和平臺無關模型到平臺相關模型之間的轉化。因此,可以在兩者之間架起一座橋梁,融合現(xiàn)有的基于模板的技術和基于模型的代碼生成技術。 基于對象關系映射的代碼生成主要是基于面向對象和關系數(shù)據庫技術的結合體。如:Microsoft的.NET框架,JAVA開源ORM(object relation mapping,對象關系映射)框架[41]。典型的JAVA ORM工具是hibernate。hibernate是對JDBC(java database connectivity,Java數(shù)據庫連接)數(shù)據庫技術進行輕量級的對象封裝,使開發(fā)人員能方便的操作各種類型的數(shù)據庫代碼,利用Hibernate工具,使得JAVA實體類、hbm(hibernate mapping,hibernate 映射)映射文件、數(shù)據庫表之間可以相互轉化,但是缺乏進一步對實體持久性和業(yè)務邏輯以及視圖層代碼的生成。其次,可以通過對關系數(shù)據庫元數(shù)據的分析,結合模板或者模型的方式來生成持久層和業(yè)務邏輯層的代碼。 2.3.1 阻抗不一致 對象和關系模型存在著映射不一致的鴻溝,關系模型有深厚的以集合論為指導的數(shù)學理論基礎,使用二維表來存儲數(shù)據,表和表之間通過外鍵來描述實體之間的關系。對象模型是面向對象程序設計中的一種開發(fā)范型,對象模型通過繼承、封裝、多態(tài)來表示復雜實體的關系,對象之間的通信方式時候發(fā)消息,面向對象模型關系如圖9所示。在軟件開發(fā)過程中,廣泛的使用面向對象的程序設計作為開發(fā)的范型,實體的存儲主要是以當前主流的關系數(shù)據庫為數(shù)據存儲機制。對象建模和關系建模之間存在一條巨大的鴻溝,因為產生所謂的對象關系阻抗不一致問題,ORM就為解決這種問題而誕生。 圖9 面向對象模型圖 2.3.2 對象模型和關系模型 定義3[42]一個對象類的定義為O(A1,…,An,M1,…,Mn), 其中,Ai(i=1,2,…,n)為對象類的屬相,定義域在Di上;Mi(i=1,2,…,k)為類的方法,返回值定義在域Di上。 定義4[42]關系R是笛卡爾積D1×D2×…×Dn的一個子集,D1×D2×…×Dn是所有的有序的n元組〈d1,d2,…,dn〉的集合,其中d1∈D1,d2∈D2,…,dn∈Dn,D1×D2×…×Dn稱為關系R的域。關系模式的一般形式可表示為R=〈U,D,DOM,∑〉,其中U為組成關系R的全部屬性集合,D為域的集合,DOM為U和D間的映射,∑為U上的一組依賴關系。 定義5[42]映射函數(shù)F是滿足下列條件的函數(shù):F的定義域為對象所有實例的集合,設為I;F的值域為關系數(shù)據庫中的所有視圖的冪集,設為Π,對一個對象實例,o∈I,其所有的方法與屬性的集合為S。V∈Π,即V為若干視圖的集合。 2.3.3 基于對象關系映射的代碼生成方法 對象關系映射的關系對應如下,面向對象中的類模型對關系模型中的表,面向對象中的對象模型對應關系模型中的行記錄,面向對象中類的屬性對應關系模型中的表關鍵字,面向對象中類的關系對用關系模型中的對象[27,30]。如下圖10所示。 圖10 ORM映射規(guī)則 對象關系映射自動生成引擎的生成代碼主要是如下方法:根據軟件功能需求建立實體關系圖,或者根據原有企業(yè)的遺產系統(tǒng)讀取實體關系,根據實體之間的關系,通過代碼生成引擎生成相應的模型層類代碼、持久層類;更進一步可以生成業(yè)務邏輯層框架和代碼和基本的展示層代碼。 2.3.4 基于對象關系映射的代碼生成優(yōu)缺點 優(yōu)點:對于實體關系非常明確的領域模型,或者已有數(shù)據庫遺產系統(tǒng),可以非常容易的映射成面向對象的領域模型,生成不同層次的代碼,提高效率。 缺點: 生成模型相對來說比較單一,生成結構有時過于復雜,持久效率在關聯(lián)復雜的情況比較低下。 對于實體關系模型不確定的問題,難于進行實體關系映射,生成結構相對單一,生成代碼比較有限。 這種方式也屬于混合代碼生成方式。該生成方法查找特別格式的注釋,然后生成代碼所需要的一些新源碼來填補這些注釋區(qū)域,換言之這種代碼生成是通過解析代碼文件中的注釋語句來生成代碼,將控制代碼生成和模板處理的標簽作為內聯(lián)注釋嵌入到源文件代碼中,消除了同步多個相關文件和控制文件的需要?;旌洗a生成用途廣泛,例如@XDoclet可以通過在Java源文件中的一些特殊的注釋信息,自動生成配置文件、源代碼等,WEB、EJB(enterprise java bean,JAVA商業(yè)應用組件)的部署描述文件,為struts的struts-config.xml配置文件、JavaScript校驗等。比如javadoc可以通過文檔的注釋生成API的設計說明書,tomcat可以根據JSP生成對應的servlet。這種方式的優(yōu)點是對于業(yè)務邏輯特殊或者特別復雜的問題,把復雜的業(yè)務邏輯部分單獨來寫,特定的可替換的部分用文檔注釋來書寫,代碼生成引擎根據特定規(guī)則對文檔注釋進行轉換。但描述這類文件較復雜,缺乏統(tǒng)一通用性[43]。 文檔注釋是定義在類中的特殊注釋,這些文檔注釋用來向代碼中的類、方法以及屬性之類的語言特征添加元數(shù)據,隨后通過文檔和代碼生成引擎,利用這些額外的元數(shù)據來生成諸如描述符和源代碼之類的相關文件。注解(Annotation),也叫元數(shù)據。一種代碼級別的說明。主要用于元數(shù)據生成文檔和代碼二次生成和以及編譯檢查。當前注解和文檔注釋被廣泛的使用,以生成大量的配置文件和程序源代碼。 源碼上的標記,無論是文檔注釋還是注解,對于項目開發(fā)者來說,都有如下的優(yōu)勢:通過實際的代碼,合并有用的元數(shù)據,分離編碼和某些領域相關語義的問題,使得設計和開發(fā)者能夠容易的重用存在的代碼和功能,這些技術對于軟件系統(tǒng)的維護和支持都有幫助。 較少有文獻把基于代理的動態(tài)類的代碼生成認為是自動代碼生成技術,因為這種代碼生成并不真正生成源代碼,而是通過代理技術來動態(tài)的生成類的方式,也就是說,在程序運行時創(chuàng)建類的字節(jié)碼或機器碼,并且在程序運行或者解釋期間動態(tài)生成、動態(tài)加載并調用執(zhí)行。JavaEE技術中使用動態(tài)代理類的場合比較多,比如Spring的AOP(aspect oriented programming, 面向切面編程)技術。Java原生代理實際上是創(chuàng)造了一個實現(xiàn)了所有給定接口的類,并在調用接口的方法的時候使用反射達到代理效果。動態(tài)代理提供了一種動態(tài)執(zhí)行程序組件的方法,通過動態(tài)代理實現(xiàn)業(yè)務控制器對軟件構件的調用。動態(tài)代理是一種特殊的代理模式,其代理對象是在程序運行期間動態(tài)創(chuàng)建的。它的主要特點是不需要定義代理對象、程序代碼高度抽象以及對象之間耦合弱的特點。動態(tài)代理技術比如JAVA的動態(tài)代理Proxy,CGLIB代碼生成庫等提供了動態(tài)代理類的生成。 2.5.1 AOP和動態(tài)代理 AOP(aspect oriented programming, 面向切面編程),通過預編譯方式和運行期動態(tài)代理實現(xiàn)程序功能的統(tǒng)一維護的一種技術。AOP是OOP(object oriented programming,面向對象程序設計)的延續(xù),是軟件開發(fā)中的一個熱點,是函數(shù)式編程的一種衍生范型。利用AOP可以對業(yè)務邏輯的各個部分進行隔離,從而使得業(yè)務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發(fā)的效率。代理類在程序運行時創(chuàng)建的代理方式被稱為動態(tài)代理。也就是說,這種情況下,代理類并不是在代碼中定義的,而是在運行時根據代碼中的“指示”動態(tài)生成的。相比于靜態(tài)代理,動態(tài)代理的優(yōu)勢在于可以很方便的對代理類的函數(shù)進行統(tǒng)一的處理,而不用修改每個代理類的函數(shù)。 2.5.2 動態(tài)生成技術CGLIB CGLIB是一個強大的、高性能的代碼生成庫,廣泛的應用與AOP中,用于提供方法的攔截操作。CGLIB代理通過對字節(jié)碼的操作,為對象引入間接級別的操作。CGLIB低層使用了字節(jié)碼操作框架ASM來生成新的類。ASM框架是一個Java字節(jié)碼操縱框架。它可以直接以二進制形式動態(tài)地生成stub類和其他代理類,或者在裝載時動態(tài)地修改類。 不同的自動代碼生成技術有其使用的場合,有其特定環(huán)境下的優(yōu)點和缺點,表1從自動代碼生成方法的輸入輸出、使用場合、優(yōu)缺點和相關技術,給出縱橫向的比較。 表1 自動代碼生成方法之比較 當前自動代碼生成主要采用的是基于模型的自動代碼生成和基于模板的自動代碼生成,兩者趨于融合。未來可以根據計算機和人類處理問題的特點,采用人機協(xié)同的開發(fā)方法,根據實體業(yè)務的復雜性和需求變化頻度進行生成,劃分成基礎框架部分、全生成部分、半自動生成部分和全手工部分,構建彈性、高可用性和高可復用性的自動代碼生成引擎。今年,CCF將基于人工智能的軟件開發(fā)構造、代碼生成及技術和基于人工智能的軟件分析、測試、驗證與診斷技術以及智能人機接口軟件的設計和實現(xiàn)技術作為未來研究的重要技術方向;其次,更細粒度的智能代碼生成模型與自動代碼生成仍然需要加大研究的力度,以適應不斷變換發(fā)展的社會需求。 本文主要討論了代碼生成技術,尤其是基于MDA的自動代碼生成技術的國內外研究和應用現(xiàn)狀,詳細分析了當前自動代碼生成技術所使用策略和方法。較多類似的管理系統(tǒng),如高校的排課管理系統(tǒng)[44]中后臺管理的大部分代碼都可以采用自動代碼生成技術完成。通過對實現(xiàn)方法有效性的相應驗證可知,雖然隨著軟件工程新方法論的提出取得了一定的成果,但是,自動代碼生成技術還有很多不成熟之處。比如:基于模型驅動構架的轉換工具和方法還不盡成熟,缺乏成熟系統(tǒng)的理論支持;基于模板和規(guī)則的方法只能對于特定問題域的系統(tǒng)方法有效,對于業(yè)務邏輯復雜的系統(tǒng)還是缺乏行之有效的方法。2.2 基于模型驅動的自動代碼生成及技術
2.3 基于對象關系映射的代碼生成
2.4 基于文檔注釋解析的自動代碼生成
2.5 基于代理的動態(tài)類的代碼生成
2.6 自動代碼生成方法之比較
2.7 自動代碼生成技術發(fā)展趨勢
3 結語