国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

開放編譯器OpenC++工作原理及對(duì)其局限的改進(jìn)

2010-09-19 08:46:28湯發(fā)俊江文柴曉前
關(guān)鍵詞:源文件編譯器局限

湯發(fā)俊,江文,柴曉前

(1,2無錫商業(yè)職業(yè)技術(shù)學(xué)院,江蘇無錫214063;3華為技術(shù)有限公司,廣東深州518129)

開放編譯器OpenC++工作原理及對(duì)其局限的改進(jìn)

湯發(fā)俊,江文,柴曉前

(1,2無錫商業(yè)職業(yè)技術(shù)學(xué)院,江蘇無錫214063;3華為技術(shù)有限公司,廣東深州518129)

本文詳細(xì)分析了OpenC++工作原理和OpenC++MOP,并在研究實(shí)踐的基礎(chǔ)上指出了OpenC++的局限,最后針對(duì)這些局限分別提出了改進(jìn)的方法,給出了改進(jìn)后的OpenC++的工作流程。

開放編譯器;工作原理;局限;改進(jìn)

一、O penC++概覽

OpenC++2.5/2.7(以下簡(jiǎn)稱OpenC++)是一個(gè)典型的開放編譯器,它將元對(duì)象協(xié)議(Meta-object Protocol,MOP)[1]引入到C++語言的編譯過程中,是一種面向C++的源代碼轉(zhuǎn)換工具。OpenC++可被用來實(shí)現(xiàn)對(duì)C++語言的各種擴(kuò)充,如添加新的文法、新的符號(hào)、新的對(duì)象行為等[2]。所謂開放編譯,就是指通過元對(duì)象協(xié)議將編譯過程向用戶開放,用戶可以通過元對(duì)象協(xié)議提供的接口,干預(yù)編譯過程。

OpenC++的擴(kuò)展特征由元程序(Meta-Level Program)在編譯時(shí)指定。元程序由編程人員按照OpenC++MOP編寫。這個(gè)接口把編譯器的內(nèi)部結(jié)構(gòu)(經(jīng)過面向?qū)ο蟮某橄螅┏尸F(xiàn)給編程人員。與普通的C++程序一樣,元程序其實(shí)也是一個(gè)C++程序。為了有所區(qū)別,我們把普通C++程序稱為基級(jí)程序(Base-Level Program)。元程序經(jīng)OpenC++編譯器編譯后被(動(dòng)態(tài)或靜態(tài)地)鏈接到OpenC++編譯器上。鏈接后得到的OpenC++編譯器按照元程序指明的方式對(duì)基級(jí)程序進(jìn)行轉(zhuǎn)換或分析。如果沒有給出元程序,OpenC++與普通的C++一樣?;?jí)程序被OpenC++根據(jù)元程序轉(zhuǎn)換后,再與運(yùn)行時(shí)支持代碼鏈接(用于提供基級(jí)程序使用的類和函數(shù)),最終得到可執(zhí)行程序。參見圖1。

圖1 O penC++概覽

OpenC++是一個(gè)用于對(duì)C++程序進(jìn)行分析與轉(zhuǎn)換的工具包。如果使用OpenC++來開發(fā)C++程序的轉(zhuǎn)換器(Translator)和分析器(Analyzer),用戶無需考慮解析器和類型系統(tǒng)這樣的細(xì)節(jié)。OpenC++還可以為許多其他工具的開發(fā)提供支持,例如用戶可以利用OpenC++實(shí)現(xiàn)C++程序類層次關(guān)系的源代碼分析器。

二、O penC++工作原理

OpenC++編譯器的工作過程由三個(gè)階段組成:預(yù)處理,從OpenC++到C++的源到源(Source-to-Source)轉(zhuǎn)換,以及標(biāo)準(zhǔn)C++編譯器的編譯和鏈接[3]。OpenC++MOP是在第二階段控制轉(zhuǎn)換的接口,指明OpenC++的擴(kuò)展特征如何轉(zhuǎn)換成普通的C++代碼,參見圖2。

圖2 O penC++的工作原理

C++預(yù)處理器處理后的基級(jí)程序,在OpenC++中被分割成許多代碼片斷。這些代碼片斷由元對(duì)象轉(zhuǎn)換后,再重新組合成一個(gè)完整的C++程序。最后OpenC++將轉(zhuǎn)換后的C++程序傳遞給標(biāo)準(zhǔn)C++編譯器,比如GNU C++。

在OpenC++中,代碼片斷由Ptree元對(duì)象以分析樹的形式表示。雖然元對(duì)象與C++中的對(duì)象類似,但它們只存在于編譯器中,并且代表著基級(jí)程序的元狀態(tài),因此稱它們?yōu)樵獙?duì)象,而不能簡(jiǎn)單的稱為對(duì)象。從在系統(tǒng)中所起的作用看,對(duì)象用于滿足系統(tǒng)功能性方面的需求,而元對(duì)象則用于滿足系統(tǒng)非功能性方面的需求。通過綁定到合適的元對(duì)象上,對(duì)象可以具備非功能性方面的能力。

三、O penC++M O P分析

OpenC++MOP屬于編譯時(shí)MOP的一種[3]。也就是說OpenC++中的元對(duì)象不是在運(yùn)行時(shí)按照某種指定的方式去解釋基級(jí)程序,而是在編譯時(shí)轉(zhuǎn)換基級(jí)程序,實(shí)現(xiàn)定制行為。因此OpenC++MOP只需在編譯時(shí)提供對(duì)C++中一些關(guān)鍵特性的控制能力即可。針對(duì)對(duì)象的每一個(gè)基本動(dòng)作,例如方法調(diào)用、數(shù)據(jù)讀寫、對(duì)象創(chuàng)建等,元對(duì)象都有對(duì)應(yīng)的方法,用于定制對(duì)象的這一種行為。

OpenC++MOP之所以要按照編譯時(shí)MOP的原則進(jìn)行設(shè)計(jì),是因?yàn)榫幾g時(shí)MOP具有高性能與充分自定制的特點(diǎn):不會(huì)帶來運(yùn)行時(shí)代價(jià);提供了為標(biāo)準(zhǔn)C++語言添加擴(kuò)展特性的能力。

類似于其他MOP,在OpenC++MOP中也存在元環(huán)[1][4](Meta-Circular)的概念。從本質(zhì)上說,元類和類沒有差別,元類只不過是一個(gè)可以實(shí)例化出類的類(即元對(duì)象對(duì)應(yīng)于類)。類與元類的關(guān)系等價(jià)于對(duì)象與類的關(guān)系。因此,如果程序中包含元類的定義,MOP也會(huì)為這些元類構(gòu)建元對(duì)象,以用于控制這些元類的編譯過程。這樣就必然會(huì)出現(xiàn)“類-元類-元類的元類-……”無限延續(xù)的現(xiàn)象:為了編譯一個(gè)類,其元類必須先被編譯;為了編譯這個(gè)元類,這個(gè)元類的元類必須先被編譯……

在OpenC++中,Metaclass是Class的元類,同時(shí)Class子類的元類也必須是Metaclass(Class的子類從Class繼承元類,因此程序員無需顯式的為Class的子類聲明元類)。由于Metaclass是Class的子類,因此Metaclass的元類就是其自身(參見圖3),這樣就解決了元環(huán)的問題。

圖3 實(shí)例化關(guān)系

OpenC++主要提供了五種元對(duì)象:Ptree元對(duì)象、Environment元對(duì)象、TypeInfo元對(duì)象、Class元對(duì)象和Member元對(duì)象[4]。這些元對(duì)象呈現(xiàn)了在C++中不能訪問的幾個(gè)方面。大部分的元對(duì)象提供的是內(nèi)?。↖ntrospection)的能力,但也有一些元對(duì)象表現(xiàn)了程序行為方面的特征,并使源到源的轉(zhuǎn)換成為可能。

四、O penC++的局限及改進(jìn)

(一)O penC++的局限

經(jīng)多次研究并實(shí)際應(yīng)用后發(fā)現(xiàn),OpenC++對(duì)源文件的轉(zhuǎn)換有四個(gè)比較大的局限:

(1)OpenC++首先調(diào)用標(biāo)準(zhǔn)C++的預(yù)處理器對(duì)源文件進(jìn)行預(yù)處理,然后對(duì)預(yù)處理生成的文件進(jìn)行分析。標(biāo)準(zhǔn)預(yù)處理器在預(yù)處理時(shí),會(huì)導(dǎo)入所有必需的頭文件,不僅包括用戶編寫的頭文件,還包括許多系統(tǒng)頭文件,如stdio.h。因此預(yù)處理生成的文件會(huì)比源文件大很多。對(duì)這些文件的轉(zhuǎn)換,將耗費(fèi)非常多的時(shí)間與空間,可能會(huì)出現(xiàn)耗盡內(nèi)存而無法繼續(xù)的現(xiàn)象。

(2)OpenC++一次只能對(duì)一個(gè)文件進(jìn)行轉(zhuǎn)換。當(dāng)目標(biāo)系統(tǒng)包含多個(gè)源文件時(shí),就不得不多次調(diào)用OpenC++以實(shí)現(xiàn)對(duì)預(yù)處理后的所有文件進(jìn)行轉(zhuǎn)換。

(3)需要用戶為待轉(zhuǎn)換的類編寫元類,并加入加入元類聲明。即使有輔助工具自動(dòng)完成這一工作,也可能給基極程序的維護(hù)人員造成困惑。

(4)OpenC++提供的MOP并不包含對(duì)全局函數(shù)的處理接口。

(二)O penC++的改進(jìn)

針對(duì)以上OpenC++對(duì)源文件轉(zhuǎn)換的四個(gè)局限,經(jīng)過多次實(shí)踐后提出如下方法進(jìn)行改進(jìn):

(1)對(duì)于局限1來說,可以通過重新編寫一個(gè)支持只導(dǎo)入用戶頭文件的預(yù)處理器來解決。

(2)對(duì)于局限2來說,通過添加一個(gè)記錄所有頭文件和源文件的列表文件來解決,這個(gè)列表文件可由輔助工具根據(jù)make文件或VC工程文件自動(dòng)生成。

(3)對(duì)于局限3來說,由于OpenC++在解析源碼時(shí)如果發(fā)現(xiàn)沒有自定義的元類時(shí),它會(huì)指派缺省元類Class。所以可以通過修改默認(rèn)元類的缺省實(shí)現(xiàn)來實(shí)現(xiàn)轉(zhuǎn)換功能。

(4)對(duì)于局限4來說,可以在OpenC++對(duì)全局函數(shù)進(jìn)行轉(zhuǎn)換的關(guān)鍵點(diǎn)進(jìn)行處理實(shí)現(xiàn)對(duì)全局函數(shù)的處理。改進(jìn)后的OpenC++的工作流程如圖4所示,其中灰色為改進(jìn)的部分。

圖4 改進(jìn)后的O penC++的工作流程

總之,OpenC++是解析和分析C++源代碼的一種軟件工具,它使用一個(gè)源對(duì)象協(xié)議(MOP)來為語言擴(kuò)展提供服務(wù)。而在實(shí)際使用中需要我們不斷加以改進(jìn)才能發(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é)院實(shí)驗(yàn)師。

柴曉前(1976-),男,甘肅靜寧人,碩士,華為技術(shù)有限公司工程師。

猜你喜歡
源文件編譯器局限
畫與理
基于相異編譯器的安全計(jì)算機(jī)平臺(tái)交叉編譯環(huán)境設(shè)計(jì)
網(wǎng)絡(luò)社區(qū)劃分在軟件質(zhì)量問題分析中的應(yīng)用
基于源文件可疑度的軟件缺陷定位方法研究
LKJ基礎(chǔ)數(shù)據(jù)源文件自動(dòng)編制系統(tǒng)的研究
不受身材局限的美服
Coco薇(2016年2期)2016-03-22 02:22:36
莊一強(qiáng)看醫(yī)改走出行業(yè)小局限
圖畫的局限
通用NC代碼編譯器的設(shè)計(jì)與實(shí)現(xiàn)
誤寫C源文件擴(kuò)展名為CPP的危害
长沙县| 清水县| 尤溪县| 格尔木市| 邢台市| 青冈县| 章丘市| 南召县| 柳林县| 堆龙德庆县| 穆棱市| 台南县| 汝阳县| 洛扎县| 古田县| 宜良县| 安图县| 慈利县| 威信县| 军事| 临江市| 永泰县| 宁津县| 沂源县| 南城县| 原阳县| 慈溪市| 漳平市| 鹤壁市| 永清县| 聂荣县| 安阳市| 西宁市| 上蔡县| 盐边县| 手游| 吉林市| 巴青县| 万源市| 沁水县| 木兰县|