張森, 鄧磊, 吳健, 朱明潔
(1.西北工業(yè)大學 計算機學院, 陜西 西安 710072; 2.中航工業(yè)西安飛機設(shè)計研究所, 陜西 西安 710089)
分布式對象模型是分布式技術(shù)和面向?qū)ο蠹夹g(shù)結(jié)合的產(chǎn)物,它是對分布式系統(tǒng)的業(yè)務(wù)處理進行抽象來構(gòu)造出的一組相關(guān)模型。這些模型通過接口來實現(xiàn)客戶程序和分布式中間件的相互通信,具有可重用性、平臺無關(guān)性等優(yōu)點。分布式對象模型框架代碼是分布式對象模型在具體平臺上的體現(xiàn),提供具體平臺上的分布式對象發(fā)布訂閱和遠程方法訪問等服務(wù)。文獻[1]描述了一種基于模板的代碼自動生成方法,該方法有效解決了人工編寫分布式對象模型框架代碼工作量大、錯誤率高的問題,大大提高了軟件開發(fā)的速度和質(zhì)量。然而代碼生成的規(guī)則都是在程序中硬編碼實現(xiàn)的,可擴展性和可維護性較差。
MDA(model driven architecture,模型驅(qū)動架構(gòu))是由OMG(object management group,對象管理組織)于2001年提出來的一種軟件開發(fā)框架。該框架以模型為核心,并將模型貫穿于整個軟件開發(fā)過程之中。它根據(jù)軟件開發(fā)的不同階段將模型分為PIM(platform independent model,平臺無關(guān)模型)、PSM(platform specific model ,平臺相關(guān)模型)和代碼3種。在MDA中,軟件開發(fā)過程由對軟件系統(tǒng)的建模行為驅(qū)動[2],首先要建立能夠描述系統(tǒng)全部業(yè)務(wù)的、與具體平臺無關(guān)的PIM。然后制定PIM到具體平臺的PSM的模型轉(zhuǎn)換規(guī)則,并通過這些規(guī)則將PIM轉(zhuǎn)換成一個或多個PSM。最后根據(jù)具體平臺的代碼生成技術(shù)將PSM轉(zhuǎn)換成相應(yīng)平臺的程序代碼。本文結(jié)合一種典型的分布式對象模型框架需求,改進了現(xiàn)有的基于模板技術(shù)的代碼生成技術(shù),提出了一種基于MDA的代碼生成方法,有效提高了分布式對象模型框架代碼生成系統(tǒng)的可擴展性和可維護性。
分布式對象模型框架代碼生成系統(tǒng)的作用是將用戶編寫的分布式對象模型描述VDL文件,通過解析,生成分布式模型框架代碼。該系統(tǒng)主要分為3個部分:模型解析、代碼生成和驅(qū)動引擎,如圖1所示。
模型解析的功能是以動態(tài)鏈接庫的形式提供一組API,以供驅(qū)動引擎調(diào)用。此API實現(xiàn)了對用戶給出的分布式對象模型描述VDL文件的解析,并將解析結(jié)果組織、記錄在一個中間表示數(shù)據(jù)結(jié)構(gòu)(IR)中。該部分包括詞法分析和語法分析模塊。詞法分析模塊從VDL文件中分離出VDL的單詞。語法分析是通過YACC(yet another compiler compiler)工具生成的VDL語法分析器來完成對VDL語法分析處理的。語法分析的過程會依照語義的描述來完成中間表示數(shù)據(jù)的記錄。語法分析過程中會通過2條途徑報告VDL語法錯誤。一條途徑是當輸入VDL文件不符合VDL文法規(guī)定時,直接報告錯誤。此類錯誤一旦出現(xiàn),就退出編譯過程。另一條途徑是在語義處理過程中檢查并報告與上下文有關(guān)的錯誤。
圖1 基于模板技術(shù)的代碼生成框架
代碼生成的任務(wù)是以動態(tài)鏈接庫的形式提供一組API,以供驅(qū)動引擎調(diào)用,并生成適配于分布式中間件的對象模型框架代碼。該框架代碼主要包括2部分。一部分是CORBA(TAO)的IDL代碼,IDL代碼最終交由TAO的IDL編譯器進行編譯生成Skeleton和Stub的C++代碼,這部分代碼主要完成VDO遠程方法訪問的功能。另一部分是C++代碼,此部分代碼會與分布式中間件協(xié)同,以實現(xiàn)分布式對象VDO的狀態(tài)發(fā)布/訂閱功能。
由于分布式中間件的協(xié)同代碼具有很多的共性,不同的VDL對應(yīng)的協(xié)同代碼的差異性信息在VDL文件中均已定義,故采取模板的技術(shù)對分布式中間件協(xié)同代碼進行生成。
系統(tǒng)首先將同一類分布式對象的中間件協(xié)同代碼做成模板的形式,其中不變部分以源代碼的方式直接給出;可變部分以標簽的形式給出。其次,根據(jù)具體的分布式對象的信息來生成各個標簽的內(nèi)容。最后,替換模板中的所有標簽,并輸出替換標簽后的模板,即生成中間件協(xié)同代碼。
驅(qū)動引擎的任務(wù)是讀取用戶輸入的分布式對象模型VDL描述文件,調(diào)用模型解析部分的API,生成中間表示數(shù)據(jù)結(jié)構(gòu)IR。然后掃描該IR,并調(diào)用代碼生成部分提供的API,自動生成分布式對象模型代碼。
由上述生成方案可以看出,代碼生成規(guī)則都是事先在程序中通過硬編碼設(shè)定的,一旦生成規(guī)則發(fā)生改變或者生成另一種平臺的模型框架代碼,則開發(fā)人員將重新修改原來的程序代碼,可擴展性和可維護性較差。
本文結(jié)合分布式對象模型框架需求和MDA思想,提出了一種新的代碼生成方法。主要包括:PIM建立、PIM到PSM的轉(zhuǎn)換和PSM到代碼的生成3個部分。PIM建立部分主要完成分布式對象PIM的建立,然后將其描述成XML文件。PIM到PSM的轉(zhuǎn)換部分以PIM描述XML文件為輸入,結(jié)合PIM和PSM元模型之間的轉(zhuǎn)換規(guī)則來轉(zhuǎn)換成PSM,并將其描述為XML文件。PSM到代碼的生成部分以PSM描述XML文件為輸入,采用XSLT技術(shù)來完成代碼的生成。系統(tǒng)架構(gòu)如圖2所示。
圖2 基于MDA的代碼生成架構(gòu)圖
分布式對象PIM的描述有2種方式:①VDL描述。VDL是一種專門為描述分布式對象而設(shè)計的語言,該語言類似于IDL語言,具有很高的靈活性。②Ecore描述。Ecore是EMF(eclipse model framework,Eclipse模型框架)的元元模型,是UML的一個子集。開發(fā)人員可以使用EMF中的Ecore樹形樣本編輯器快速方便地建立分布式對象Ecore模型。然而,盡管它們均能詳細地描述分布式系統(tǒng)的對象信息,但是卻無法作為MDA中PIM到PSM映射轉(zhuǎn)換的輸入。為此,本文采用XML文件作為系統(tǒng)的標準描述文件。對于VDL描述文件,則需要進行詞法分析和語法分析,將解析出的模型信息表述為XML文件。而對于Ecore描述,則可以使用標準XMI將Ecore表示的模型信息串行化成XML文件。以localclass對象模型Person為例,該對象具有2個屬性:①公有的name屬性,其類型為string。②只讀的age屬性,其類型為short。其XML描述為:
xmlns:xmi=http://www.omg.org/XMI xmlns:vdl="platform:/resource/VdlModelRefactoring/MetaModel/Vdl.ecore" name="Person">
分布式對象模型代碼主要實現(xiàn)分布式對象的遠程方法訪問和發(fā)布訂閱功能。遠程方法訪問是借助CORBA來實現(xiàn)的,系統(tǒng)首先要生成IDL代碼,然后經(jīng)過IDL編譯器編譯形成Skeleton和Stub的C++代碼。因此需要將PIM轉(zhuǎn)換成CORBA平臺的IDL-PSM模型。而發(fā)布訂閱功能是單獨用C++語言設(shè)計實現(xiàn)的,所以還需要轉(zhuǎn)換成C++平臺的C++-PSM模型。為了PSM模型到代碼的生成,所以PSM模型也采用XML進行描述。還以localclass對象模型Person為例,該對象會映射到一個C++平臺的class模型。該模型主要包含了Person模型對應(yīng)的屬性的get/set方法。根據(jù)Person模型屬性的修飾符不同,其轉(zhuǎn)換方法也不同。對于公有屬性,轉(zhuǎn)換后class模型含有g(shù)et/set方法。對于只讀屬性,轉(zhuǎn)換后只有g(shù)et方法,而沒有set方法。其XML描述為:
xmlns:xmi=http://www.omg.org/XMI xmlns:cpsm="platform:/resource/VdlModelRefactoring/MetaModel/CPsm.ecore" name="Person">
模型轉(zhuǎn)換是MDA中的關(guān)鍵部分。MDA中PIM到PSM的轉(zhuǎn)換是基于轉(zhuǎn)換規(guī)則來進行轉(zhuǎn)換的。為了使轉(zhuǎn)換規(guī)則的定義標準化,OMG開發(fā)了一組編寫轉(zhuǎn)換規(guī)則定義的標準語言QVT(query/view/transformation)。而ATL(atlas transformation language,Atlas轉(zhuǎn)換語言)是ATLAS研究組開發(fā)出來的一種模型轉(zhuǎn)換語言。該語言是EMF下的一種語言,符合OMG的QVT標準,可以將一組模型轉(zhuǎn)換成一種或多種目標模型。ATL的模型轉(zhuǎn)換規(guī)則定義在轉(zhuǎn)換模型所在層的上一層。如果轉(zhuǎn)換的模型處于M1模型層,那么模型轉(zhuǎn)換規(guī)則定義在M2元模型層。所以開發(fā)人員首先要設(shè)計PIM和PSM的元模型,然后再制定相應(yīng)的轉(zhuǎn)換規(guī)則,才能將輸入的PIM自動轉(zhuǎn)換成PSM。
以localclass對象模型到C++平臺的class模型的轉(zhuǎn)換為例,首先要定義localclass對象模型和C++平臺的class模型的元模型。元模型如圖3所示:
圖3 localclass元模型和class元模型
然后定義localclass元模型到class元模型轉(zhuǎn)換的規(guī)則,如下所示:
rule Root {
from
s : VDL!localclass
to
t : CPSM!class(
name <-s.name,
func <-
s.attr->select(e|e.modifier=′public′)->collect(e|thisModule.functionset(e)),
func <- s.attr->collect(e|thisModule.functionget(e))
)
}
lazy rule functionset {
from
c : VDL!attribute
to
m : CPSM!function(
rettype <-′void′,
name <-′set_′+c.name,
param <-
thisModule.parameter(c)
)
}
lazy rule functionget {
from
c : VDL!attribute
to
m: CPSM!function(
rettype <- c.type,
name <-′get_′+c.name
)
}
lazy rule parameter {
from
s : VDL!attribute
to
t : CPSM!parameter(
type <- s.type,
name <- s.name
)
}
其中,Root規(guī)則段定義了PIM元模型中l(wèi)ocaclass模型到PSM元模型中class模型的映射。首先將localclass模型中的name屬性原封不動地轉(zhuǎn)成class模型的name屬性,然后將localclass模型中的attr屬性轉(zhuǎn)換成function模型。對于公有的attr才能轉(zhuǎn)換成set方法的function模型。functionset和functionget規(guī)則段定義了PIM元模型中attribute模型到PSM元模型中function模型的映射。functionset規(guī)則產(chǎn)生set方法,functionget規(guī)則產(chǎn)生get方法。對于set方法function模型中的返回值類型rettype為void類型,方法名name由字符串"set_"和屬性名拼接而成。參數(shù)param由規(guī)則parameter來產(chǎn)生。而對于get方法function模型中的返回值類型rettype為屬性的類型,方法名name由字符串"get_"和屬性名拼接而成。paramter規(guī)則段定義了PIM元模型中attribute模型到PSM元模型中parameter模型的映射。該規(guī)則將attribute模型的屬性type和name對應(yīng)映射到了parameter模型的屬性type和name。
分布式對象模型代碼的生成主要完成從PSM模型到代碼的生成。該部分以PSM模型描述XML文件為輸入,并從中解析出模型信息,然后結(jié)合代碼模板生成具體平臺的模型代碼。由于分布式對象模型代碼具有很大的共性,并可以將其編寫成XSLT模板,并且代碼的動態(tài)部分信息是由XML文件描述的,所以代碼生成可以采用XSLT/XML技術(shù)來生成模型代碼。
XSLT代表eXtensible Stylesheet
Language:Transformations(擴展樣式表語言:轉(zhuǎn)換),是一種用來將一個XML文檔的結(jié)構(gòu)進行轉(zhuǎn)換的語言[3]。它可以將XML文檔轉(zhuǎn)換為其他基于文本格式的文檔,也可以轉(zhuǎn)換成另一種XML文檔。以Person模型為例,其xslt轉(zhuǎn)換代碼為:
encoding="ISO-8859-1"?>
xmlns:cpsm="platform:/resource/VdlMod elRefactoring/MetaModel/CPsm.ecore" xmlns:xsl="http://www.w3.org/1999/XSL/ Transform"> #include disable-output-escaping="yes">< ext>string disable-output-escaping="yes">> ext> using namespace std; class select="/cpsm:class/@name"/> { public: ); };
其中,
本系統(tǒng)架構(gòu)已經(jīng)在虛擬試驗分布式對象框架代碼生成系統(tǒng)中得到應(yīng)用。采用該系統(tǒng)架構(gòu),開發(fā)人員可以方便地修改模型、轉(zhuǎn)換規(guī)則和XSLT模板來調(diào)整模型代碼的生成,極大地縮短了開發(fā)人員的工作量,有效提升了系統(tǒng)開發(fā)的效率,提高了可擴展性、可維護性和可移植性。
參考文獻:
[1] 肖寒. J2EE平臺下代碼自動生成技術(shù)研究[J]. 電腦知識與技術(shù),2009,5(20):5421-5422,5434
Xiao Han. Study of Code Generation Technology Based on J2EE Platform[J]. Computer Knowledge and Technology, 2009,5(20):5421-5422,5434 (in Chinese)
[2] Anneke Kleppe, Jos Warmer, Wim Bast. 解析MDA[M]. 鮑志云,譯. 北京: 人民郵電出版社,2004
Anneke Kleppe, Jos Warmer, Wim Bast. MDA Analysis[M]. Bao Zhiyun, Translator. Beijing: Posts& Telecom Press, 2004 (in Chinese)
[3] Michael Kay. XSLT程序員參考手冊[M]. 朱冬東,呂俊輝,李玫,譯. 北京: 機械工業(yè)出社,2002
Michael Kay. XSLT Programmer′s Reference[M]. Zhu Dongdong, Lü Junhui, Li Mei, Translator. Beijing: China Machine Press,2002 (in Chinese)
[4] 曾一,許林,黃興硯,王翠欽. 一種結(jié)合MDA的高階模型轉(zhuǎn)換方法[J]. 計算機應(yīng)用研究, 2012,29(12):4584-4588
Zeng Yi, Xu Lin, Huang Xingyan, Wang Cuiqin. Method of Higher-Order Model Transformation Combined with MDA[J]. Application Research of Computers, 2012,29(12):4584-4588 (in Chinese)
[5] 趙遠東,王云華. 基于J2EE平臺的MDA模型驅(qū)動架構(gòu)技術(shù)[J]. 電腦知識與技術(shù), 2010,6(25):7017-7018,7043
Zhao Yuandong,Wang Yunhua. Model Driven Architecture Based on J2EE System[J]. Computer Knowledge and Technology, 2010,6(25):7017-7018,7043 (in Chinese)
[6] 於良偉,袁泉,霍劍青,王曉蒲. 基于XML和XSLT的模型驅(qū)動構(gòu)架[J]. 計算機工程, 2010,36(6):49-51
Yu Liangwei,Yuan Quan, Huo Jianqing, Wang Xiaopu. Model Driven Architecture Based on XML and XSLT[J]. Computer Engineering, 2010,36(6):49-51 (in Chinese)
[7] 楊美榮,史建鋒,李明星. 基于MDA的代碼生成器設(shè)計與實現(xiàn)[J]. 計算機工程, 2009,35(12):47-49,53
Yang Meirong, Shi Jianfeng, Li Mingxing. Design and Implementation of Code Generator Based on MDA[J]. Computer Engineering, 2009,35(12):47-49,53 (in Chinese)
[8] Mhamed Rahmouni, Samir Mbarki. MDA-Based ATL Transformation to Generate MVC 2 Web Models[J]. International Journal of Computer Science & Information Technology, 2011,3(4):57-70