湯發(fā)俊,江文,柴曉前
(1,2無錫商業(yè)職業(yè)技術(shù)學(xué)院,江蘇無錫214063;3華為技術(shù)有限公司,廣東深州518129)
開放編譯器OpenC++工作原理及對其局限的改進
湯發(fā)俊,江文,柴曉前
(1,2無錫商業(yè)職業(yè)技術(shù)學(xué)院,江蘇無錫214063;3華為技術(shù)有限公司,廣東深州518129)
本文詳細(xì)分析了OpenC++工作原理和OpenC++MOP,并在研究實踐的基礎(chǔ)上指出了OpenC++的局限,最后針對這些局限分別提出了改進的方法,給出了改進后的OpenC++的工作流程。
開放編譯器;工作原理;局限;改進
OpenC++2.5/2.7(以下簡稱OpenC++)是一個典型的開放編譯器,它將元對象協(xié)議(Meta-object Protocol,MOP)[1]引入到C++語言的編譯過程中,是一種面向C++的源代碼轉(zhuǎn)換工具。OpenC++可被用來實現(xiàn)對C++語言的各種擴充,如添加新的文法、新的符號、新的對象行為等[2]。所謂開放編譯,就是指通過元對象協(xié)議將編譯過程向用戶開放,用戶可以通過元對象協(xié)議提供的接口,干預(yù)編譯過程。
OpenC++的擴展特征由元程序(Meta-Level Program)在編譯時指定。元程序由編程人員按照OpenC++MOP編寫。這個接口把編譯器的內(nèi)部結(jié)構(gòu)(經(jīng)過面向?qū)ο蟮某橄螅┏尸F(xiàn)給編程人員。與普通的C++程序一樣,元程序其實也是一個C++程序。為了有所區(qū)別,我們把普通C++程序稱為基級程序(Base-Level Program)。元程序經(jīng)OpenC++編譯器編譯后被(動態(tài)或靜態(tài)地)鏈接到OpenC++編譯器上。鏈接后得到的OpenC++編譯器按照元程序指明的方式對基級程序進行轉(zhuǎn)換或分析。如果沒有給出元程序,OpenC++與普通的C++一樣?;壋绦虮籓penC++根據(jù)元程序轉(zhuǎn)換后,再與運行時支持代碼鏈接(用于提供基級程序使用的類和函數(shù)),最終得到可執(zhí)行程序。參見圖1。
圖1 O penC++概覽
OpenC++是一個用于對C++程序進行分析與轉(zhuǎn)換的工具包。如果使用OpenC++來開發(fā)C++程序的轉(zhuǎn)換器(Translator)和分析器(Analyzer),用戶無需考慮解析器和類型系統(tǒng)這樣的細(xì)節(jié)。OpenC++還可以為許多其他工具的開發(fā)提供支持,例如用戶可以利用OpenC++實現(xiàn)C++程序類層次關(guān)系的源代碼分析器。
OpenC++編譯器的工作過程由三個階段組成:預(yù)處理,從OpenC++到C++的源到源(Source-to-Source)轉(zhuǎn)換,以及標(biāo)準(zhǔn)C++編譯器的編譯和鏈接[3]。OpenC++MOP是在第二階段控制轉(zhuǎn)換的接口,指明OpenC++的擴展特征如何轉(zhuǎn)換成普通的C++代碼,參見圖2。
圖2 O penC++的工作原理
C++預(yù)處理器處理后的基級程序,在OpenC++中被分割成許多代碼片斷。這些代碼片斷由元對象轉(zhuǎn)換后,再重新組合成一個完整的C++程序。最后OpenC++將轉(zhuǎn)換后的C++程序傳遞給標(biāo)準(zhǔn)C++編譯器,比如GNU C++。
在OpenC++中,代碼片斷由Ptree元對象以分析樹的形式表示。雖然元對象與C++中的對象類似,但它們只存在于編譯器中,并且代表著基級程序的元狀態(tài),因此稱它們?yōu)樵獙ο?,而不能簡單的稱為對象。從在系統(tǒng)中所起的作用看,對象用于滿足系統(tǒng)功能性方面的需求,而元對象則用于滿足系統(tǒng)非功能性方面的需求。通過綁定到合適的元對象上,對象可以具備非功能性方面的能力。
OpenC++MOP屬于編譯時MOP的一種[3]。也就是說OpenC++中的元對象不是在運行時按照某種指定的方式去解釋基級程序,而是在編譯時轉(zhuǎn)換基級程序,實現(xiàn)定制行為。因此OpenC++MOP只需在編譯時提供對C++中一些關(guān)鍵特性的控制能力即可。針對對象的每一個基本動作,例如方法調(diào)用、數(shù)據(jù)讀寫、對象創(chuàng)建等,元對象都有對應(yīng)的方法,用于定制對象的這一種行為。
OpenC++MOP之所以要按照編譯時MOP的原則進行設(shè)計,是因為編譯時MOP具有高性能與充分自定制的特點:不會帶來運行時代價;提供了為標(biāo)準(zhǔn)C++語言添加擴展特性的能力。
類似于其他MOP,在OpenC++MOP中也存在元環(huán)[1][4](Meta-Circular)的概念。從本質(zhì)上說,元類和類沒有差別,元類只不過是一個可以實例化出類的類(即元對象對應(yīng)于類)。類與元類的關(guān)系等價于對象與類的關(guān)系。因此,如果程序中包含元類的定義,MOP也會為這些元類構(gòu)建元對象,以用于控制這些元類的編譯過程。這樣就必然會出現(xiàn)“類-元類-元類的元類-……”無限延續(xù)的現(xiàn)象:為了編譯一個類,其元類必須先被編譯;為了編譯這個元類,這個元類的元類必須先被編譯……
在OpenC++中,Metaclass是Class的元類,同時Class子類的元類也必須是Metaclass(Class的子類從Class繼承元類,因此程序員無需顯式的為Class的子類聲明元類)。由于Metaclass是Class的子類,因此Metaclass的元類就是其自身(參見圖3),這樣就解決了元環(huán)的問題。
圖3 實例化關(guān)系
OpenC++主要提供了五種元對象:Ptree元對象、Environment元對象、TypeInfo元對象、Class元對象和Member元對象[4]。這些元對象呈現(xiàn)了在C++中不能訪問的幾個方面。大部分的元對象提供的是內(nèi)省(Introspection)的能力,但也有一些元對象表現(xiàn)了程序行為方面的特征,并使源到源的轉(zhuǎn)換成為可能。
經(jīng)多次研究并實際應(yīng)用后發(fā)現(xiàn),OpenC++對源文件的轉(zhuǎn)換有四個比較大的局限:
(1)OpenC++首先調(diào)用標(biāo)準(zhǔn)C++的預(yù)處理器對源文件進行預(yù)處理,然后對預(yù)處理生成的文件進行分析。標(biāo)準(zhǔn)預(yù)處理器在預(yù)處理時,會導(dǎo)入所有必需的頭文件,不僅包括用戶編寫的頭文件,還包括許多系統(tǒng)頭文件,如stdio.h。因此預(yù)處理生成的文件會比源文件大很多。對這些文件的轉(zhuǎn)換,將耗費非常多的時間與空間,可能會出現(xiàn)耗盡內(nèi)存而無法繼續(xù)的現(xiàn)象。
(2)OpenC++一次只能對一個文件進行轉(zhuǎn)換。當(dāng)目標(biāo)系統(tǒng)包含多個源文件時,就不得不多次調(diào)用OpenC++以實現(xiàn)對預(yù)處理后的所有文件進行轉(zhuǎn)換。
(3)需要用戶為待轉(zhuǎn)換的類編寫元類,并加入加入元類聲明。即使有輔助工具自動完成這一工作,也可能給基極程序的維護人員造成困惑。
(4)OpenC++提供的MOP并不包含對全局函數(shù)的處理接口。
針對以上OpenC++對源文件轉(zhuǎn)換的四個局限,經(jīng)過多次實踐后提出如下方法進行改進:
(1)對于局限1來說,可以通過重新編寫一個支持只導(dǎo)入用戶頭文件的預(yù)處理器來解決。
(2)對于局限2來說,通過添加一個記錄所有頭文件和源文件的列表文件來解決,這個列表文件可由輔助工具根據(jù)make文件或VC工程文件自動生成。
(3)對于局限3來說,由于OpenC++在解析源碼時如果發(fā)現(xiàn)沒有自定義的元類時,它會指派缺省元類Class。所以可以通過修改默認(rèn)元類的缺省實現(xiàn)來實現(xiàn)轉(zhuǎn)換功能。
(4)對于局限4來說,可以在OpenC++對全局函數(shù)進行轉(zhuǎn)換的關(guān)鍵點進行處理實現(xiàn)對全局函數(shù)的處理。改進后的OpenC++的工作流程如圖4所示,其中灰色為改進的部分。
圖4 改進后的O penC++的工作流程
總之,OpenC++是解析和分析C++源代碼的一種軟件工具,它使用一個源對象協(xié)議(MOP)來為語言擴展提供服務(wù)。而在實際使用中需要我們不斷加以改進才能發(fā)揮其最大效用。
[1]ShigeruChiba.AMetaobjectProtocolforC++. Proceedings of ACM Conference on OOPSLA.1995,10.
[2]Shigeru Chiba.A Study of Compile-time Metaobject Protocol.PhD thesis.Graduate School of Science,The University of Tokyo.1996,3.
[3]Shigeru Chiba.OpenC++Tutorial.1998.
[4]Shigeru Chiba.OpenC++2.5 Reference Manual.1999.
TP312
A
1671-5993(2010)04-0057-03
2010-06-22
湯發(fā)?。?977-),男,江蘇建湖人,碩士,無錫商業(yè)職業(yè)技術(shù)學(xué)院講師、工程師。
江文(1979-),女,江蘇連云港人,本科,無錫商業(yè)職業(yè)技術(shù)學(xué)院實驗師。
柴曉前(1976-),男,甘肅靜寧人,碩士,華為技術(shù)有限公司工程師。
滁州職業(yè)技術(shù)學(xué)院學(xué)報2010年4期