專利名稱:編譯方法以及編譯程序的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及編譯方法以及編譯程序,尤其涉及將以面向?qū)ο笳Z(yǔ)言 描述的至少具有一個(gè)類的輸入程序轉(zhuǎn)換為目標(biāo)程序的編譯方法以及編 譯程序。
背景技術(shù):
近些年,在軟件開發(fā)中程序的規(guī)模逐漸趨向大規(guī)?;榇?,可 維護(hù)性以及再利用性高的面向?qū)ο笳Z(yǔ)言引人矚目。在此,面向?qū)ο笳Z(yǔ) 言是指一種語(yǔ)言,其描述對(duì)象的動(dòng)作,并將對(duì)象的動(dòng)作及該對(duì)象組合 起來(lái)作為程序來(lái)描述。并且,對(duì)象是指數(shù)據(jù)以及操作該數(shù)據(jù)的過程(方 法)被一體化而成的單位。
面向?qū)ο笳Z(yǔ)言例如有"〔++"。 '(++"是在過程性的編程語(yǔ)言"(:"的 基礎(chǔ)上添加了對(duì)面向?qū)ο缶幊痰闹С值木幊陶Z(yǔ)言。并且,"〔++"作為取 代在長(zhǎng)年編程中所廣泛使用的"c"而引起了人們的注意,并且,逐漸從 "(:"移向了"〔++"編程。
不過,雖然'^++"與"<:"相比各種功能得到了強(qiáng)化,但是生成了冗 長(zhǎng)的代碼。因此,提出了各種削減這種冗長(zhǎng)的代碼的技術(shù)(例如,專
利文獻(xiàn)1或?qū)@墨I(xiàn)2)。
在專利文獻(xiàn)i中公開的方法是,刪除有關(guān)對(duì)象沒被生成的類的函數(shù)。
在此,類是指,在面向?qū)ο缶幊讨?,?duì)匯集了數(shù)據(jù)以及作為該數(shù) 據(jù)的操作過程的方法的對(duì)象雛形進(jìn)行定義。通過這種定義,從而可以 將同種的對(duì)象歸結(jié)在一起處理。
8在專利文獻(xiàn)2中公開了不生成不進(jìn)行調(diào)用的方法的函數(shù)定義的方法。
在此,函數(shù)是指,接受被稱為變?cè)臄?shù)據(jù),執(zhí)行規(guī)定的處理,并 回答結(jié)果的一連串的指令群。函數(shù)成為以眾多的編程語(yǔ)言構(gòu)成程序的 要素。
專利文獻(xiàn)l日本特開2005-18425號(hào)公報(bào) 專利文獻(xiàn)2日本特開2006-285584號(hào)公報(bào) 然而,在上述專利文獻(xiàn)l公開的方法中,被限定在不生成對(duì)象的 類,而在生成對(duì)象的類中的冗長(zhǎng)函數(shù)就不能被刪除。并且,在上述專 利文獻(xiàn)2公開的方法中,被限定在不進(jìn)行調(diào)用的方法,而對(duì)于進(jìn)行調(diào) 用并存在冗長(zhǎng)的函數(shù)定義的情況就不能對(duì)應(yīng)了。
發(fā)明內(nèi)容
本發(fā)明鑒于上述課題,目的在于提供一種編譯方法以及編譯程序, 其可以在不受是否有類對(duì)象(class object)的生成或是否有調(diào)用的影響 下,對(duì)生成的冗長(zhǎng)的函數(shù)進(jìn)行刪除。
為了解決上述的課題,本發(fā)明所涉及的編譯方法,將以面向?qū)ο?語(yǔ)言描述的,且至少具有一個(gè)類的輸入程序轉(zhuǎn)換為目標(biāo)程序,其中包 括虛擬繼承解析步驟,解析所述輸入程序中的所述類是否以虛擬繼 承被定義;特殊函數(shù)共通化步驟,在所述虛擬繼承解析步驟的解析結(jié) 果為,所述類沒有以虛擬繼承被定義的情況下,生成將所述類的多個(gè)
構(gòu)造函數(shù)以及多個(gè)析構(gòu)函數(shù)的至少一方共通化的代碼;以及生成步驟,
生成包含在特殊函數(shù)共通化步驟生成的所述代碼的目標(biāo)程序。
根據(jù)此方法,從而可以在不受是否有類對(duì)象的生成或是否有調(diào)用 的影響下,對(duì)沒有以虛擬繼承定義的類刪除生成的冗長(zhǎng)的函數(shù)(尤其 是構(gòu)造函數(shù)和析構(gòu)函數(shù)),從而提高代碼生成效率。據(jù)此,可以在不受 是否有類對(duì)象的生成或調(diào)用的影響下,實(shí)現(xiàn)能夠刪除被生成的冗長(zhǎng)的 函數(shù)的編譯方法。最好是,在所述虛擬繼承解析步驟,根據(jù)所述輸入程序中所描述 的類定義,解析所述類是否以虛擬繼承被定義了。
根據(jù)此方法,可以針對(duì)程序中被定義的類中的沒有以虛擬程序定 義的類,刪除被生成的冗長(zhǎng)的構(gòu)造函數(shù)和析構(gòu)函數(shù),從而提高代碼生 成效率。
而且,最好是,在所述虛擬繼承解析步驟,根據(jù)語(yǔ)言規(guī)范控制語(yǔ) 句,來(lái)解析所述類是否以虛擬繼承被定義了,所述語(yǔ)言規(guī)范控制語(yǔ)句 是遵從語(yǔ)言規(guī)范在所述輸入程序中被描述的控制語(yǔ)句。
根據(jù)此方法,例如可以通過程序員將按照邦ragma指令的語(yǔ)言規(guī) 范控制語(yǔ)句描述到輸入程序,從而可以不必解析原來(lái)輸入程序中所描 述的類定義,針對(duì)沒有以虛擬繼承定義的類刪除被生成的冗長(zhǎng)的構(gòu)造 函數(shù)和析構(gòu)函數(shù),從而使代碼生成效率提高。
而且,最好是,在所述虛擬繼承解析步驟,根據(jù)語(yǔ)言規(guī)范控制指 令,來(lái)解析所述類是否以虛擬繼承被定義了,所述語(yǔ)言規(guī)范控制指令 是遵從編譯所述輸入程序的編譯系統(tǒng)的語(yǔ)言規(guī)范而被描述的控制指
根據(jù)此方法,例如可以通過程序員提供按照編譯系統(tǒng)的選項(xiàng)的語(yǔ) 言規(guī)范控制指令,從而可以不必解析原來(lái)輸入程序中所描述的類定義, 針對(duì)沒有以虛擬繼承定義的類刪除被生成的冗長(zhǎng)的構(gòu)造函數(shù)和析構(gòu)函 數(shù),從而使代碼生成效率提高。
而且,最好是,在所述特殊函數(shù)共通化步驟,生成將沒有以虛擬 繼承被定義的所述類的多個(gè)構(gòu)造函數(shù)中的完全構(gòu)造函數(shù)和部分構(gòu)造函 數(shù)共通化的代碼,所述完全構(gòu)造函數(shù)是指,在生成構(gòu)成類對(duì)象的完全 類對(duì)象時(shí)被調(diào)用的構(gòu)造函數(shù),而不是在生成部分類對(duì)象時(shí)被調(diào)用的構(gòu) 造函數(shù),所述部分構(gòu)造函數(shù)是指,在生成構(gòu)成類對(duì)象的部分類對(duì)象時(shí) 被調(diào)用的構(gòu)造函數(shù)。在所述特殊函數(shù)共通化步驟,生成將沒有以虛擬 繼承被定義的所述類的多個(gè)析構(gòu)函數(shù)中的完全析構(gòu)函數(shù)和部分析構(gòu)函 數(shù)共通化的代碼,所述完全析構(gòu)函數(shù)是指,在生成構(gòu)成類對(duì)象的完全
10類對(duì)象時(shí)被調(diào)用的析構(gòu)函數(shù),而不是在生成部分類對(duì)象時(shí)被調(diào)用的析 構(gòu)函數(shù),所述部分析構(gòu)函數(shù)是指,在生成構(gòu)成類對(duì)象的部分類對(duì)象時(shí) 被調(diào)用的析構(gòu)函數(shù)。
而且,最好是,在所述特殊函數(shù)共通化步驟,將沒有以虛擬繼承 被定義的所述類的多個(gè)構(gòu)造函數(shù)中的完全構(gòu)造函數(shù)和部分構(gòu)造函數(shù)的 某一方的調(diào)用指令替換為另一方的調(diào)用指令,并通過刪除作為被替換 的調(diào)用指令的構(gòu)造函數(shù)的所述一方的構(gòu)造函數(shù)的代碼,從而生成將所 述類的完全構(gòu)造函數(shù)和部分構(gòu)造函數(shù)共通化的代碼。在所述特殊函數(shù) 共通化歩驟,將沒有以虛擬繼承被定義的所述類的多個(gè)析構(gòu)函數(shù)中的 完全析構(gòu)函數(shù)和部分析構(gòu)函數(shù)的某一方的調(diào)用指令替換為另一方的調(diào) 用指令,并通過刪除作為被替換的調(diào)用指令的析構(gòu)函數(shù)的所述一方的 析構(gòu)函數(shù)的代碼,從而生成將所述類的完全析構(gòu)函數(shù)和部分析構(gòu)函數(shù) 共通化的代碼。
而且,最好是,在所述特殊函數(shù)共通化步驟,刪除沒有以虛擬繼 承被定義的所述類的多個(gè)構(gòu)造函數(shù)中的完全構(gòu)造函數(shù)和部分構(gòu)造函數(shù) 中某一方的代碼,并通過將表示完全構(gòu)造函數(shù)的開頭地址的標(biāo)記和表 示部分構(gòu)造函數(shù)的開頭地址的標(biāo)記配置到?jīng)]有被刪除的另一方代碼的 開頭,從而生成將所述類的完全構(gòu)造函數(shù)和部分構(gòu)造函數(shù)共通化的代 碼。在所述特殊函數(shù)共通化步驟,刪除沒有以虛擬繼承被定義的所述 類的多個(gè)析構(gòu)函數(shù)中的完全析構(gòu)函數(shù)和部分析構(gòu)函數(shù)中某一方的代 碼,并通過將表示完全析構(gòu)函數(shù)的開頭地址的標(biāo)記和表示部分析構(gòu)函 數(shù)的開頭地址的標(biāo)記配置到?jīng)]有被刪除的另一方代碼的開頭,從而生 成將所述類的完全析構(gòu)函數(shù)和部分析構(gòu)函數(shù)共通化的代碼。
根據(jù)此方法,可以刪除被生成的冗長(zhǎng)的函數(shù)的完全構(gòu)造函數(shù)和部 分構(gòu)造函數(shù)的某一方,從而使代碼生成效率提高。
并且,本發(fā)明不僅可以作為具有這些特征性的步驟的編譯方法來(lái) 實(shí)現(xiàn),而且還可以作為將這些編譯方法中所包含的特征性步驟作為單 元的編譯裝置來(lái)實(shí)現(xiàn),而且,還可以作為使計(jì)算機(jī)執(zhí)行該編譯方法中
11所包含的特征性步驟的編譯器(編譯程序)來(lái)實(shí)現(xiàn)。并且,不言而喻,
這些編譯程序還可以通過光盤(Compact Disc-Read OnlyMemory : CD—ROM)等記錄介質(zhì)或互聯(lián)網(wǎng)等傳輸介質(zhì)來(lái)流通。
通過本發(fā)明,可以提供一種編譯方法以及編譯程序,其可以在不受是否有類對(duì)象的生成或是否有調(diào)用的影響下,刪除生成的冗長(zhǎng)的函數(shù)。據(jù)此可以達(dá)到提高代碼生成效率的效果。
圖1是由本發(fā)明的實(shí)施例所涉及的編譯器執(zhí)行的處理內(nèi)容的一個(gè)例子的流程圖。
圖2是在虛擬繼承解析步驟S10執(zhí)行的處理內(nèi)容的第一個(gè)例子的流程圖。
周3是在虛擬繼承解析步驟S10執(zhí)行的處理內(nèi)容的第二個(gè)例子的流程圖。
圖4是在虛擬繼承解析步驟S10執(zhí)行的處理內(nèi)容的第三個(gè)例子的流程圖。
圖5是在特殊函數(shù)共通化步驟Sll執(zhí)行的處理內(nèi)容的第一個(gè)例子的流程圖。
圖6是在特殊函數(shù)共通化步驟Sll執(zhí)行的處理內(nèi)容的第二個(gè)例子的流程圖。
圖7是示出在程序存儲(chǔ)部1存儲(chǔ)的源程序的一個(gè)例子的圖。圖8是示出以以往的方法進(jìn)行編譯的情況下的匯編程序輸出結(jié)果的圖。
圖9是示出以以往的方法進(jìn)行編譯的情況下的匯編程序輸出結(jié)果的圖。
圖10是示出以以往的方法進(jìn)行編譯的情況下的匯編程序輸出結(jié)果的圖。
圖11是示出是否為共通化對(duì)象的共通化對(duì)象判定標(biāo)志的內(nèi)容的示例圖。
圖12是示出以本發(fā)明的方法進(jìn)行編譯的情況下的匯編程序輸出結(jié)果的圖。
圖13是示出以本發(fā)明的方法進(jìn)行編譯的情況下的匯編程序輸出結(jié)果的圖。
圖14是示出以本發(fā)明的方法進(jìn)行編譯的情況下的匯編程序輸出結(jié)果的圖。
圖15是示出以本發(fā)明的方法進(jìn)行編譯的情況下的匯編程序輸出
結(jié)果的圖。
圖16是示出以本發(fā)明的方法進(jìn)行編譯的情況下的匯編程序輸出
結(jié)果的圖。
圖17是示出以本發(fā)明的方法進(jìn)行編譯的情況下的匯編程序輸出
結(jié)果的圖。
符號(hào)說(shuō)明
1程序存儲(chǔ)部
2生成代碼存儲(chǔ)部
具體實(shí)施例方式
以下參照附圖對(duì)本發(fā)明的實(shí)施例所涉及的編譯方法進(jìn)行說(shuō)明。
另外,以下的實(shí)施例僅為本發(fā)明的一個(gè)具體的例子,但本發(fā)明的技術(shù)范圍并非受此所限。
圖1是編譯器執(zhí)行的處理內(nèi)容的一個(gè)例子的流程圖。在此,編譯器是指,將人以編譯語(yǔ)言描述的軟件的設(shè)計(jì)圖(源程序)轉(zhuǎn)換為計(jì)算機(jī)能夠執(zhí)行的形式(對(duì)象代碼)的軟件(編譯程序)。
首先,編譯器執(zhí)行輸入步驟(S1),例如讀取程序存儲(chǔ)部1中所存儲(chǔ)的程序頭文件以及源程序。
之后,編譯器執(zhí)行語(yǔ)法分析步驟(S2),即分析在輸入步驟S1讀取的源程序的語(yǔ)法,并生成符號(hào)表和語(yǔ)法樹。
在此,符號(hào)表是一個(gè)列表,由在分析時(shí)檢測(cè)出的所有標(biāo)識(shí)符和這些標(biāo)識(shí)符在程序中的位置以及屬性構(gòu)成,并且,符號(hào)表也是編譯器判斷標(biāo)識(shí)符的使用方法時(shí)所利用的列表。并且,語(yǔ)法樹是表示編程語(yǔ)言的語(yǔ)法的樹結(jié)構(gòu)。
之后,編譯器根據(jù)生成的語(yǔ)法樹,執(zhí)行生成中間代碼的中間代碼生成步驟(S3)。
之后,編譯器執(zhí)行最佳化步驟(S4),即對(duì)在中間代碼生成步驟
S3生成的中間代碼進(jìn)行各種最佳化。
之后,編譯器執(zhí)行資源分配步驟(S5),即對(duì)在最佳化步驟S4被最佳化了的中間代碼中所包含的所有變數(shù),分配寄存器或存儲(chǔ)器等硬件資源。
之后,執(zhí)行輸出步驟(S6),即將在資源分配步驟S5被進(jìn)行了資源分配的中間代碼轉(zhuǎn)換為對(duì)象代碼,并作為對(duì)象程序輸出到生成代碼存儲(chǔ)部2。在輸出步驟S6輸出的對(duì)象程序被存儲(chǔ)到生成代碼存儲(chǔ)部2。
最佳化步驟S4如圖1所示,包括虛擬繼承解析步驟SIO、特殊函數(shù)共通化步驟Sll、以及其他的最佳化步驟S12。
虛擬繼承解析步驟S10解析中間代碼,并解析在程序中存在的類是否以虛擬繼承被定義。
在此,虛擬繼承是用于,在進(jìn)行從多個(gè)父類中繼承類的性質(zhì)的多重繼承的同時(shí),避開基類的重復(fù)繼承的類繼承方法。例如,有兩個(gè)繼承了某個(gè)類的類,在多重繼承這兩個(gè)類的情況下,繼承兩次最原始的類(基類)。在虛擬繼承中,將繼承了兩次的作為最原始的基類,作為虛擬基本類來(lái)聲明,并通過不區(qū)別虛擬基本類的實(shí)例,從而可以防止繼承的重復(fù)。
在特殊函數(shù)共通化步驟Sll,按照虛擬繼承解析步驟S10的解析結(jié)果,將生成的冗長(zhǎng)的多個(gè)構(gòu)造函數(shù)或多個(gè)析構(gòu)函數(shù)共通化。
在此,構(gòu)造函數(shù)是指,在以面向?qū)ο蟮木幊陶Z(yǔ)言生成新的對(duì)象之
14時(shí)被調(diào)用并進(jìn)行內(nèi)容的初始化等的函數(shù),也稱為構(gòu)造符。并且,析構(gòu)函數(shù)是指,在以面向?qū)ο蟮木幊陶Z(yǔ)言刪除對(duì)象時(shí)被調(diào)用并進(jìn)行后處理等的函數(shù),也稱為析構(gòu)符。
有關(guān)虛擬繼承解析步驟SIO以及特殊函數(shù)共通化步驟Sll的詳細(xì)內(nèi)容待以后敘述。
并且,其他的最佳化步驟S12是一般的最佳化步驟,不是本發(fā)明
的著重點(diǎn),因此省略說(shuō)明。
并且,對(duì)于輸入步驟Sl、語(yǔ)法分析步驟S2、中間代碼生成步驟S3、資源分配步驟S5、對(duì)象輸出步驟S6、以及其他最佳化步驟S12,由于與以往的處理相同,不是本發(fā)明的著重點(diǎn)。因此省略詳細(xì)說(shuō)明。
并且,在本發(fā)明的虛擬繼承解析步驟SIO以及特殊函數(shù)共通化步驟Sll,并非僅限定于中間代碼生成步驟S3和資源分配步驟S5之間的最佳化步驟S4內(nèi),若編譯步驟內(nèi)的區(qū)間為能夠解析并進(jìn)行共通化的狀態(tài),則可以分別在某個(gè)區(qū)間(S1至S6的區(qū)間內(nèi))內(nèi)被執(zhí)行。
以下,對(duì)本發(fā)明的著眼點(diǎn)即虛擬繼承解析步驟SIO以及特殊函數(shù)共通化步驟S11進(jìn)行說(shuō)明。
圖2是在虛擬繼承解析步驟SIO被執(zhí)行的處理內(nèi)容的第一個(gè)例子的流程圖。
在虛擬繼承解析步驟SIO,對(duì)每個(gè)與在輸入步驟Sl被輸入的源程序(輸入程序)相對(duì)應(yīng)的類定義重復(fù)進(jìn)行以下的處理(圖2中的循環(huán)A),即對(duì)在中間代碼生成步驟S3生成的中間代碼內(nèi)所描述的每個(gè)類定義重復(fù)進(jìn)行以下的處理(圖2中的循環(huán)A)。
首先,對(duì)輸入程序確認(rèn)是否存在作為解析對(duì)象的類定義。
在解析對(duì)象(類定義)存在的情況下,中間代碼內(nèi)所描述的類(包含被繼承的類)通過虛擬繼承,來(lái)解析是否進(jìn)行了類定義(S1021)。
在通過虛擬繼承類定義沒有被進(jìn)行的情況下(S1021的"否"的情況),將解析了的該類的所有構(gòu)造函數(shù)或析構(gòu)函數(shù)作為共通化的對(duì)象(S1022)。例如可以以表示作為共通化對(duì)象的共通化判定標(biāo)志等來(lái)控制。
在通過虛擬繼承進(jìn)行了類定義的情況下(S1021的"是"的情況),不將解析了的該類的所有構(gòu)造函數(shù)或析構(gòu)函數(shù)作為共通化的對(duì)象
(S1023)。例如可以以表示不作為共通化對(duì)象的共通化判定標(biāo)志等來(lái)控制。
之后,對(duì)輸入程序確認(rèn)是否存在是解析對(duì)象而未被解析的其他的類定義。在是解析對(duì)象而未被解析的其他的類定義存在的情況下,直到作為解析對(duì)象的類定義不存在為止,重復(fù)進(jìn)行循環(huán)A。在是解析對(duì)象而未被解析的其他的類定義不存在的情況下,循環(huán)A結(jié)束,從而處理也結(jié)束。
如以上所述,在虛擬繼承解析步驟SIO,解析中間代碼,并解析程序中所存在的類是否通過虛擬繼承被定義。
并且,關(guān)于表示是否為共通化對(duì)象的信息的形態(tài),只要在特殊函數(shù)共通化步驟Sll能夠被參考,即可以是中間代碼內(nèi)的數(shù)據(jù),也可以是與類相關(guān)聯(lián)的獨(dú)立的數(shù)據(jù)。
圖3是在虛擬繼承解析步驟SIO執(zhí)行的處理內(nèi)容的第二個(gè)例子的流程圖。
在虛擬繼承解析步驟S10與圖2同樣,對(duì)每個(gè)與輸入程序相對(duì)應(yīng)的類定義重復(fù)進(jìn)行以下的處理(圖3中的循環(huán)B)。
首先,對(duì)輸入程序確認(rèn)是否存在作為解析對(duì)象的類定義。
在解析對(duì)象(類定義)存在的情況下,解析在輸入程序中的描述中的語(yǔ)言規(guī)范,是否通過語(yǔ)言規(guī)范控制語(yǔ)句被控制為不包含虛擬繼承的語(yǔ)言規(guī)范(S1031)。在此,語(yǔ)言規(guī)范控制語(yǔ)句是指,根據(jù)語(yǔ)言規(guī)范在輸入程序中描述的控制語(yǔ)句。例如,通過將用于指示使像邦ragma這樣的語(yǔ)言規(guī)范中的特殊功能有效的控制語(yǔ)句在源程序中描述,從而控制向編譯器直接提供有關(guān)語(yǔ)言規(guī)范的信息。
在通過語(yǔ)言規(guī)范控制語(yǔ)句,被控制為不包含虛擬繼承的語(yǔ)言規(guī)范的情況下(S1031的"否"的情況),將該類中的所有構(gòu)造函數(shù)或析構(gòu)函
16數(shù)作為共通化對(duì)象(S1032)。
在不是這種情況時(shí),即在通過語(yǔ)言規(guī)范控制語(yǔ)句,未被控制為不
包含虛擬繼承的語(yǔ)言規(guī)范的情況下(S1031的"是"的情況),則不將該類中的所有構(gòu)造函數(shù)或析構(gòu)函數(shù)作為共通化對(duì)象(S1(B3)。
之后,對(duì)輸入程序確認(rèn)是否存在是解析對(duì)象而未被解析的其他的類定義。在是解析對(duì)象而未被解析的其他的類定義存在的情況下,直到作為解析對(duì)象的類定義不存在為止,重復(fù)進(jìn)行循環(huán)B。在是解析對(duì)象而未被解析的其他的類定義不存在的情況下,循環(huán)B結(jié)束,從而處理也結(jié)束。
如以上所述,在虛擬繼承解析步驟SIO,解析中間代碼,并解析程序中所存在的類是否通過虛擬繼承被定義。
圖4是在虛擬繼承解析步驟S10執(zhí)行的處理內(nèi)容的第三個(gè)例子的流程圖。
在虛擬繼承解析步驟S10與圖4同樣,對(duì)每個(gè)與輸入程序相對(duì)應(yīng)的類定義重復(fù)進(jìn)行以下的處理(圖4中的循環(huán)C)。
首先,對(duì)輸入程序確認(rèn)是否存在作為解析對(duì)象的類定義。
在解析對(duì)象(類定義)存在的情況下,解析在輸入程序中描述的語(yǔ)言規(guī)范,是否通過語(yǔ)言規(guī)范控制指令,被控制為不包含虛擬繼承的語(yǔ)言規(guī)范(S1041)。在此,語(yǔ)言規(guī)范控制指令是指,根據(jù)編譯輸入程序的編譯系統(tǒng)的語(yǔ)言規(guī)范,而被描述的控制指令。例如,通過將用于指示使像指令行選項(xiàng)這樣的編譯器中的特殊功能有效的指令在源程序中描述,從而控制向編譯系統(tǒng)直接提供有關(guān)語(yǔ)言規(guī)范的信息。
在通過語(yǔ)言規(guī)范控制指令,被控制為不包含虛擬繼承的語(yǔ)言規(guī)范的情況下(S1041的"是"的情況),將該類的所有構(gòu)造函數(shù)或析構(gòu)函數(shù)作為共通化對(duì)象(S1042)。
在不是這種情況時(shí),即在通過語(yǔ)言規(guī)范控制指令,未被控制為不包含虛擬繼承的語(yǔ)言規(guī)范的情況下(S1041的"否"的情況),則不將該類中的所有構(gòu)造函數(shù)或析構(gòu)函數(shù)作為共通化對(duì)象(S1043)。
17之后,對(duì)輸入程序確認(rèn)是否存在是解析對(duì)象而未被解析的其他的類定義。在是解析對(duì)象而未被解析的其他的類定義存在的情況下,直到作為解析對(duì)象的類定義不存在為止,重復(fù)進(jìn)行循環(huán)C。在是解析對(duì)象而未被解析的其他的類定義不存在的情況下,循環(huán)C結(jié)束,從而處理也結(jié)束。
如以上所述,在虛擬繼承解析步驟SIO,解析中間代碼,并解析程序中所存在的類是否通過虛擬繼承被定義。
并且,關(guān)于圖2到圖4說(shuō)明的虛擬繼承解析步驟S10的第一至第三的處理內(nèi)容,例如可以通過附加優(yōu)先度,而作為包含圖2到圖4的所有步驟的一個(gè)虛擬繼承解析步驟10,也可以自由選擇組合。
以下,對(duì)特殊函數(shù)共通化步驟S11進(jìn)行說(shuō)明。
圖5是在特殊函數(shù)共通化步驟Sll執(zhí)行的處理內(nèi)容的第一個(gè)例子的流程圖。
在特殊函數(shù)共通化步驟Sll,按照在虛擬繼承解析步驟S10的解析結(jié)果,進(jìn)行對(duì)在中間代碼生成步驟S3生成的中間代碼內(nèi)所描述的各個(gè)類的構(gòu)造函數(shù)的處理(循環(huán)D),以及對(duì)析構(gòu)函數(shù)的處理(循環(huán)E)。
首先,對(duì)在虛擬繼承解析步驟SIO解析的中間代碼內(nèi)所描述的各個(gè)類,進(jìn)行是否存在構(gòu)造函數(shù)的確認(rèn)。
在構(gòu)造函數(shù)存在的情況下,判斷該構(gòu)造函數(shù)是否為共通化對(duì)象(S1151)。
在該構(gòu)造函數(shù)是共通化對(duì)象的情況下(S1151的"是"的情況),將針對(duì)該構(gòu)造函數(shù)的完全構(gòu)造函數(shù)和部分構(gòu)造函數(shù)的任一方的調(diào)用指令替換為另外一方(S1152)。并且,刪除被替換的一方(完全或部分)的構(gòu)造函數(shù)的代碼(S1153)。
在此,完全構(gòu)造函數(shù)是指,在生成構(gòu)成類對(duì)象的完全類對(duì)象時(shí)被調(diào)用的構(gòu)造函數(shù),而不是在生成構(gòu)成類對(duì)象的部分類對(duì)象時(shí)被調(diào)用的構(gòu)造函數(shù)。并且,部分結(jié)構(gòu)函數(shù)是指,在生成構(gòu)成類對(duì)象的部分類對(duì)象時(shí)被調(diào)用的構(gòu)造函數(shù)。
18之后,對(duì)在虛擬繼承解析步驟SIO解析的中間代碼內(nèi)所描述的各個(gè)類,進(jìn)一步進(jìn)行是否存在構(gòu)造函數(shù)的確認(rèn)。進(jìn)而,在構(gòu)造函數(shù)存在的情況下,對(duì)各個(gè)類的構(gòu)造函數(shù)重復(fù)進(jìn)行循環(huán)D所示的處理內(nèi)容。在構(gòu)造函數(shù)不存在的情況下,循環(huán)D結(jié)束,從而循環(huán)D所示的處理也結(jié)束。
并且,在S1151若該構(gòu)造函數(shù)不是共通化對(duì)象則不進(jìn)行任何處理(S1151的"否"的情況)。并且,結(jié)束循環(huán)D的處理。
接著,對(duì)循環(huán)E所示的析構(gòu)函數(shù)進(jìn)行處理。首先,對(duì)在虛擬繼承解析步驟SIO解析的中間代碼內(nèi)所描述的各個(gè)類,進(jìn)行是否存在析構(gòu)函數(shù)的確認(rèn)。
在析構(gòu)函數(shù)存在的情況下,判斷該析構(gòu)函數(shù)是否為共通化對(duì)象(S1154)。
在該析構(gòu)函數(shù)是共通化對(duì)象的情況下(S1154的"是"的情況),將針對(duì)該析構(gòu)函數(shù)的完全析構(gòu)函數(shù)和部分析構(gòu)函數(shù)的任一方的調(diào)用指令替換為另外一方(S1155)。并且,刪除被替換的一方(完全或部分)的析構(gòu)函數(shù)的代碼(S1156)。
在此,完全析構(gòu)函數(shù)是指,在生成構(gòu)成類對(duì)象的完全類對(duì)象時(shí)被調(diào)用的析構(gòu)函數(shù),而不是在生成構(gòu)成類對(duì)象的部分類對(duì)象時(shí)被調(diào)用的析構(gòu)函數(shù)。并且,部分析構(gòu)函數(shù)是指,在生成構(gòu)成類對(duì)象的部分類對(duì)象時(shí)被調(diào)用的析構(gòu)函數(shù)。
之后,對(duì)在虛擬繼承解析步驟SIO解析的中間代碼內(nèi)所描述的各個(gè)類,進(jìn)一步進(jìn)行是否存在析構(gòu)函數(shù)的確認(rèn)。進(jìn)而,在析構(gòu)函數(shù)存在的情況下,對(duì)各個(gè)類的析構(gòu)函數(shù)重復(fù)進(jìn)行循環(huán)E所示的處理內(nèi)容。在析構(gòu)函數(shù)不存在的情況下,循環(huán)E結(jié)束,從而循環(huán)E所示的處理也結(jié)束。
并且,在S1154若該析構(gòu)函數(shù)不是共通化對(duì)象則不進(jìn)行任何處理(S1154的"否"的情況)。并且,結(jié)束循環(huán)E的處理。
如以上所述,在特殊函數(shù)共通化步驟Sll,按照虛擬繼承解析步驟S10的解析結(jié)果,使被生成的冗長(zhǎng)的多個(gè)構(gòu)造函數(shù)或多個(gè)析構(gòu)函數(shù)共通化。據(jù)此,可以刪除被生成的冗長(zhǎng)的函數(shù)的完全構(gòu)造函數(shù)和部分構(gòu)造函數(shù)的某一方,從而提高代碼生成效率。
圖6是在特殊函數(shù)共通化步驟Sll執(zhí)行的處理內(nèi)容的第二個(gè)例子的流程圖。
與圖5同樣,在特殊函數(shù)共通化步驟Sll,按照在虛擬繼承解析
步驟S10的解析結(jié)果,進(jìn)行對(duì)在中間代碼生成步驟S3生成的中間代碼內(nèi)所描述的各個(gè)類的構(gòu)造函數(shù)的處理(循環(huán)E),以及對(duì)析構(gòu)函數(shù)的處理(循環(huán)G)。
首先,對(duì)在虛擬繼承解析步驟S10解析的中間代碼內(nèi)所描述的各個(gè)類,進(jìn)行是否存在構(gòu)造函數(shù)的確認(rèn)。
在構(gòu)造函數(shù)存在的情況下,判斷該構(gòu)造函數(shù)是否為共通化對(duì)象
(51161) 。
在該構(gòu)造函數(shù)是共通化對(duì)象的情況下(S1161的"是"的情況),將針對(duì)該構(gòu)造函數(shù)的完全構(gòu)造函數(shù)和部分構(gòu)造函數(shù)的任一方的代碼刪除
(51162) 。并且,將表示完全構(gòu)造函數(shù)的開頭地址的標(biāo)記和表示部分構(gòu)造函數(shù)的開頭地址的標(biāo)記配置到另一方代碼的開頭(S1163)。
之后,對(duì)在虛擬繼承解析步驟S10解析的中間代碼內(nèi)所描述的各個(gè)類,進(jìn)一步進(jìn)行是否存在構(gòu)造函數(shù)的確認(rèn)。進(jìn)而,在構(gòu)造函數(shù)存在的情況下,對(duì)各個(gè)類的構(gòu)造函數(shù)重復(fù)進(jìn)行循環(huán)F所示的處理內(nèi)容。在構(gòu)造函數(shù)不存在的情況下,循環(huán)F結(jié)束,從而循環(huán)F所示的處理也結(jié)束。
并且,在S1161若該構(gòu)造函數(shù)不是共通化對(duì)象則不進(jìn)行任何處理(S1161的"否"的情況)。并且,結(jié)束循環(huán)D的處理。
接著,對(duì)循環(huán)G所示的析構(gòu)函數(shù)進(jìn)行處理。首先,對(duì)在虛擬繼承解析步驟S10解析的中間代碼內(nèi)所描述的各個(gè)類,進(jìn)行是否存在析構(gòu)函數(shù)的確認(rèn)。
在析構(gòu)函數(shù)存在的情況下,判斷該析構(gòu)函數(shù)是否為共通化對(duì)象(51164) 。
在該析構(gòu)函數(shù)是共通化對(duì)象的情況下(SI 164的"是"的情況),將針對(duì)該析構(gòu)函數(shù)的完全析構(gòu)函數(shù)和部分析構(gòu)函數(shù)的任一方的代碼刪除
(51165) 。并且,將表示完全析構(gòu)函數(shù)的開頭地址的標(biāo)記和表示部分析構(gòu)函數(shù)的開頭地址的標(biāo)記配置到另一方代碼的開頭(S1165)。
之后,對(duì)在虛擬繼承解析步驟SIO解析的中間代碼內(nèi)所描述的各個(gè)類,進(jìn)一步進(jìn)行是否存在析構(gòu)函數(shù)的確認(rèn)。進(jìn)而,在析構(gòu)函數(shù)存在的情況下,對(duì)各個(gè)類的析構(gòu)函數(shù)重復(fù)進(jìn)行循環(huán)G所示的處理內(nèi)容。在析構(gòu)函數(shù)不存在的情況下,循環(huán)G結(jié)束,從而循環(huán)G所示的處理也結(jié)束。
并且,在SI 164若該析構(gòu)函數(shù)不是共通化對(duì)象則不進(jìn)行任何處理(S1164的"否"的情況)。并且,結(jié)束循環(huán)G的處理。
如以上所述,在特殊函數(shù)共通化步驟Sll,按照虛擬繼承解析步驟SIO的解析結(jié)果,使被生成的冗長(zhǎng)的多個(gè)構(gòu)造函數(shù)或多個(gè)析構(gòu)函數(shù)共通化。據(jù)此,可以刪除被生成的冗長(zhǎng)的函數(shù)的完全構(gòu)造函數(shù)和部分構(gòu)造函數(shù)的某一方,從而提高代碼生成效率。
如以上所述,通過執(zhí)行包括虛擬繼承解析步驟SIO和特殊函數(shù)共通化步驟Sll的最佳化步驟S4,從而可以在不受是否有類對(duì)象的生成或是否有調(diào)用的影響下,對(duì)沒有以虛擬繼承定義的類刪除生成的冗長(zhǎng)的函數(shù)(尤其是構(gòu)造函數(shù)和析構(gòu)函數(shù)),從而提高代碼生成效率。據(jù)此,可以在不受是否有類對(duì)象的生成或調(diào)用的影響下,實(shí)現(xiàn)能夠刪除被生成的冗長(zhǎng)的函數(shù)的編譯方法。(實(shí)施例)
以下以使用€++語(yǔ)言的例子來(lái)對(duì)本發(fā)明的編譯方法進(jìn)行說(shuō)明。圖7示出了程序存儲(chǔ)部1中所存儲(chǔ)的源程序的一個(gè)例子。以下,對(duì)輸入了圖7所示的源程序的情況下的編譯方法進(jìn)行說(shuō)明。在此,前提條件是,<6兄€口?>以〔++模式編譯。
在圖7所示的源文件〈ex,cpp〉中定義了四個(gè)對(duì)X、 Y、 Z、 U)。在
21圖7中,對(duì)于四個(gè)類(X、 Y、 Z、 U)的各個(gè)構(gòu)造函數(shù)定義,分別以(1) (4)示出。同樣,對(duì)于四個(gè)類(X、 Y、 Z、 U)的各個(gè)析構(gòu)函數(shù)定義,分別 以(5) (8)示出。
圖8至圖10示出了以以往的方法進(jìn)行編譯的情況下的匯編輸出結(jié) 果。并且,圖8至圖10示出的是以gcc version 3.3.6 release編譯
器附加了最佳化選項(xiàng)時(shí)的匯編輸出結(jié)果。在此,為了便于說(shuō)明,將以".L" 開始的標(biāo)記除外。
在以往的方法中,如圖8至圖IO所示,各個(gè)類的構(gòu)造函數(shù)定義和 析構(gòu)函數(shù)定義,被分別無(wú)條件地轉(zhuǎn)換為完全構(gòu)造定義以及部分構(gòu)造定 義和完全析構(gòu)函數(shù)定義以及部分析構(gòu)函數(shù)定義的代碼。圖7中所示出 的構(gòu)造函數(shù)以及析構(gòu)函數(shù),和圖8至圖10所示出的完全構(gòu)造函數(shù)以及 部分構(gòu)造函數(shù),和完全析構(gòu)函數(shù)以及部分析構(gòu)函數(shù)的對(duì)應(yīng)關(guān)系如以下 "表1"和"表2"所示。 (表l )
構(gòu)造函數(shù)完全構(gòu)造函數(shù)部分構(gòu)造函數(shù)
(1)X::X()_ZN1XC1Ev一ZNlXC2Ev
(2)Y::Y()一ZN1YC1Ev一ZNlYC2Ev
(3)Z::Z()一ZN1ZC1Ev—ZNlZC2Ev
(4)U::U()_ZN1UC1Ev—ZNlUC2Ev
表2 )
析構(gòu)函數(shù)完全析構(gòu)函數(shù)部分析構(gòu)函數(shù)
(5)X:: X()一ZN1XD1Ev—ZNlXD2Ev
(6)Y:: Y()一ZN1YD1Ev—ZNlYD2Ev
(7)Z:: Z()~~一ZN1ZD1Ev_ZNlZD2Ev
(8)U:: U()~~> _ZN1UD1Ev_ZNlUD2Ev通過圖8至圖10可知,"—ZN1XC1Ev"以及"—ZlXC2Ev"的代碼、 "_ZN1ZC1Ev"以及"—ZNlZC2Ev"的代碼、"—ZN1XD1Ev"以及 "—ZlXD2Ev"的代碼、和ZNlZDlEv"以及"—ZNlZD2Ev"的代碼均是
由完全相同的匯編代碼生成,并且被生成的代碼是冗長(zhǎng)的。
以下,以使用〔++語(yǔ)言的例子,示出本實(shí)施例中的編譯方法。 在中間代碼生成步驟生成的中間代碼在虛擬繼承解析步驟SIO,
按照每個(gè)類定義,由圖2所示的循環(huán)A的處理內(nèi)容來(lái)執(zhí)行。在本實(shí)施
例中,圖7所示的四個(gè)類定義(X、 Y、 Z、 U)成為對(duì)象。
在圖7中,類X由于類定義沒有通過虛擬繼承被執(zhí)行,因此類X
的構(gòu)造函數(shù)"X::X()"以及析構(gòu)函數(shù)"X:: X()"作為共通化對(duì)象被記錄。 圖11示出了表示是否為共通化對(duì)象的共通化對(duì)象判定標(biāo)志的內(nèi)容。
如圖11所示,在類X的構(gòu)造函數(shù)中間代碼以及類X的析構(gòu)函數(shù) 中間代碼的共通化對(duì)象判定標(biāo)志中,記錄"TRUE"。這樣,通過記錄表 示作為共通化對(duì)象的共通化判定標(biāo)志,從而類X的構(gòu)造函數(shù)"X::X()"以 及析構(gòu)函數(shù)"X:: X()"作為共通化對(duì)象被記錄。
并且,在圖7中,由于類Y利用關(guān)鍵字"virtuar從類X通過虛擬 繼承,類定義被執(zhí)行,因此類Y的構(gòu)造函數(shù)"Y::Y()"以及析構(gòu)函數(shù)"Y:: Y()"不作為共通化對(duì)象記錄。
在此,例如圖11所示,通過在類Y的構(gòu)造函數(shù)中間代碼以及類Y 的析構(gòu)函數(shù)中間代碼的共通化對(duì)象判定標(biāo)志中記錄"FALSE",從而記
錄不是共通化對(duì)象。
并且,在圖7中,類Z從類X繼承,由于不是虛擬繼承,并且被 繼承的類X也沒有通過虛擬繼承被執(zhí)行類定義,因此類Z的構(gòu)造函數(shù) "Z::Z()"以及析構(gòu)函數(shù)"Z:: Z()"作為共通化對(duì)象被記錄。
在此,例如圖11所示,通過在類Z的構(gòu)造函數(shù)中間代碼以及類Z 的析構(gòu)函數(shù)中間代碼的共通化對(duì)象判定標(biāo)志中記錄"TRUE",從而記錄 是共通化對(duì)象。
23并且,在圖7中,類U從類Y和類Z繼承,雖然&有進(jìn)行虛擬繼 承,但被繼承的類Y是通過虛擬繼承而被定義的。因此,類U的構(gòu)造 函數(shù)"U::U()"以及析構(gòu)函數(shù)"U:: U()"不作為共通化對(duì)象被記錄。
在此,例如圖11所示,通過在類U的構(gòu)造函數(shù)中間代碼以及類U 的析構(gòu)函數(shù)中間代碼的共通化對(duì)象判定標(biāo)志中記錄"FALSE",從而記 錄不是共通化對(duì)象。
并且,圖ll所示的共通化對(duì)象判定標(biāo)志是表示是否為共通化對(duì)象 的信息的一個(gè)形態(tài),只要能夠在特殊函數(shù)共通化步驟Sll能夠被參考, 即可以是上述例子中的中間代碼內(nèi)的數(shù)據(jù),也可以是與類相關(guān)聯(lián)起來(lái) 的獨(dú)立的數(shù)據(jù)。
接著,按照上述的虛擬繼承解析步驟SIO中的解析結(jié)果,特殊函 數(shù)共通化步驟S11被執(zhí)行。
在圖5的特殊函數(shù)共通化步驟Sll執(zhí)行的處理內(nèi)容的第一個(gè)例子 中,執(zhí)行了循環(huán)D的處理內(nèi)容和循環(huán)E的處理內(nèi)容。在本實(shí)施例中, 在特殊函數(shù)共通化步驟Sll,通過參考圖11所示的共通化判定標(biāo)志, 從而可以根據(jù)虛擬繼承解析步驟SIO的解析結(jié)果,將生成的冗長(zhǎng)的多 個(gè)構(gòu)造函數(shù)或多個(gè)析構(gòu)函數(shù)共通化。根據(jù)圖11,類X以及類Z的構(gòu)造 函數(shù)和析構(gòu)函數(shù)成為共通化對(duì)象。
因此,在完全構(gòu)造函數(shù)和部分構(gòu)造函數(shù)的某一方的調(diào)用指令被替 換為另一方的調(diào)用指令之后,刪除被替換后的構(gòu)造函數(shù)的代碼。
在本實(shí)施例中,將部分構(gòu)造函數(shù)的調(diào)用替換為完全構(gòu)造函數(shù)的調(diào) 用,并刪除部分構(gòu)造函數(shù)(循環(huán)D的處理)。關(guān)于析構(gòu)函數(shù)也進(jìn)行同樣 的處理(循環(huán)E的處理)。進(jìn)行上述處理的結(jié)果在圖12至圖14示出。
圖12至圖14示出了以本發(fā)明的方法進(jìn)行編譯的情況下的匯編輸 出結(jié)果。
圖中的A標(biāo)記以及下線部分所示出的是,被替換的完全構(gòu)造函數(shù) 調(diào)用指令以及完全析構(gòu)函數(shù)調(diào)用指令。
并且,方框內(nèi)的部分是在特殊函數(shù)共通化步驟Sll,被刪除的部
24分構(gòu)造函數(shù)代碼以及部分析構(gòu)函數(shù)代碼。
從圖12至圖14的匯編輸出結(jié)果可知,冗長(zhǎng)的代碼已被刪除。 并且,對(duì)特殊函數(shù)共通化步驟Sll的圖6中的第二個(gè)例子進(jìn)行以
下說(shuō)明。在圖6中的特殊函數(shù)共通化步驟Sll執(zhí)行的處理內(nèi)容的第二 個(gè)例子中,首先,執(zhí)行循環(huán)F的處理內(nèi)容和循環(huán)G的處理內(nèi)容。與圖 5同樣,在本實(shí)施例中,在特殊函數(shù)共通化步驟Sll,通過參考圖ll 所示的共通化判定標(biāo)志,從而可以根據(jù)虛擬繼承解析步驟SIO的解析 結(jié)果,將被生成的冗長(zhǎng)的多個(gè)構(gòu)造函數(shù)或多個(gè)析構(gòu)函數(shù)共通化。根據(jù) 圖11,類X以及類Z的構(gòu)造函數(shù)和析構(gòu)函數(shù)成為共通化對(duì)象。
因此,在刪除完全構(gòu)造函數(shù)和部分構(gòu)造函數(shù)的某一方的代碼后, 將表示完全構(gòu)造函數(shù)的開頭地址的標(biāo)記和表示部分構(gòu)造函數(shù)的開頭地 址的標(biāo)記配置到另一方的代碼的開頭。在本具體例子中,刪除部分構(gòu) 造函數(shù)(循環(huán)F的處理)。關(guān)于析構(gòu)函數(shù)也進(jìn)行同樣的處理(循環(huán)G的 處理)。進(jìn)行了上述處理的結(jié)果在圖15至圖17中示出。
圖15至圖17示出了以本發(fā)明的方法進(jìn)行編譯的情況下的匯編輸 出結(jié)果。
圖中方框內(nèi)的部分是被刪除的部分構(gòu)造函數(shù)代碼以及部分析構(gòu)函 數(shù)代碼,女記號(hào)以及下線部分是表示新被配置的部分構(gòu)造函數(shù)或部分 析構(gòu)函數(shù)的開頭地址的標(biāo)記。
根據(jù)圖15至圖17的匯編輸出結(jié)果,可以得知冗長(zhǎng)的代碼已被刪除。
另外,虛擬繼承解析步驟S10為圖3以及圖4所示的處理內(nèi)容的 情況下,除通過由用戶控制的語(yǔ)言規(guī)范是否包含虛擬繼承,來(lái)將構(gòu)造 函數(shù)或析構(gòu)函數(shù)作為共通化對(duì)象以外,與圖2的形態(tài)一樣。
作為圖3所示的處理內(nèi)容的具體例子,例如在程序中,保證在 EC++(embedded—C++)語(yǔ)言規(guī)范內(nèi)描述的編譯指示如"#pragma
—611^6(1(16(1一€++"語(yǔ)言規(guī)范控制語(yǔ)句存在的情況下,由于虛擬繼承不
屬于EC十+語(yǔ)言規(guī)范,因此將所有的類的構(gòu)造函數(shù)以及析構(gòu)函數(shù)作為共
25通化對(duì)象。因此,與上述的實(shí)施例同樣,通過執(zhí)行特殊函數(shù)共通化步 驟Sll,從而可以刪除冗長(zhǎng)的代碼。
作為圖4所示的處理內(nèi)容的具體例子,例如當(dāng)發(fā)出指定以EC++ 語(yǔ)言模式對(duì)編譯器進(jìn)行編譯的選項(xiàng)的情況下,由于虛擬繼承不屬于
EC十+語(yǔ)言規(guī)范,因此將所有的類的構(gòu)造函數(shù)以及析構(gòu)函數(shù)作為共通化 對(duì)象,所述選項(xiàng)例如是"-embedded_c++"。因此,與上述同樣,通過 進(jìn)行特殊函數(shù)共通化步驟Sll,從而可以刪除冗長(zhǎng)的代碼。
如以上所述,根據(jù)本發(fā)明的編譯方法以及編譯程序,通過執(zhí)行包 括虛擬繼承解析步驟S10和特殊函數(shù)共通化步驟Sll的最佳化步驟 S4,從而可以不受是否有類對(duì)象的生成或調(diào)用的影響,就可以實(shí)現(xiàn)能 夠刪除被生成的冗長(zhǎng)的函數(shù)的編譯方法。
以上雖然通過實(shí)施例,對(duì)本發(fā)明的編譯方法以及編譯程序進(jìn)行了 說(shuō)明,但本發(fā)明并非受實(shí)施例所限。只要不超脫本發(fā)明的主旨,以本 實(shí)施例執(zhí)行的本領(lǐng)域技術(shù)人員能夠想到的各種變形例,或組合在不同 的實(shí)施例中的處理內(nèi)容并構(gòu)筑的形態(tài),均包含在本發(fā)明的范圍內(nèi)。
本發(fā)明可以利用于編譯方法以及編譯程序,尤其可以利用于移動(dòng) 電話或個(gè)人數(shù)字助理(Personal Digital Assistant : PDA)等,需要代
碼大小較小的對(duì)象代碼的組裝設(shè)備中所使用的程序的編譯方法以及編 譯程序。
權(quán)利要求
1. 一種編譯方法,將以面向?qū)ο笳Z(yǔ)言描述的、且至少具有一個(gè)類的輸入程序轉(zhuǎn)換為目標(biāo)程序,其特征在于,包括虛擬繼承解析步驟,解析所述輸入程序中的所述類是否以虛擬繼承被定義;特殊函數(shù)共通化步驟,在所述虛擬繼承解析步驟的解析結(jié)果為,所述類沒有以虛擬繼承被定義的情況下,生成將所述類的多個(gè)構(gòu)造函數(shù)以及多個(gè)析構(gòu)函數(shù)的至少一方共通化的代碼;以及生成步驟,生成包含在特殊函數(shù)共通化步驟生成的所述代碼的目標(biāo)程序。
2. 如權(quán)利要求l所述的編譯方法,其特征在于, 在所述虛擬繼承解析步驟,根據(jù)所述輸入程序中所描述的類定義,解析所述類是否以虛擬繼承被定義了 。
3. 如權(quán)利要求l所述的編譯方法,其特征在于, 在所述虛擬繼承解析步驟,根據(jù)語(yǔ)言規(guī)范控制語(yǔ)句,來(lái)解析所述類是否以虛擬繼承被定義了,所述語(yǔ)言規(guī)范控制語(yǔ)句是遵從語(yǔ)言規(guī)范 在所述輸入程序中被描述的控制語(yǔ)句。
4. 如權(quán)利要求l所述的編譯方法,其特征在于, 在所述虛擬繼承解析步驟,根據(jù)語(yǔ)言規(guī)范控制指令,來(lái)解析所述類是否以虛擬繼承被定義了 ,所述語(yǔ)言規(guī)范控制指令是遵從編譯所述 輸入程序的編譯系統(tǒng)的語(yǔ)言規(guī)范而被描述的控制指令。
5. 如權(quán)利要求l所述的編譯方法,其特征在于,在所述特殊函數(shù)共通化步驟,生成將沒有以虛擬繼承被定義的所 述類的多個(gè)構(gòu)造函數(shù)中的完全構(gòu)造函數(shù)和部分構(gòu)造函數(shù)共通化的代 碼,所述完全構(gòu)造函數(shù)是指,在生成構(gòu)成類對(duì)象的完全類對(duì)象時(shí)被調(diào) 用的構(gòu)造函數(shù),而不是在生成部分類對(duì)象時(shí)被調(diào)用的構(gòu)造函數(shù),所述 部分構(gòu)造函數(shù)是指,在生成構(gòu)成類對(duì)象的部分類對(duì)象時(shí)被調(diào)用的構(gòu)造 函數(shù)。
6. 如權(quán)利要求5所述的編譯方法,其特征在于, 在所述特殊函數(shù)共通化步驟,生成將沒有以虛擬繼承被定義的所述類的多個(gè)析構(gòu)函數(shù)中的完全析構(gòu)函數(shù)和部分析構(gòu)函數(shù)共通化的代 碼,所述完全析構(gòu)函數(shù)是指,在生成構(gòu)成類對(duì)象的完全類對(duì)象時(shí)被調(diào) 用的析構(gòu)函數(shù),而不是在生成部分類對(duì)象時(shí)被調(diào)用的析構(gòu)函數(shù),所述 部分析構(gòu)函數(shù)是指,在生成構(gòu)成類對(duì)象的部分類對(duì)象時(shí)被調(diào)用的析構(gòu) 函數(shù)。
7. 如權(quán)權(quán)利要求1所述的編譯方法,其特征在于, 在所述特殊函數(shù)共通化步驟,將沒有以虛擬繼承被定義的所述類的多個(gè)構(gòu)造函數(shù)中的完全構(gòu)造函數(shù)和部分構(gòu)造函數(shù)的某一方的調(diào)用指 令替換為另一方的調(diào)用指令,并通過刪除作為被替換的調(diào)用指令的構(gòu) 造函數(shù)的所述一方的構(gòu)造函數(shù)的代碼,從而生成將所述類的完全構(gòu)造 函數(shù)和部分構(gòu)造函數(shù)共通化的代碼。
8. 如權(quán)利要求7所述的編譯方法,其特征在于, 在所述特殊函數(shù)共通化步驟,將沒有以虛擬繼承被定義的所述類的多個(gè)析構(gòu)函數(shù)中的完全析構(gòu)函數(shù)和部分析構(gòu)函數(shù)的某一方的調(diào)用指 令替換為另一方的調(diào)用指令,并通過刪除作為被替換的調(diào)用指令的析 構(gòu)函數(shù)的所述一方的析構(gòu)函數(shù)的代碼,從而生成將所述類的完全析構(gòu) 函數(shù)和部分析構(gòu)函數(shù)共通化的代碼。
9.如權(quán)利要求1所述的編譯方法,其特征在于,在所述特殊函數(shù)共通化步驟,刪除沒有以虛擬繼承被定義的所述 類的多個(gè)構(gòu)造函數(shù)中的完全構(gòu)造函數(shù)和部分構(gòu)造函數(shù)中某一方的代 碼,并通過將表示完全構(gòu)造函數(shù)的開頭地址的標(biāo)記和表示部分構(gòu)造函 數(shù)的開頭地址的標(biāo)記配置到?jīng)]有被刪除的另一方代碼的開頭,從而生 成將所述類的完全構(gòu)造函數(shù)和部分構(gòu)造函數(shù)共通化的代碼。
10.如權(quán)利要求9所述的編譯方法,其特征在于, 在所述特殊函數(shù)共通化步驟,刪除沒有以虛擬繼承被定義的所述 類的多個(gè)析構(gòu)函數(shù)中的完全析構(gòu)函數(shù)和部分析構(gòu)函數(shù)中某一方的代 碼,并通過將表示完全析構(gòu)函數(shù)的開頭地址的標(biāo)記和表示部分析構(gòu)函 數(shù)的開頭地址的標(biāo)記配置到?jīng)]有被刪除的另一方代碼的開頭,從而生 成將所述類的完全析構(gòu)函數(shù)和部分析構(gòu)函數(shù)共通化的代碼。
11 . 一種編譯程序,進(jìn)行下述編譯,將以面向?qū)ο笳Z(yǔ)言描述的, 且至少具有一個(gè)類的輸入程序轉(zhuǎn)換為目標(biāo)程序,并使計(jì)算機(jī)執(zhí)行以下步驟:虛擬繼承解析步驟,解析所述輸入程序中的所述類是否以虛擬繼承被定義;特殊函數(shù)共通化步驟,在所述虛擬繼承解析步驟的解析結(jié)果為, 所述類沒有以虛擬繼承被定義的情況下,生成將所述類的多個(gè)構(gòu)造函 數(shù)以及多個(gè)析構(gòu)函數(shù)的至少一方共通化的代碼;以及生成步驟,生成包含在特殊函數(shù)共通化步驟生成的所述代碼的目 標(biāo)程序。
12.如權(quán)利要求l l所述的編譯程序,其特征在于, 在所述虛擬繼承解析步驟,根據(jù)所述輸入程序中所描述的類定義,4解析所述類是否以虛擬繼承被定義了。
13.如權(quán)利要求l l所述的編譯程序,其特征在于, 在所述虛擬繼承解析步驟,根據(jù)語(yǔ)言規(guī)范控制語(yǔ)句,來(lái)解析所述 類是否以虛擬繼承被定義了,所述語(yǔ)言規(guī)范控制語(yǔ)句是遵從語(yǔ)言規(guī)范 在所述輸入程序中被描述的控制語(yǔ)句。
14.如權(quán)利要求l l所述的編譯程序,其特征在于, 在所述虛擬繼承解析步驟,根據(jù)語(yǔ)言規(guī)范控制指令,來(lái)解析所述 類是否以虛擬繼承被定義了,所述語(yǔ)言規(guī)范控制指令是遵從編譯所述 輸入程序的編譯系統(tǒng)的語(yǔ)言規(guī)范而被描述的控制指令。
15.如權(quán)利要求l l所述的編譯程序,其特征在于, 在所述特殊函數(shù)共通化步驟,生成將沒有以虛擬繼承被定義的所 述類的多個(gè)構(gòu)造函數(shù)中的完全構(gòu)造函數(shù)和部分構(gòu)造函數(shù)共通化的代 碼,所述完全構(gòu)造函數(shù)是指,在生成構(gòu)成類對(duì)象的完全類對(duì)象時(shí)被調(diào) 用的構(gòu)造函數(shù),而不是在生成部分類對(duì)象時(shí)被調(diào)用的構(gòu)造函數(shù),所述 部分構(gòu)造函數(shù)是指,在生成構(gòu)成類對(duì)象的部分類對(duì)象時(shí)被調(diào)用的構(gòu)造 函數(shù)。
16.如權(quán)利要求l 5所述的編譯程序,其特征在于, 在所述特殊函數(shù)共通化步驟,生成將沒有以虛擬繼承被定義的所 述類的多個(gè)析構(gòu)函數(shù)中的完全析構(gòu)函數(shù)和部分析構(gòu)函數(shù)共通化的代 碼,所述完全析構(gòu)函數(shù)是指,在生成構(gòu)成類對(duì)象的完全類對(duì)象時(shí)被調(diào) 用的析構(gòu)函數(shù),而不是在生成部分類對(duì)象時(shí)被調(diào)用的析構(gòu)函數(shù),所述 部分析構(gòu)函數(shù)是指,在生成構(gòu)成類對(duì)象的部分類對(duì)象時(shí)被調(diào)用的析構(gòu) 函數(shù)。
17.如權(quán)利要求l l所述的編譯程序,其特征在于, 在所述特殊函數(shù)共通化步驟,將沒有以虛擬繼承被定義的所述類 的多個(gè)構(gòu)造函數(shù)中的完全構(gòu)造函數(shù)和部分構(gòu)造函數(shù)的某一方的調(diào)用指 令替換為另一方的調(diào)用指令,并通過刪除作為被替換的調(diào)用指令的構(gòu) 造函數(shù)的所述一方的構(gòu)造函數(shù)的代碼,從而生成將所述類的完全構(gòu)造 函數(shù)和部分構(gòu)造函數(shù)共通化的代碼。
18.如權(quán)利要求l 7所述的編譯程序,其特征在于,在所述特殊函數(shù)共通化步驟,將沒有以虛擬繼承被定義的所述類 的多個(gè)析構(gòu)函數(shù)中的完全析構(gòu)函數(shù)和部分析構(gòu)函數(shù)的某一方的調(diào)用指 令替換為另一方的調(diào)用指令,并通過刪除作為被替換的調(diào)用指令的析 構(gòu)函數(shù)的所述一方的析構(gòu)函數(shù)的代碼,從而生成將所述類的完全析構(gòu) 函數(shù)和部分析構(gòu)函數(shù)共通化的代碼。
19 .如權(quán)利要求1 1所述的編譯程序,其特征在于, 在所述特殊函數(shù)共通化步驟,刪除沒有以虛擬繼承被定義的所述類的多個(gè)構(gòu)造函數(shù)中的完全構(gòu)造函數(shù)和部分構(gòu)造函數(shù)中某一方的代 碼,并通過將表示完全構(gòu)造函數(shù)的開頭地址的標(biāo)記和表示部分構(gòu)造函 數(shù)的開頭地址的標(biāo)記配置到?jīng)]有被刪除的另一方代碼的開頭,從而生 成將所述類的完全構(gòu)造函數(shù)和部分構(gòu)造函數(shù)共通化的代碼。
20.如權(quán)利要求l 9所述的編譯程序,其特征在于, 在所述特殊函數(shù)共通化步驟,刪除沒有以虛擬繼承被定義的所述類的多個(gè)析構(gòu)函數(shù)中的完全析構(gòu)函數(shù)和部分析構(gòu)函數(shù)中某一方的代 碼,并通過將表示完全析構(gòu)函數(shù)的開頭地址的標(biāo)記和表示部分析構(gòu)函 數(shù)的開頭地址的標(biāo)記配置到?jīng)]有被刪除的另一方代碼的開頭,從而生 成將所述類的完全析構(gòu)函數(shù)和部分析構(gòu)函數(shù)共通化的代碼。
21. —種編譯裝置,執(zhí)行下述編譯方法,將以面向?qū)ο笳Z(yǔ)言描 述的,且至少具有一個(gè)類的輸入程序轉(zhuǎn)換為目標(biāo)程序,其特征在于, 包括虛擬繼承解析單元,解析所述輸入程序中的所述類是否以虛擬繼 承被定義;特殊函數(shù)共通化單元,在所述虛擬繼承解析單元的解析結(jié)果為, 所述類沒有以虛擬繼承被定義的情況下,生成將所述類的多個(gè)構(gòu)造函數(shù)以及多個(gè)析構(gòu)函數(shù)的至少一方共通化的代碼;以及生成單元,生成包含在特殊函數(shù)共通化單元生成的所述代碼的目 標(biāo)禾呈序。
全文摘要
提供一種編譯方法以及編譯程序,可以在不受是否有類對(duì)象的生成或是否有調(diào)用的影響下,刪除生成的冗長(zhǎng)的函數(shù),所述編譯方法,將以面向?qū)ο笳Z(yǔ)言描述的,且至少具有一個(gè)類的輸入程序轉(zhuǎn)換為目標(biāo)程序,其中包括虛擬繼承解析步驟,解析所述輸入程序中的所述類是否以虛擬繼承被定義;特殊函數(shù)共通化步驟,在所述虛擬繼承解析步驟的解析結(jié)果為,所述類沒有以虛擬繼承被定義的情況下,生成將所述類的多個(gè)構(gòu)造函數(shù)以及多個(gè)析構(gòu)函數(shù)的至少一方共通化的代碼;以及生成步驟,生成包含在特殊函數(shù)共通化步驟生成的所述代碼的目標(biāo)程序。
文檔編號(hào)G06F9/45GK101488095SQ200910003488
公開日2009年7月22日 申請(qǐng)日期2009年1月15日 優(yōu)先權(quán)日2008年1月18日
發(fā)明者淺尾忍 申請(qǐng)人:松下電器產(chǎn)業(yè)株式會(huì)社