林 卓,齊曉斌,衛(wèi) 進(jìn)
(中航工業(yè)西安航空計(jì)算技術(shù)研究所,西安710119)
表驅(qū)動代碼生成技術(shù)在編譯器中的應(yīng)用?
林 卓,齊曉斌,衛(wèi) 進(jìn)
(中航工業(yè)西安航空計(jì)算技術(shù)研究所,西安710119)
針對MDA(模型驅(qū)動架構(gòu))領(lǐng)域的新背景,結(jié)合編譯器技術(shù),提出了一種基于表驅(qū)動的代碼自動生成技術(shù)。該技術(shù)應(yīng)用在編譯器后端,實(shí)現(xiàn)中間代碼到目標(biāo)代碼的生成,尤其當(dāng)目標(biāo)代碼數(shù)量大、結(jié)構(gòu)復(fù)雜時,該技術(shù)的優(yōu)勢將會更加明顯。經(jīng)過實(shí)驗(yàn)驗(yàn)證,表驅(qū)動代碼生成技術(shù)在具有通用代碼生成技術(shù)優(yōu)勢的同時,不僅提高了生成效率,而且降低了代碼的耦合度和邏輯控制復(fù)雜度。以數(shù)據(jù)為中心,實(shí)現(xiàn)了數(shù)據(jù)與控制相分離,使整個系統(tǒng)具有良好的可維護(hù)性和擴(kuò)展性。
表驅(qū)動;代碼自動生成;編譯器
編譯器主要實(shí)現(xiàn)翻譯功能,以一種程序語言作為輸入,以另一種等價的程序作為輸出[1],輸出的程序可以是匯編語言也可以是其他高級語言。傳統(tǒng)的編譯器一般以匯編語言作為輸出,而某些新型編譯器則使用其他成熟的程序語言作為目標(biāo)語言,這種編譯器的輸入一般比較簡單,甚至只是單一的模型描述文件,而生成的目標(biāo)代碼則是功能強(qiáng)大的框架代碼程序,不僅文件數(shù)量大,而且組織層次復(fù)雜。在模型驅(qū)動的體系結(jié)構(gòu)中,新型編譯器的應(yīng)用越來越廣泛。
面對這種新的應(yīng)用場景,傳統(tǒng)編譯技術(shù)顯的力不從心,尤其在編譯器后端實(shí)現(xiàn)從中間表示到目標(biāo)語言映射時暴露出效率低、代碼可維護(hù)性差等缺點(diǎn)。提出了一種基于表驅(qū)動的代碼自動生成技術(shù),它高效地實(shí)現(xiàn)了從編譯器中間表示到目標(biāo)語言的映射,降低程序間的耦合,并且具有較好的通用性和可維護(hù)性等優(yōu)點(diǎn)。
編譯器是一個復(fù)雜系統(tǒng),按照其工作的不同性質(zhì)將其分為前端和后端,之間通過中間表示IR聯(lián)系起來。前端依賴于源語言;后端的輸入取決于中間表示,與源語言無關(guān),輸出依賴于目標(biāo)語言,主要包括優(yōu)化階段和目標(biāo)代碼生成階段。
設(shè)計(jì)了一種編譯器,以一種建模語言文件為輸入[2],經(jīng)過編譯器前端生成中間表示,最終由后端生成C++框架代碼。著重研究該編譯器的后端,即采用何種方式生成目標(biāo)代碼。
通用代碼自動生成技術(shù)是對代碼自動生成技術(shù)普遍遵守的特性進(jìn)行的歸納和總結(jié)[3-5]。該技術(shù)主要由三部分組成:模板、輸入數(shù)據(jù)、代碼生成器。下面就使用這種技術(shù)設(shè)計(jì)一款存在于編譯器后端的代碼自動生成系統(tǒng)。
(1)模板
代碼生成系統(tǒng)中的模板定義了通用程序流程框架,體現(xiàn)了此類程序的同構(gòu)性。模板代碼中將共性部分一次性寫成,異性部分通過每次代碼替換生成,這種共性和異性的合體稱之為模板。
(2)輸入數(shù)據(jù)
代碼自動生成系統(tǒng)中輸入數(shù)據(jù)就是中間表示IR。在代碼自動生成過程中,需要對中間表示進(jìn)行不斷掃描,提取出相應(yīng)信息生成特殊代碼段,用于對模板中標(biāo)簽的替換。
(3)代碼生成器
代碼生成器是代碼自動生成系統(tǒng)的引擎,模板和輸入數(shù)據(jù)等資源由它統(tǒng)一調(diào)配,是代碼生成系統(tǒng)的核心。通用代碼生成器的流程如圖1所示。
圖1 代碼生成器流程圖
代碼生成器啟動后,首先根據(jù)輸入信息加載模板文件,加載的模板文件可能只是庫中的一部分。然后遍歷相匹配的模板子庫,對模板文件進(jìn)行處理,處理流程如圖2所示。
圖2 模板處理流程
模板代碼主要由靜態(tài)代碼和動態(tài)代碼組成。靜態(tài)代碼是模板程序中的不變部分,在進(jìn)行模板操作時直接輸出,不做修改;動態(tài)代碼是模板程序中的可變部分,在代碼產(chǎn)生過程中,要完成相應(yīng)標(biāo)簽的替換,才能形成最終的目標(biāo)代碼[6]。模板處理實(shí)際是對模板文件的分析過程,針對不同內(nèi)容進(jìn)行分類處理。其中,標(biāo)簽代碼生成部分是復(fù)雜的邏輯處理過程,需要結(jié)合IR中的信息和標(biāo)簽特征信息,生成特殊代碼段。當(dāng)模板文件與標(biāo)簽之間的組合關(guān)系增多時,邏輯處理程序?qū)l(fā)復(fù)雜。
通用代碼自動生成技術(shù)能夠滿足后端代碼生成系統(tǒng)的功能要求,但仍存在一定的設(shè)計(jì)缺點(diǎn),主要表現(xiàn)在以下三個方面:
(1)文件操作頻繁,降低系統(tǒng)運(yùn)行效率。
通用代碼生成器對模板文件逐個進(jìn)行掃描和分析,完成代碼替換后進(jìn)行輸出。內(nèi)存和外存數(shù)據(jù)交換次數(shù)多,文件操作頻繁。
(2)邏輯處理復(fù)雜,條件判斷過多,降低代碼可維護(hù)性和執(zhí)行效率。
通用代碼生成器流程在進(jìn)行標(biāo)簽代碼生成時,存在大量的判斷語句。當(dāng)前系統(tǒng)中存在15種公共標(biāo)簽、54種特殊標(biāo)簽和153個模板文件,針對“每個模板文件中含有何種標(biāo)簽,每種標(biāo)簽做何種處理?”這個問題,即使對這些模板和標(biāo)簽進(jìn)行恰當(dāng)分類,程序中條件判斷的次數(shù)也會非常多,帶來復(fù)雜的邏輯處理過程,不便代碼維護(hù),容易引入錯誤。
(3)信息處理分散,影響功能模塊化;代碼耦合程度高,給后期的修改和擴(kuò)展功能帶來困難。
針對普通代碼自動生成存在的缺陷,提出基于表驅(qū)動的代碼自動生成技術(shù)。表驅(qū)動的方法是將各類信息歸類到一張表中,當(dāng)需要特定信息時,可以直接從表中進(jìn)行查找,而不用過多的邏輯判斷語句就能獲得對應(yīng)結(jié)果。當(dāng)判斷邏輯比較簡單時,采用邏輯判斷語句會更加明了,但隨著判斷邏輯的復(fù)雜化,表驅(qū)動的優(yōu)勢就越來越明顯[7]。基于表驅(qū)動的代碼生成器工作流程如圖3所示。
圖3 基于表驅(qū)動代碼生成器流程
在表驅(qū)動代碼生成器中,驅(qū)動表處于核心地位,它以XML文件的方式存儲在本地。在代碼生成器啟動時,加載驅(qū)動表配置文件到內(nèi)存中,形成內(nèi)存中的“驅(qū)動表”。它的單個表項(xiàng)如表1所示,包含模板的各類信息,需要提取信息時,可以查找表獲取,既免去大量的邏輯判斷,又可以使功能模塊更加清晰、處理更加集中。
表1 驅(qū)動表中單個表項(xiàng)
單個表項(xiàng)中信息分為四項(xiàng):①模板文件名;②模板類型,用于區(qū)分不同的子庫;③文件屬性,用于區(qū)分該文件是頭文件或源文件,兩種文件最終的輸出目錄不同;④標(biāo)簽信息,是驅(qū)動表中的核心屬性,顯示當(dāng)前模板文件包含的所有標(biāo)簽信息。
驅(qū)動表中的標(biāo)簽信息借鑒了PSW(Program StatusWord程序狀態(tài)字)[8]的思想,它是一個立即數(shù),以每一位的狀態(tài)來區(qū)分各類標(biāo)簽信息,如圖4所示。
不同的“位”代表不同的標(biāo)簽,在某一位中1代表此模板文件含有這個標(biāo)簽,0則反之。例如表1中的標(biāo)簽SET_ATTRIBUTE值為0x10,GET_ATTRIBUTE值為0x20,通過“與”操作,驅(qū)動表中標(biāo)簽信息屬性相應(yīng)的二進(jìn)制位被置為“1”,即該模板文件中含有上述兩個標(biāo)簽。
圖4 標(biāo)簽信息PSW
基于表驅(qū)動的代碼生成技術(shù)解決了通用代碼生成技術(shù)存在的問題,優(yōu)化主要體現(xiàn)在以下三大方面:
(1)文件操作處理集中,減少文件操作頻率。
通過查詢驅(qū)動表,將類型相符的子模板庫全部加載到內(nèi)存緩沖區(qū),在內(nèi)存中完成字符串替換工作,最后統(tǒng)一進(jìn)行目標(biāo)文件輸出,這樣文件操作頻率將大大降低。
(2)以驅(qū)動表為中心,借助函數(shù)路由機(jī)制,完成動態(tài)代碼生成。
驅(qū)動表包含了模板信息、標(biāo)簽信息、以及兩者之間的對應(yīng)關(guān)系等信息,因此不需要進(jìn)行復(fù)雜的邏輯判斷,只要通過查表就可獲得所需信息。函數(shù)路由器根據(jù)標(biāo)簽PSW位信息,調(diào)用對應(yīng)的處理函數(shù)來生成動態(tài)代碼。
(3)使用驅(qū)動表配置文件,實(shí)現(xiàn)代碼的松耦合。
驅(qū)動表以xml文件的方式存儲在本地。只需修改配置文件中的相關(guān)項(xiàng),即可完成增加標(biāo)簽信息、修改模板文件及標(biāo)簽對應(yīng)關(guān)系等操作,代碼幾乎不用變動。
為對比上述兩種代碼生成技術(shù)的生成效率,使用兩種代碼生成技術(shù)進(jìn)行代碼自動生成實(shí)驗(yàn)。
表2中,列舉了5個測例,使用兩種代碼生成技術(shù)生成相同行數(shù)的目標(biāo)代碼,對所消耗的時間進(jìn)行對比。
表2 代碼生成耗時統(tǒng)計(jì)
圖5是兩種技術(shù)生成每萬行代碼所消耗時間的趨勢圖??梢钥吹?,表驅(qū)動代碼生成技術(shù)所消耗的平均時間約為通用代碼生成技術(shù)的1/2。而效率方面的提高,僅僅是表驅(qū)動代碼生成技術(shù)諸多優(yōu)勢中的一個方面。
圖5 每萬行代碼花費(fèi)時間
表驅(qū)動的代碼生成技術(shù)可以應(yīng)用在編譯器后端,從而實(shí)現(xiàn)目標(biāo)代碼的自動生成。尤其當(dāng)目標(biāo)代碼數(shù)量大、結(jié)構(gòu)復(fù)雜時,表驅(qū)動代碼生成技術(shù)的優(yōu)勢將會更加明顯,它與一般的代碼生成技術(shù)之間的對比如表3所示。
通過分析可得,表驅(qū)動的代碼生成技術(shù)不僅提高了生成效率,并且降低了代碼耦合度、邏輯復(fù)雜度,實(shí)現(xiàn)了數(shù)據(jù)與控制相分離,使系統(tǒng)具有良好的可維護(hù)性和擴(kuò)展性。
表3 兩種生成技術(shù)對比
[1] Cooper,K.D.編譯器工程[M].北京:機(jī)械工業(yè)出版社,2006.
Cooper,K.D.Engineer a Compliler[M].Beijing:China Machine Press,2006.
[2] 林卓,吳健,萬豪,等.分布式仿真環(huán)境下虛擬試驗(yàn)對象建模技術(shù)研究及應(yīng)用[J].計(jì)算機(jī)測量與控制,2012(11):3011-3013.
Lin Zhuo,Wu Jian,Wan Hao.In the environment of Distributed simulation the research and apply on virtual testmodeling technology[J].Computer Measurement&Control,2012(11):3011-3013.
[3] 陳翔,王學(xué)斌,吳泉源.代碼生成技術(shù)在MDA中的實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用研究,2006(1):147-150.
Cheng Xiang,Wang Xuebin,Wu Quanyuan.Code Generating Implementation in Model Driven Architecture[J].Application Research of Computers,2006(1):147-150.
[4] 趙躍華.基于敏捷方式的Java代碼生成方法的設(shè)計(jì)[J].計(jì)算機(jī)工程與設(shè)計(jì),2009(12):3018-3021.
Zhao Yuehua.Design of Java code generation on agile[J].Computer Engineering and Design,2009(12):3018-3021.
[5] 魏馳,吳健,宋銀,等.虛擬試驗(yàn)對象框架代碼自動生成技術(shù)的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)測量與控制,2012(10):2745-2748.
Wei Chi,Wu Jian,Song Yin,et al.Study and Implementation of automatic code generation technology for virtual test object framework[J].Computer Measurement&Control,2012(10):2745-2748.
[6] Ivo Damyanov,N.H.Metadata Driven Code Generation Using.NET Framework[J].International Conference on Computer Systems and Technologies-CompSysTech,2004.
[7] McConnell.Code Complete[M].Beijing:Univer-sity of Electronic Science and Technology of China,2006.
[8] 周荷琴,吳秀清.微型計(jì)算機(jī)原理與接口技術(shù)(第4版)[M].合肥:中國科學(xué)技術(shù)大學(xué)出版社,2008.
Zhou Heqin,Wu Xiuqing.Microcomputer Princi-ple and Interface Technology(Fourth)[M].Hefei:Press of University of Science and Technology of China,2008.
Application of Table-driven Code Generation Technology in the Com piler
Lin Zhuo,Qi Xiaobin,Wei Jin
(Xi’an Aeronautics Computing Technique Research Institute,AVIC,Xi’an 710119,China)
For new background of MDA(Model Driven Architecture)field,combined with compiler technology,the code automatically generated technology based on table-driven is presented,which is used in the back-end compiler to automatically generate the intermediate code to the target code,especially when the code possesses large number or the structure is complex,its advantage will bemore apparent.The experimental verification shows that the technology not only has the advantage of universal code generation technology,but also improves the generated efficiency and reduces the coupling of the code and logic control complexity.In data-centered,data and control are separated to keep the good maintainability and scalability for the system.
Table-driven;Code automatically generated;Compiler
10.3969/j.issn.1002-2279.2015.03.015
TP301
A
1002-2279(2015)03-0050-04
十二五核高基課題(2012ZX01041-002-003)
林卓(1987-),男,陜西西安人,助理工程師,碩士研究生,主研方向:從事計(jì)算機(jī)軟件與理論方面研究。
2014-11-13