林 卓,齊曉斌,衛(wèi) 進
(中航工業(yè)西安航空計算技術研究所,西安710119)
表驅(qū)動代碼生成技術在編譯器中的應用?
林 卓,齊曉斌,衛(wèi) 進
(中航工業(yè)西安航空計算技術研究所,西安710119)
針對MDA(模型驅(qū)動架構)領域的新背景,結合編譯器技術,提出了一種基于表驅(qū)動的代碼自動生成技術。該技術應用在編譯器后端,實現(xiàn)中間代碼到目標代碼的生成,尤其當目標代碼數(shù)量大、結構復雜時,該技術的優(yōu)勢將會更加明顯。經(jīng)過實驗驗證,表驅(qū)動代碼生成技術在具有通用代碼生成技術優(yōu)勢的同時,不僅提高了生成效率,而且降低了代碼的耦合度和邏輯控制復雜度。以數(shù)據(jù)為中心,實現(xiàn)了數(shù)據(jù)與控制相分離,使整個系統(tǒng)具有良好的可維護性和擴展性。
表驅(qū)動;代碼自動生成;編譯器
編譯器主要實現(xiàn)翻譯功能,以一種程序語言作為輸入,以另一種等價的程序作為輸出[1],輸出的程序可以是匯編語言也可以是其他高級語言。傳統(tǒng)的編譯器一般以匯編語言作為輸出,而某些新型編譯器則使用其他成熟的程序語言作為目標語言,這種編譯器的輸入一般比較簡單,甚至只是單一的模型描述文件,而生成的目標代碼則是功能強大的框架代碼程序,不僅文件數(shù)量大,而且組織層次復雜。在模型驅(qū)動的體系結構中,新型編譯器的應用越來越廣泛。
面對這種新的應用場景,傳統(tǒng)編譯技術顯的力不從心,尤其在編譯器后端實現(xiàn)從中間表示到目標語言映射時暴露出效率低、代碼可維護性差等缺點。提出了一種基于表驅(qū)動的代碼自動生成技術,它高效地實現(xiàn)了從編譯器中間表示到目標語言的映射,降低程序間的耦合,并且具有較好的通用性和可維護性等優(yōu)點。
編譯器是一個復雜系統(tǒng),按照其工作的不同性質(zhì)將其分為前端和后端,之間通過中間表示IR聯(lián)系起來。前端依賴于源語言;后端的輸入取決于中間表示,與源語言無關,輸出依賴于目標語言,主要包括優(yōu)化階段和目標代碼生成階段。
設計了一種編譯器,以一種建模語言文件為輸入[2],經(jīng)過編譯器前端生成中間表示,最終由后端生成C++框架代碼。著重研究該編譯器的后端,即采用何種方式生成目標代碼。
通用代碼自動生成技術是對代碼自動生成技術普遍遵守的特性進行的歸納和總結[3-5]。該技術主要由三部分組成:模板、輸入數(shù)據(jù)、代碼生成器。下面就使用這種技術設計一款存在于編譯器后端的代碼自動生成系統(tǒng)。
(1)模板
代碼生成系統(tǒng)中的模板定義了通用程序流程框架,體現(xiàn)了此類程序的同構性。模板代碼中將共性部分一次性寫成,異性部分通過每次代碼替換生成,這種共性和異性的合體稱之為模板。
(2)輸入數(shù)據(jù)
代碼自動生成系統(tǒng)中輸入數(shù)據(jù)就是中間表示IR。在代碼自動生成過程中,需要對中間表示進行不斷掃描,提取出相應信息生成特殊代碼段,用于對模板中標簽的替換。
(3)代碼生成器
代碼生成器是代碼自動生成系統(tǒng)的引擎,模板和輸入數(shù)據(jù)等資源由它統(tǒng)一調(diào)配,是代碼生成系統(tǒng)的核心。通用代碼生成器的流程如圖1所示。
圖1 代碼生成器流程圖
代碼生成器啟動后,首先根據(jù)輸入信息加載模板文件,加載的模板文件可能只是庫中的一部分。然后遍歷相匹配的模板子庫,對模板文件進行處理,處理流程如圖2所示。
圖2 模板處理流程
模板代碼主要由靜態(tài)代碼和動態(tài)代碼組成。靜態(tài)代碼是模板程序中的不變部分,在進行模板操作時直接輸出,不做修改;動態(tài)代碼是模板程序中的可變部分,在代碼產(chǎn)生過程中,要完成相應標簽的替換,才能形成最終的目標代碼[6]。模板處理實際是對模板文件的分析過程,針對不同內(nèi)容進行分類處理。其中,標簽代碼生成部分是復雜的邏輯處理過程,需要結合IR中的信息和標簽特征信息,生成特殊代碼段。當模板文件與標簽之間的組合關系增多時,邏輯處理程序?qū)l(fā)復雜。
通用代碼自動生成技術能夠滿足后端代碼生成系統(tǒng)的功能要求,但仍存在一定的設計缺點,主要表現(xiàn)在以下三個方面:
(1)文件操作頻繁,降低系統(tǒng)運行效率。
通用代碼生成器對模板文件逐個進行掃描和分析,完成代碼替換后進行輸出。內(nèi)存和外存數(shù)據(jù)交換次數(shù)多,文件操作頻繁。
(2)邏輯處理復雜,條件判斷過多,降低代碼可維護性和執(zhí)行效率。
通用代碼生成器流程在進行標簽代碼生成時,存在大量的判斷語句。當前系統(tǒng)中存在15種公共標簽、54種特殊標簽和153個模板文件,針對“每個模板文件中含有何種標簽,每種標簽做何種處理?”這個問題,即使對這些模板和標簽進行恰當分類,程序中條件判斷的次數(shù)也會非常多,帶來復雜的邏輯處理過程,不便代碼維護,容易引入錯誤。
(3)信息處理分散,影響功能模塊化;代碼耦合程度高,給后期的修改和擴展功能帶來困難。
針對普通代碼自動生成存在的缺陷,提出基于表驅(qū)動的代碼自動生成技術。表驅(qū)動的方法是將各類信息歸類到一張表中,當需要特定信息時,可以直接從表中進行查找,而不用過多的邏輯判斷語句就能獲得對應結果。當判斷邏輯比較簡單時,采用邏輯判斷語句會更加明了,但隨著判斷邏輯的復雜化,表驅(qū)動的優(yōu)勢就越來越明顯[7]?;诒眚?qū)動的代碼生成器工作流程如圖3所示。
圖3 基于表驅(qū)動代碼生成器流程
在表驅(qū)動代碼生成器中,驅(qū)動表處于核心地位,它以XML文件的方式存儲在本地。在代碼生成器啟動時,加載驅(qū)動表配置文件到內(nèi)存中,形成內(nèi)存中的“驅(qū)動表”。它的單個表項如表1所示,包含模板的各類信息,需要提取信息時,可以查找表獲取,既免去大量的邏輯判斷,又可以使功能模塊更加清晰、處理更加集中。
表1 驅(qū)動表中單個表項
單個表項中信息分為四項:①模板文件名;②模板類型,用于區(qū)分不同的子庫;③文件屬性,用于區(qū)分該文件是頭文件或源文件,兩種文件最終的輸出目錄不同;④標簽信息,是驅(qū)動表中的核心屬性,顯示當前模板文件包含的所有標簽信息。
驅(qū)動表中的標簽信息借鑒了PSW(Program StatusWord程序狀態(tài)字)[8]的思想,它是一個立即數(shù),以每一位的狀態(tài)來區(qū)分各類標簽信息,如圖4所示。
不同的“位”代表不同的標簽,在某一位中1代表此模板文件含有這個標簽,0則反之。例如表1中的標簽SET_ATTRIBUTE值為0x10,GET_ATTRIBUTE值為0x20,通過“與”操作,驅(qū)動表中標簽信息屬性相應的二進制位被置為“1”,即該模板文件中含有上述兩個標簽。
圖4 標簽信息PSW
基于表驅(qū)動的代碼生成技術解決了通用代碼生成技術存在的問題,優(yōu)化主要體現(xiàn)在以下三大方面:
(1)文件操作處理集中,減少文件操作頻率。
通過查詢驅(qū)動表,將類型相符的子模板庫全部加載到內(nèi)存緩沖區(qū),在內(nèi)存中完成字符串替換工作,最后統(tǒng)一進行目標文件輸出,這樣文件操作頻率將大大降低。
(2)以驅(qū)動表為中心,借助函數(shù)路由機制,完成動態(tài)代碼生成。
驅(qū)動表包含了模板信息、標簽信息、以及兩者之間的對應關系等信息,因此不需要進行復雜的邏輯判斷,只要通過查表就可獲得所需信息。函數(shù)路由器根據(jù)標簽PSW位信息,調(diào)用對應的處理函數(shù)來生成動態(tài)代碼。
(3)使用驅(qū)動表配置文件,實現(xiàn)代碼的松耦合。
驅(qū)動表以xml文件的方式存儲在本地。只需修改配置文件中的相關項,即可完成增加標簽信息、修改模板文件及標簽對應關系等操作,代碼幾乎不用變動。
為對比上述兩種代碼生成技術的生成效率,使用兩種代碼生成技術進行代碼自動生成實驗。
表2中,列舉了5個測例,使用兩種代碼生成技術生成相同行數(shù)的目標代碼,對所消耗的時間進行對比。
表2 代碼生成耗時統(tǒng)計
圖5是兩種技術生成每萬行代碼所消耗時間的趨勢圖??梢钥吹剑眚?qū)動代碼生成技術所消耗的平均時間約為通用代碼生成技術的1/2。而效率方面的提高,僅僅是表驅(qū)動代碼生成技術諸多優(yōu)勢中的一個方面。
圖5 每萬行代碼花費時間
表驅(qū)動的代碼生成技術可以應用在編譯器后端,從而實現(xiàn)目標代碼的自動生成。尤其當目標代碼數(shù)量大、結構復雜時,表驅(qū)動代碼生成技術的優(yōu)勢將會更加明顯,它與一般的代碼生成技術之間的對比如表3所示。
通過分析可得,表驅(qū)動的代碼生成技術不僅提高了生成效率,并且降低了代碼耦合度、邏輯復雜度,實現(xiàn)了數(shù)據(jù)與控制相分離,使系統(tǒng)具有良好的可維護性和擴展性。
表3 兩種生成技術對比
[1] Cooper,K.D.編譯器工程[M].北京:機械工業(yè)出版社,2006.
Cooper,K.D.Engineer a Compliler[M].Beijing:China Machine Press,2006.
[2] 林卓,吳健,萬豪,等.分布式仿真環(huán)境下虛擬試驗對象建模技術研究及應用[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] 陳翔,王學斌,吳泉源.代碼生成技術在MDA中的實現(xiàn)[J].計算機應用研究,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代碼生成方法的設計[J].計算機工程與設計,2009(12):3018-3021.
Zhao Yuehua.Design of Java code generation on agile[J].Computer Engineering and Design,2009(12):3018-3021.
[5] 魏馳,吳健,宋銀,等.虛擬試驗對象框架代碼自動生成技術的研究與實現(xiàn)[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] 周荷琴,吳秀清.微型計算機原理與接口技術(第4版)[M].合肥:中國科學技術大學出版社,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-),男,陜西西安人,助理工程師,碩士研究生,主研方向:從事計算機軟件與理論方面研究。
2014-11-13