两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

可編譯計(jì)算機(jī)程序的處理的制作方法

文檔序號:6481669閱讀:139來源:國知局
專利名稱:可編譯計(jì)算機(jī)程序的處理的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及可編譯計(jì)算機(jī)程序的處理,該程序由多個(gè)文件組成,例如源文件和頭文件,或者更一般地說本發(fā)明涉及可編譯函數(shù)系統(tǒng)描述的處理,該系統(tǒng)描述由多個(gè)文件組成。
背景技術(shù)
大規(guī)模計(jì)算機(jī)程序的生成通常包括大量文件的組合。為了使設(shè)計(jì)易于管理,將源代碼模塊分布于不同文件中,這些文件在某種程度上能夠被獨(dú)立設(shè)計(jì)和處理。例如,C++程序設(shè)計(jì)涉及使用大量的類,這些類可被分布在若干源文件中??上嗷オ?dú)立地檢查這些源文件的語法錯(cuò)誤并將其編譯成目標(biāo)代碼。從不同源文件得到的信息只在最后階段,鏈接階段,組合起來以生成機(jī)器可執(zhí)行的計(jì)算機(jī)程序。
在源文件的獨(dú)立處理期間,設(shè)計(jì)信息單元可能需要對若干源文件均是可用的。例如,C++程序設(shè)計(jì)中,類定義必須對不同的源文件均是可訪問的,以便這些源文件使用該類或?qū)崿F(xiàn)該類。含有可共享的設(shè)計(jì)單元的頭文件就是用于這個(gè)目的。那些使用設(shè)計(jì)信息單元的源文件含有“include(包含)語句”,該語句引用含有該單元的頭文件。頭文件依次也能夠含有include語句。
在語法檢查和編譯之前,由預(yù)處理器對每個(gè)源文件進(jìn)行預(yù)處理,該預(yù)處理器生成含有來自源文件的代碼的預(yù)處理文件,但是在其中通過替換來自該include語句引用的頭文件的信息來擴(kuò)展該include語句。該預(yù)處理器遞歸地執(zhí)行這一操作如果該頭文件依次含有包含聲明,那么所引用的信息在預(yù)處理文件里就被擴(kuò)展,等等。這可能涉及從被引用多次的頭文件復(fù)制信息。程序員通常加入條件include語句,該條件include語句使預(yù)處理器抑制這種復(fù)制。該條件include語句在先前頭文件未被擴(kuò)展的條件下包含該頭文件。在很多情況下,這種抑制恰好是需要的,因?yàn)椴蝗徊迦攵啻螐?fù)制定義,這將會中斷編譯。
該預(yù)處理文件用來進(jìn)行語法檢查和目標(biāo)文件的生成。在鏈接階段,該目標(biāo)文件被組合起來形成可執(zhí)行程序。這樣,在初始的單獨(dú)源文件處理階段和最后集體文件處理(collective file processing)階段之間存在嚴(yán)格的分離。在初始階段每個(gè)源文件單獨(dú)處理,而在最后階段所有從源文件得到的文件都集總地處理。單獨(dú)源文件處理階段跟在集體文件處理階段之后。
然而,由于各種原因,有人提出通過利用在單獨(dú)文件處理階段和集體文件處理階段之間的多次交替(alternation)來擺脫這種嚴(yán)格的分離。美國專利編號5,920,723描述了一個(gè)過程,在該過程中,在鏈接之前執(zhí)行集體源文件優(yōu)化處理階段。該優(yōu)化階段在鏈接階段之前將從不同源文件得到的信息組合起來,以優(yōu)化程序代碼。優(yōu)化可能涉及指令修改、指令移動、冗余指令移除、補(bǔ)償指令添加等。該優(yōu)化階段生成各個(gè)優(yōu)化中間文件,每個(gè)中間文件對應(yīng)各自的一個(gè)源文件。在優(yōu)化階段之后,該中間文件再一次經(jīng)過單獨(dú)處理而生成目標(biāo)文件。該目標(biāo)文件最后經(jīng)過集體處理而鏈接成可執(zhí)行程序。
原則上該中間文件應(yīng)該以與源文件相同的語法來表示。這樣,源文件和中間文件均能夠由相同的編譯器程序處理,這樣不需要單獨(dú)的編譯器。當(dāng)單獨(dú)處理階段與集體處理階段交替時(shí),可能出現(xiàn)如何將處理的信息拆分成多個(gè)單獨(dú)文件的問題。在美國專利編號5,920,723的案子中,由于源文件和中間文件之間存在一對一的關(guān)系,因而沒有引出該問題。利用初始頭文件可單獨(dú)編譯該中間文件。
當(dāng)除了傳統(tǒng)的優(yōu)化外還需要程序重構(gòu),例如,頭文件也被更改時(shí)則將會出現(xiàn)問題。這種重構(gòu)是需要的,例如用來重新設(shè)計(jì)程序以便在不同類型的(多)處理器上執(zhí)行,例如用來替換不同程序單元間的通信信道。在這種情況下源文件和頭文件被預(yù)處理器預(yù)處理。作為預(yù)處理的結(jié)果,來自頭文件的相同信息的拷貝可能出現(xiàn)在不同的預(yù)處理文件中。當(dāng)這種來自頭文件的信息發(fā)生改變時(shí),首選要保證出現(xiàn)在不同預(yù)處理文件中的、來自相同頭文件的信息未發(fā)生不一致的改變。此外,在集體處理階段的結(jié)尾必須再生成頭文件,并且必須再引入引用該再生成的頭文件的include語句(術(shù)語“再生成的”文件指出對應(yīng)于源文件的文件且發(fā)生改變的文件,其作為集體處理階段的結(jié)果)。這樣,該再生成的源文件和頭文件能夠利用對初始源文件和頭文件均可用的工具來進(jìn)行處理。這引起了頭文件生成的另外的問題。
初見似乎是,如果能夠在預(yù)處理文件中標(biāo)記出初始頭文件,那么新頭文件和新include語句則能夠從該信息得到,如通過修改而再生得到。然而,這是不可能的,因?yàn)橛捎跅l件include語句的存在,預(yù)處理期間的頭文件擴(kuò)展可能是不完全的。這樣在多文件處理中,當(dāng)不同源文件每個(gè)都用來自通用文件的信息,例如頭文件,獨(dú)立地進(jìn)行預(yù)處理,然后集總地進(jìn)行修改時(shí)就存在問題,并且不得不在修改后再生成新的源文件和通用文件。

發(fā)明內(nèi)容
在其他目標(biāo)之中,本發(fā)明的一個(gè)目標(biāo)是提供一種從修改的預(yù)處理文件再生成源文件和通用文件的方法和系統(tǒng)。
本發(fā)明的另一個(gè)目標(biāo)是從含有來自通用文件的信息擴(kuò)展的源文件版本再生出通用文件。
根據(jù)本發(fā)明的方法在權(quán)利要求1中闡明。每個(gè)從各個(gè)初始文件(即源文件)生成的預(yù)處理文件經(jīng)過協(xié)同的改變,其中,該初始文件具有從一個(gè)或多個(gè)通用文件(即頭文件)擴(kuò)展的添加信息。在改變之后,預(yù)處理文件被用來再生成初始文件的再生成文件(即再生成的源文件)和通用文件的再生成文件(即再生成的頭文件)。既然從通用文件擴(kuò)展到不同預(yù)處理文件的信息數(shù)量可能不同,那么就需要特別的注意保證該生成的文件足夠完整。因此選出期望含有足夠完整的頭文件信息的預(yù)處理文件來再生成通用文件,或者至少用在決定完整性的那部分再生成中。所選出的用于再生成通用文件的預(yù)處理文件是根據(jù)初始文件引用頭文件的類型選出的。含有通用文件中所定義的軟件組件實(shí)現(xiàn)的預(yù)處理文件被用來生成頭文件。在生成源文件和頭文件之后,例如,該文件可通過將其編譯成為目標(biāo)文件,并隨后進(jìn)行鏈接而被單獨(dú)處理,例如用來生成可執(zhí)行程序。計(jì)算機(jī)可繼而執(zhí)行這種可執(zhí)行程序的指令。
如上所述,優(yōu)選地,根據(jù)檢測到該通用文件中已然聲明的軟件組件實(shí)現(xiàn),選出該預(yù)處理文件,以用于通用文件的再生成。優(yōu)選地,在協(xié)同的集體處理之前完成該選擇,以便對于通用文件只需將來自選出的預(yù)處理文件的信息保留在計(jì)算機(jī)內(nèi)存中以便進(jìn)行協(xié)同處理。優(yōu)選地,使用兩遍操作(two-pass)處理。第一遍操作決定了應(yīng)該為哪個(gè)通用文件使用哪個(gè)預(yù)處理文件。第二遍操作從選出的預(yù)處理文件中獲取通用文件信息。第一遍操作決定該預(yù)處理文件讀取的順序,以便選出特定預(yù)處理文件在上述順序中的位置,這樣如果該特定預(yù)處理文件含有引用一個(gè)或多個(gè)深一層軟件組件的軟件組件實(shí)現(xiàn)時(shí),在上述順序中將該特定預(yù)處理文件定位在含有所有該一個(gè)或多個(gè)深一層軟件組件實(shí)現(xiàn)的一個(gè)或多個(gè)預(yù)處理文件之后讀取。換言之,讀取是按照自下而上的方式進(jìn)行的,以便讀取定義了在軟件組件引用層次中最底層組件的第一個(gè)文件(如果第一個(gè)組件的定義引用第二個(gè)組件那么第一個(gè)組件在該層次中比較高)。這樣,只有第一個(gè)遇到的通用文件擴(kuò)展需要保留。優(yōu)選地,將標(biāo)記信息包含在預(yù)處理文件中來標(biāo)記通用文件和被擴(kuò)展了的信息本身,其中,信息被從該通用文件擴(kuò)展到預(yù)處理文件。在再生成期間,該標(biāo)記信息用來插入指令來代替在初始文件的再生成文件中的擴(kuò)展信息。該插入指令控制第一個(gè)通用文件的再生成文件的包含,在其中該第一個(gè)通用文件被擴(kuò)展到多個(gè)預(yù)處理文件中。該通用文件的再生成文件是從由選出的預(yù)處理文件中的標(biāo)記信息所標(biāo)記的擴(kuò)展信息再生成的。這樣,該再生成文件能夠以與初始文件相同的方式使用。
優(yōu)選地,幾個(gè)初始文件引用的信息是軟件組件結(jié)構(gòu)的定義,該選出的文件通過為軟件組件單元提供實(shí)現(xiàn)程序來詳細(xì)描述該信息。在這種情況下,優(yōu)選地,為每個(gè)預(yù)處理文件檢測是否在從中生成所述選出的預(yù)處理文件所述初始文件之一,在用于擴(kuò)展來自所述通用文件中第一個(gè)文件的信息的第一指令之前,是否包含用于擴(kuò)展來自深一層通用文件的信息的在先指令,以及在每個(gè)再生成文件中生成所述在先指令的等同拷貝,其中在所述再生成文件中插入了用于擴(kuò)展所述通用文件中第一個(gè)文件的指令,在所述用于擴(kuò)展所述通用文件中第一個(gè)文件的指令之前插入所述等同拷貝。


以下將利用附圖描述本發(fā)明的這些和其他目標(biāo)以及有利的方面用圖1示出用來處理程序文件的系統(tǒng);圖2示出信息處理結(jié)構(gòu);圖3示出文件間的引用關(guān)系;圖4示出數(shù)據(jù)結(jié)構(gòu)的表示;圖5示出信息處理結(jié)構(gòu)。
具體實(shí)施例方式
圖1示出用來處理文件的系統(tǒng)。該系統(tǒng)含有存儲設(shè)備10,例如磁盤或這種磁盤的組合,用于存儲源文件和頭文件,處理器12,處理器內(nèi)存11,具有目標(biāo)程序內(nèi)存17和目標(biāo)處理器18的目標(biāo)計(jì)算機(jī)16和用來將生成的機(jī)器指令程序存儲到程序內(nèi)存17的設(shè)備14。目標(biāo)處理器18可以是處理器12,目標(biāo)程序內(nèi)存17是處理器內(nèi)存11,這沒有偏離本發(fā)明。
處理器12連接到存儲設(shè)備10用于從存儲設(shè)備10讀取初始源文件和初始頭文件并將其讀取到處理器內(nèi)存11中。設(shè)備14連接在處理器12和目標(biāo)程序內(nèi)存17之間連合。設(shè)備14可能被設(shè)置成將機(jī)器指令程序?qū)懭氲侥繕?biāo)程序內(nèi)存17中,或者,當(dāng)目標(biāo)計(jì)算機(jī)是集成電路的一部分時(shí),用來制造利用該程序編程的程序內(nèi)存17。然而,要理解的是,處理器12和設(shè)備14之間的連接事實(shí)上可以通過存儲設(shè)備10或任何存儲設(shè)備(未示出)來實(shí)現(xiàn)。
圖2示出處理期間的信息流。存儲在存儲設(shè)備10的初始源文件20a-c被應(yīng)用到預(yù)處理器22。作為例子示出了三個(gè)初始源文件20a-c,但是要理解的是任何數(shù)量的初始文件20a-c都可能被使用。例如,預(yù)處理器22可實(shí)現(xiàn)為運(yùn)行在計(jì)算機(jī)12上的程序,該程序可重復(fù)執(zhí)行,且每次執(zhí)行針對一個(gè)相應(yīng)的初始源文件20a-c。預(yù)處理器22在預(yù)處理期間使用來自初始頭文件組21的文件,并且產(chǎn)生預(yù)處理文件23a-c,每個(gè)對預(yù)處理文件針對一個(gè)相應(yīng)的初始源文件20a-c。
典型地,預(yù)處理器從初始源文件20a-c拷貝指令代碼到各個(gè)預(yù)處理文件23a-c,并響應(yīng)來自初始源文件20a-c的特定語句,將來自初始頭文件21的信息插入到預(yù)處理文件23a-c。標(biāo)記該插入信息以指示從中得到該信息的初始頭文件21。由預(yù)處理器22產(chǎn)生的預(yù)處理文件23a-c被存儲在例如處理器內(nèi)存或存儲設(shè)備10中。
表1是初始源文件、初始頭文件和預(yù)處理文件的例子,其中使用了include語句來擴(kuò)展初始源文件,該初始源文件具有來自初始頭文件的信息并且其中加入了標(biāo)記信息。此外,在預(yù)處理文件的頂部加入了標(biāo)記來標(biāo)識源文件。
表1

要意識到,標(biāo)記的形式只是舉例來說明的作為來自標(biāo)識的初始頭文件的開始,任何方便的標(biāo)記信息形式都可使用。
初始頭文件可含有對深一層初始頭文件的include語句。在這種情況下預(yù)處理器22將來自這些深一層初始頭文件的信息擴(kuò)展到預(yù)處理文件23a-c,并將相應(yīng)的標(biāo)記信息加入到預(yù)處理文件23a-c。當(dāng)這些深一層初始頭文件依次含有include語句時(shí),將來自更深一層初始頭文件的信息包含在預(yù)處理文件23a-c中等等。
初始頭文件21可能含有條件語句,例如“#ifndefX”,如果變量X在先前定義了,則可使預(yù)處理器22跳過部分初始頭文件21的擴(kuò)展。例如,假設(shè)初始頭文件21含有下述語句…#endif變量X的名字對這個(gè)初始頭文件是特定的。在這種情況下,當(dāng)在前面定義了變量X時(shí),當(dāng)遇到初始頭文件21的include語句時(shí),在“ifndef”和“endif”之間的部分初始頭文件將不會擴(kuò)展到預(yù)處理文件23a-c中。
集體處理階段24a處理預(yù)處理文件23a-c的組合。例如,集體處理階段24a實(shí)現(xiàn)為運(yùn)行在計(jì)算機(jī)12上的程序。集體處理階段24a修改來自預(yù)處理文件23a-c的信息。這可能包含從初始源文件20a-c得到的信息和/或從初始頭文件21得到的信息。
本發(fā)明不依賴于集體處理階段24a應(yīng)用到來自預(yù)處理文件23a-c的信息的修改類型。典型的修改是預(yù)處理文件的聯(lián)合再設(shè)計(jì)(jointredesign),包括對來自初始頭文件的通用類定義的改變和對來自初始源文件20a-c的指令的相應(yīng)修改,其中該初始源文件20a-c實(shí)現(xiàn)了修改類的成員或利用該類定義。例如,這可能應(yīng)用于例如通過為并行的處理器之間的數(shù)據(jù)傳輸插入指令而從初始源文件20a-c生成適合執(zhí)行在另一種類型的目標(biāo)計(jì)算機(jī)16上而不是初始設(shè)計(jì)程序的計(jì)算機(jī)上的程序。
分隔階段24b將集體處理階段24a的結(jié)果拆分到生成的源文件25a-c和生成的頭文件26a-c中。生成的源文件25a-c和生成的頭文件26a-c可以當(dāng)作他們分別是初始源文件20a-c和初始頭文件21來使用。也就是說,他們可應(yīng)用到預(yù)處理器22,來產(chǎn)生深一層預(yù)處理文件27a-c。
深一層預(yù)處理文件27a-c可應(yīng)用到編譯器28。例如,編譯器28具有9個(gè)不同的區(qū)段。結(jié)合在圖2中形象示出的抽象模型下面將以段8,塑壓部分段8為例對本發(fā)明的機(jī)床控制參數(shù)加以說明,其中用χ表示虛擬的導(dǎo)向軸

表1區(qū)段008第二圓錐形塑壓部分 過程粗加工對上表(上面的表1中未采用所有選項(xiàng))的說明,上表再現(xiàn)了本發(fā)明的功能數(shù)據(jù)結(jié)構(gòu)的實(shí)施方式第一列軸名稱第二列單位第三列區(qū)段編號=中性數(shù)據(jù)類型的識別字母(C表示圓,P表示多邊形[6次],K表示坐標(biāo)表格的坐標(biāo)[點(diǎn)])和表示側(cè)面的識別字母(R表示右側(cè)面;L表示左側(cè)面;B表示兩個(gè)側(cè)面)其它列作為范圍極限的X起始和X結(jié)束數(shù)值表和參數(shù)A,B,C,D,E,F(xiàn)和G(在多邊形的情況下)的數(shù)值,R,A,B,C(在圓的情況下)的數(shù)值以總之,不同的預(yù)處理文件23a-c可能每個(gè)都含有來自相同頭文件21的擴(kuò)展。然而,由于預(yù)處理文件22給予條件include語句的作用,在不同預(yù)處理文件23a-c中的擴(kuò)展可能不同。這意味著只有部分預(yù)處理文件23a-c適合于生成頭文件26a-c。其他預(yù)處理文件23a-c不夠完整。
圖3舉例說明了預(yù)處理文件23a-c的不完整性。在第一個(gè)源文件S1中包含了引用第一個(gè)頭文件H1的include語句。第一個(gè)頭文件H1含有了引用基礎(chǔ)頭文件H0的include語句。第二個(gè)源文件S2含有了引用第一個(gè)頭文件H1的include語句,引用第二個(gè)頭文件H2的include語句在該include語句之前。第二個(gè)頭文件H1也含有了引用基礎(chǔ)頭文件H0的include語句?,F(xiàn)在當(dāng)?shù)谝粋€(gè)源文件S1被預(yù)處理時(shí),第一個(gè)頭文件H1也被完整的擴(kuò)展了,該擴(kuò)展包含H0的擴(kuò)展。然而當(dāng)?shù)诙€(gè)源文件S2被預(yù)處理時(shí),第一個(gè)頭文件H1不會被完整的擴(kuò)展,因?yàn)閷0的引用由于以前在第二個(gè)頭文件H2擴(kuò)展期間已經(jīng)被擴(kuò)展,所以不被擴(kuò)展。結(jié)果,來自從第二個(gè)源文件S2得到的預(yù)處理文件的頭文件H1’的生成不會產(chǎn)生充分完整生成的頭文件H1’。
用于生成頭文件26a-c的合適的預(yù)處理文件的選擇包括預(yù)處理文件23a-c中軟件組件出現(xiàn)的分析。為了進(jìn)行該分析,使用了從預(yù)處理文件23a-c得到的數(shù)據(jù)結(jié)構(gòu)。這種數(shù)據(jù)結(jié)構(gòu)將標(biāo)識軟件組件、預(yù)處理文件23a-d和在預(yù)處理文件23a-d中標(biāo)識出的頭文件作為一個(gè)實(shí)體使用。在一個(gè)例子中,軟件組件是C++類定義。該數(shù)據(jù)結(jié)構(gòu)表達(dá)了軟件組件標(biāo)識符和頭文件之間的“內(nèi)部定義”關(guān)系和軟件組件標(biāo)識符和預(yù)處理文件23a-d之間的“內(nèi)部實(shí)現(xiàn)”關(guān)系。
頭文件的生成用表3中源文件Main,F(xiàn)1,F(xiàn)2的例子來說明。
表3源文件

源文件包含頭文件F1,F(xiàn)2和sys。作為例子,假設(shè)頭文件F1含有庫頭文件L和頭文件F0(不給sys,L和F0提供源文件)的include語句。進(jìn)而假設(shè)頭文件F2含有頭文件L,F(xiàn)0和F1的include語句。頭文件F0含有頭文件L和sys的include語句。頭文件L含有頭文件sys的include語句。
這產(chǎn)生了根據(jù)表4的預(yù)處理文件23a-c。
表4預(yù)處理文件

需要注意的是預(yù)處理文件含有嵌套標(biāo)記信息(在對應(yīng)第一個(gè)標(biāo)記的結(jié)束之前,第一個(gè)標(biāo)記之后跟隨第二個(gè)標(biāo)記)。也要注意的是相同頭文件(假定F1)的擴(kuò)展在不同預(yù)處理文件中是不同的,因?yàn)椋谝恍├又?,?dāng)先前已然對嵌套頭文件進(jìn)行預(yù)處理時(shí),就不再對其進(jìn)行預(yù)處理。
集體處理階段24a或分隔階段24b利用從預(yù)處理文件讀取的信息建立數(shù)據(jù)結(jié)構(gòu)。這些文件本身定義了預(yù)處理文件的標(biāo)識符。每次當(dāng)標(biāo)記信息提及新的頭文件時(shí)就加入頭文件標(biāo)識符。通過對預(yù)處理文件進(jìn)行語法分析來檢測軟件組件,例如檢測類定義。當(dāng)在預(yù)處理文件中遇到這樣的類定義時(shí)就為其生成軟件組件標(biāo)識,并且在該定義被標(biāo)記為出現(xiàn)的頭文件中加入內(nèi)部定義關(guān)系。類似地,為了例如類的成員函數(shù)的實(shí)現(xiàn)來對預(yù)處理文件進(jìn)行語法分析,并且當(dāng)在預(yù)處理文件中檢測到類的成員的實(shí)現(xiàn)并且仍然沒有記錄相應(yīng)的內(nèi)部實(shí)現(xiàn)關(guān)系時(shí),加入內(nèi)部實(shí)現(xiàn)的關(guān)系。這些標(biāo)識和標(biāo)識之間的關(guān)系可以任何方便的方式加以記錄,例如采用如頭文件、預(yù)處理文件和軟件組件的實(shí)體表,和具有相關(guān)實(shí)體對的各個(gè)條目的關(guān)系的表。
分隔階段24b生成具有來自數(shù)據(jù)結(jié)構(gòu)的信息的頭文件26a-c。分隔階段24b為每個(gè)軟件組件確定與該軟件組件有內(nèi)部定義關(guān)系的頭文件和與該軟件組件有內(nèi)部實(shí)現(xiàn)關(guān)系的預(yù)處理文件。隨后,從在內(nèi)部實(shí)現(xiàn)關(guān)系中的預(yù)處理文件生成該頭文件。
這個(gè)處理假設(shè)含有定義在特定頭文件21中的軟件組件實(shí)現(xiàn)的源文件20a-c含有該特定頭文件的include語句,以這種方式使得該include語句被完整地?cái)U(kuò)展。這就保證了,例如,如果特定頭文件的include語句在程序文件中是第一個(gè)include語句的情況(該特定頭文件所需要的任何其他頭文件都被包含在該特定頭文件本身中)。當(dāng)利用滿足這個(gè)要求的設(shè)計(jì)風(fēng)格來開發(fā)程序文件時(shí),不需要進(jìn)一步的措施(在這種情況下不需要引用關(guān)系)。
如果沒有規(guī)定這樣的風(fēng)格,那么優(yōu)選地,將分隔階段24b的實(shí)施例設(shè)置為從標(biāo)記信息提取那些所標(biāo)記的頂層include語句,該頂層include語句在用于產(chǎn)生特定頭文件的預(yù)處理文件中位于該特定頭文件的include語句之前。分隔階段24b將所提取的include語句插入在含有該特定頭文件的include語句的每個(gè)生成的源文件中,且插入在該頭文件之前。這樣,每次當(dāng)包含該特定頭文件時(shí)就創(chuàng)建了相同的環(huán)境。
表5是這個(gè)技術(shù)結(jié)果的一個(gè)例子表5include語句的附加拷貝的插入


在這個(gè)例子中,在源文件b中,引用文件“a”的include語句出現(xiàn)在頭文件“b.h”的include語句之前。頭文件c含有對頭文件“b.h”的include語句,但是沒有對文件“a”的include語句。對文件a的include語句使得分隔階段24b將對文件“a”的include語句插入在生成的源文件“b”和生成的頭文件“c”中,且插入在對生成的頭文件“bl.h”的include語句之前。也就是說,在頭文件“c”中生成了附加的include語句。原則上,分隔階段24b在每個(gè)插入了對生成的頭文件“bl.h”的include語句的文件中插入這樣的附加include語句??蛇x地,當(dāng)在那些文件中已經(jīng)存在對文件“a”的include語句時(shí),分隔階段24b可以取消附加include語句的插入。
在另一個(gè)實(shí)施例中,當(dāng)標(biāo)記符信息指出部分預(yù)處理文件23a-c是由頭文件的include語句而生成且該頭文件已然作為部分另一預(yù)處理文件23a-c而被讀出時(shí),集體處理階段24a被設(shè)置成跳過該部分預(yù)處理文件23a-c。采用跳過處理,意味著跳過的部分不再被修改和/或不再被用來進(jìn)行集體處理。一般而言,在集體處理期間,內(nèi)存11中由跳過的部分占用的內(nèi)存空間(如果有)可被重用,這樣不存在那些部分的拷貝,或者從那些部分得到的信息在處理期間保留在內(nèi)存11中。當(dāng)集體處理階段24a讀取預(yù)處理文件23a-c并且碰到標(biāo)記符信息時(shí),集體處理階段24a確定在標(biāo)記符信息中標(biāo)識的頭文件,將該頭文件標(biāo)識與已經(jīng)在標(biāo)記符信息中遇到的頭文件標(biāo)識的列表進(jìn)行比較,并且當(dāng)該標(biāo)識已經(jīng)被遇到過時(shí)就跳過此預(yù)處理文件。
在一個(gè)實(shí)施例中,集體處理階段含有第一個(gè)語法分析程序和第二個(gè)語法分析程序(例如實(shí)現(xiàn)為不同的程序部分)。語法分析程序本身被認(rèn)為用來讀取預(yù)處理文件,確定那些文件的語法結(jié)構(gòu),并且根據(jù)語法位置提取信息。第一個(gè)語法分析程序被設(shè)置成利用詳細(xì)的語法來進(jìn)行分析,即分析開始和結(jié)束標(biāo)記信息之間的詳細(xì)信息。第二個(gè)語法分析程序被設(shè)置成對較不詳細(xì)的語法進(jìn)行語法分析,該語法將所有開始和結(jié)束標(biāo)記信息之間的信息看作是無結(jié)構(gòu)的丟棄的塊。
當(dāng)集體處理階段24a采用這種跳過來自頭文件的信息重復(fù)的實(shí)施例時(shí),需要保證第一次遇到的來自頭文件的信息是完整的。這需要保證生成的頭文件是完整的。為了這個(gè)目的,優(yōu)選地,將利用集體處理階段24a的處理預(yù)處理文件的順序設(shè)置成每個(gè)用來生成頭文件(如前面所述)的預(yù)處理文件在包含該頭文件的任何其他預(yù)處理文件之前處理。
優(yōu)選地,在集體處理階段24a中使用了重新排序階段。該重新排序階段首先以任意的順序讀取預(yù)處理文件23a-c,并選出處理該預(yù)處理文件的順序。接下來,集體處理階段24a以選出的順序第二次讀取該預(yù)處理文件。為了重新排序,優(yōu)選收集關(guān)于軟件組件之間附加“引用”關(guān)系的信息。如果第一軟件組件使用了第二組件(例如,如果第一個(gè)組件是包含由第二個(gè)組件定義的第二個(gè)類的變量的第一個(gè)類),則被認(rèn)為其引用了第二個(gè)軟件組件。
圖4示出數(shù)據(jù)結(jié)構(gòu)中實(shí)體和關(guān)系的例子,該數(shù)據(jù)結(jié)構(gòu)是從如表3和4的預(yù)處理文件中得到的。假設(shè)定義了三個(gè)軟件組件F2,F(xiàn)1和F0(如矩形框所示)。軟件組件之間的箭頭表示引用關(guān)系。預(yù)處理文件F1和F2以圓圈表示,該預(yù)處理文件具有到軟件組件的鏈接,這些預(yù)處理文件含有該軟件組件的實(shí)現(xiàn)。標(biāo)記的頭文件用橢圓表示,該頭文件具有到軟件組件的鏈接,該頭文件含有該軟件組件的定義。僅示出了鏈接到軟件組件F2,F(xiàn)1和F1的預(yù)處理文件和頭文件。這樣預(yù)處理文件Main沒有示例示出。
重新排序階段建立了關(guān)于圖4描述的數(shù)據(jù)結(jié)構(gòu)。為了確定可用的源文件順序,該重新排序階段有效的使用了指示軟件組件的排序列表。初始時(shí)該列表為空。重新排序階段反復(fù)搜索仍沒有在列表中并且沒有被任何其他仍沒有在列表中的軟件組件所引用的“自由”軟件組件。重新排序階段將該自由軟件組件附加到列表中,并且反復(fù)的重復(fù)下一個(gè)自由軟件組件的搜索直到所有的軟件組件都已經(jīng)進(jìn)入該列表。對每個(gè)軟件組件都標(biāo)識出關(guān)聯(lián)的預(yù)處理文件23a-d,如果預(yù)處理文件與那個(gè)軟件組件在內(nèi)部實(shí)現(xiàn)關(guān)系中,那么就被認(rèn)為是關(guān)聯(lián)的。
當(dāng)集體處理階段24a第二次讀取預(yù)處理文件23a-c時(shí),預(yù)處理文件23a-c是以列表中關(guān)聯(lián)的軟件組件的順序來被讀取的。沒有被選作與軟件組件關(guān)聯(lián)但是實(shí)現(xiàn)了特定軟件組件的預(yù)處理文件可能在任何時(shí)候被讀取,但不是在實(shí)現(xiàn)該特定軟件組件所引用的深一層軟件組件的任何預(yù)處理文件之前。
例如圖4的例子,在重新排序的順序中,通用處理階段24a首先讀取初始文件F2的預(yù)處理文件,接下來讀取初始文件F1的預(yù)處理文件。隨后讀取沒有實(shí)現(xiàn)任何具體組件的其他文件,例如Main。
優(yōu)選地,如所述,任何先前的include語句(例如到F0的),即在對產(chǎn)生了生成版本的文件的初始include語句之前的include語句,都被自動拷貝到與初始include語句對應(yīng)的所有生成文件中(例如到F1和F2出現(xiàn))。
作為一個(gè)替換,或可選的,集體源處理階段24a可為那些沒有找到實(shí)現(xiàn)預(yù)處理文件的軟件組件(例如F0)生成輔助的虛擬實(shí)現(xiàn)源文件。該虛擬實(shí)現(xiàn)源文件被應(yīng)用到預(yù)處理器22,并且當(dāng)集體源處理階段以選出的順序讀取預(yù)處理文件時(shí),該最后得到的預(yù)處理文件用在第二遍操作中。該虛擬實(shí)現(xiàn)源文件(例如對于F0的源文件)僅僅包含對于定義了相關(guān)軟件組件的頭文件的include語句??申P(guān)于任何生成的源文件確定該虛擬實(shí)現(xiàn)源文件在經(jīng)歷集體處理階段24b的第二遍操作期間的讀取順序中的位置。這樣,保證了當(dāng)相關(guān)頭文件在第二遍操作期間第一次讀取時(shí),相關(guān)頭文件的完整擴(kuò)展是從該預(yù)處理文件讀取的。
盡管優(yōu)選集體處理階段每次應(yīng)用兩遍操作讀取處理,第一遍操作為第二遍操作選出讀取順序,但是要理解的是選出的順序可能為不同的第二遍操作重用多次,而無需重新排序。例如,這可以通過生成生成文件來實(shí)現(xiàn),該生成文件為下一次運(yùn)行通用處理階段24a描述了選出的讀取順序,例如在源文件20a-c改變之后應(yīng)用的運(yùn)行。
此外,應(yīng)該理解,讀取預(yù)處理文件順序的重新排列和僅保留第一個(gè)遇到的頭文件擴(kuò)展是優(yōu)選的實(shí)施例,但是存在可選的可能性來選擇要保留的擴(kuò)展。例如,可能生成修正的預(yù)處理文件,該預(yù)處理文件具有針對來自頭文件的擴(kuò)展信息的指示信息,用來指定該擴(kuò)展信息是否應(yīng)該保留。接下來在下一次集體處理階段24a的運(yùn)行中讀取該修正的預(yù)處理文件,并且只有指出的來自頭文件的信息被保留在內(nèi)存11中。作為另一個(gè)例子,關(guān)于選出的頭文件的預(yù)處理文件標(biāo)識可在兩次運(yùn)行期間保留在集體處理階段24a中,從而在第二次運(yùn)行中只有來自標(biāo)識的預(yù)處理文件的頭文件的信息被保留在內(nèi)存11中。
此外,應(yīng)該理解用來選擇讀取順序的數(shù)據(jù)結(jié)構(gòu)除了用于重新排序外還可用作其他目的。事實(shí)上,相關(guān)數(shù)據(jù)結(jié)構(gòu)可以是集體處理階段24a處理的附帶結(jié)果。
盡管本發(fā)明是按照C++源文件和頭文件的方式描述的,但是應(yīng)該理解本發(fā)明可以應(yīng)用到任何處理,在該處理中多個(gè)初始文件,例如源文件,被預(yù)處理以便來自通用文件,例如頭文件的信息被擴(kuò)展到預(yù)處理文件中,并且在該處理中初始文件和通用文件的版本從預(yù)處理文件生成。
圖5是信息流,其中不是所有的文件都生成來進(jìn)行重用。例如示出其中一個(gè)源文件20c被用來代替生成的文件25c(未示出),且示出其中一個(gè)頭文件21被用來代替生成的頭文件26c(未示出)。頭文件的選擇可能是在向集體處理階段24a提供指令的基礎(chǔ)上做出的。例如,指令可用于標(biāo)識某些類,這些類的使用被來自預(yù)處理文件23a-c中的那個(gè)類修正。在這種情況下,集體處理階段24a使用引用關(guān)系來確定哪些軟件組件經(jīng)歷修正(是自己修正還是直接或間接引用受到影響的組件)影響,并且控制分隔階段24b僅為受到影響的文件生成源文件25a,b和頭文件26a,b。當(dāng)沒有生成頭文件的新版本時(shí),生成帶有對不受影響的頭文件的引用(拷貝)的include語句。
根據(jù)以上描述,本發(fā)明主要是用于與集體處理階段24a的結(jié)合,該集體處理階段24a對多個(gè)預(yù)處理文件做出協(xié)同修正,但是應(yīng)該理解本發(fā)明可應(yīng)用到集體處理階段允許人工編輯預(yù)處理文件的情況。
權(quán)利要求
1.一種用于處理文件的機(jī)器執(zhí)行方法,該方法包括提供多個(gè)初始文件;提供一個(gè)或多個(gè)通用文件,該文件含有該多個(gè)所述初始文件引用的信息;預(yù)處理所述初始文件中的每一個(gè)初始文件以生成一個(gè)相應(yīng)的預(yù)處理文件,所述預(yù)處理包括利用來自所述通用文件中第一個(gè)文件的信息來擴(kuò)展該多個(gè)所述初始文件;應(yīng)用集體處理步驟來對來自所述預(yù)處理文件的信息進(jìn)行協(xié)同改變;根據(jù)檢測到選出的文件詳細(xì)描述了來自所述通用文件中第一個(gè)文件的信息,選出所述預(yù)處理文件之一,以及對于受所述集體處理步驟影響的所述初始文件和所述通用文件中第一個(gè)文件再生成多個(gè)再生成文件,利用來自所述選出的預(yù)處理文件的信息來控制對于所述通用文件中第一個(gè)文件的所述再生成文件的所述再生成,以便所述選出的預(yù)處理文件中的信息控制在對于所述通用文件中第一個(gè)文件的所述再生成文件中將包含多少信息。
2.如權(quán)利要求1所述的用于處理文件的機(jī)器執(zhí)行方法,包括使用來自對于所述通用文件中第一個(gè)文件的所述再生成文件的信息,執(zhí)行對于初始文件的再生成文件的第一獨(dú)立處理,之后,通過鏈接從對于所述初始文件的所述再生成文件得到的信息,對機(jī)器指令程序進(jìn)行鏈接。
3.如權(quán)利要求2所述的用于處理文件的機(jī)器執(zhí)行方法,包括僅對于那些受所述集體處理影響的初始文件和通用文件來有選擇地再生成多個(gè)再生成文件,并且在所述獨(dú)立處理中使用不受影響的初始文件和通用文件。
4.如權(quán)利要求1所述的用于處理文件的機(jī)器執(zhí)行方法,其中,所述多個(gè)初始文件引用的所述信息是軟件組件結(jié)構(gòu)的定義,所述選出的文件通過為所述軟件組件的單元提供實(shí)現(xiàn)程序而詳細(xì)描述了所述信息。
5.如權(quán)利要求1所述的用于處理文件的機(jī)器執(zhí)行方法,包括以下步驟第一次讀取所述預(yù)處理文件來執(zhí)行所述選擇;第二次讀取所述預(yù)處理文件,其中,在對于所述通用文件中第一個(gè)文件的擴(kuò)展信息中,僅將來自所述選出的預(yù)處理文件的擴(kuò)展信息保留在計(jì)算機(jī)內(nèi)存中,以便在應(yīng)用集體處理期間使用。
6.如權(quán)利要求5所述的用于處理文件的機(jī)器執(zhí)行方法,其中所述選擇包括檢測在所述預(yù)處理文件中的軟件組件的實(shí)現(xiàn);如果一個(gè)特定預(yù)處理文件包含一個(gè)軟件組件的實(shí)現(xiàn),則選擇該特定預(yù)處理文件,以便將來自所述第一通用文件的信息保留在所述內(nèi)存中。
7.如權(quán)利要求6所述的用于處理文件的機(jī)器執(zhí)行方法,其中,根據(jù)所述第一次讀取預(yù)先選出所述第二次讀取期間讀取所述預(yù)處理文件的順序,選擇特定預(yù)處理文件在所述順序中的位置,以使得如果該特定預(yù)處理文件包含引用了一個(gè)或多個(gè)深一層軟件組件的軟件組件的實(shí)現(xiàn),那么在所述順序中定位所述特定預(yù)處理文件,以便在包含所有所述一個(gè)或多個(gè)深一層軟件組件的實(shí)現(xiàn)的一個(gè)或多個(gè)預(yù)處理文件之后讀取所述特定預(yù)處理文件。
8.如權(quán)利要求7所述的用于處理文件的機(jī)器執(zhí)行方法,包括生成偽文件,每個(gè)偽文件針對一個(gè)尚未找到其實(shí)現(xiàn)預(yù)處理文件的相應(yīng)的軟件組件,且讀取所述偽文件作為所述第二次讀取的一部分,所述生成所述偽文件包括在每個(gè)特定偽文件中插入指令來包含所述通用文件并預(yù)處理所述偽文件,其中所述通用文件定義了為之生成所述偽文件的所述軟件組件,或者,取代所述插入和預(yù)處理,在所述偽文件中插入所述通用文件的擴(kuò)展。
9.如權(quán)利要求1所述的用于處理文件的機(jī)器執(zhí)行方法,所述預(yù)處理包括在所述預(yù)處理文件中包含標(biāo)記信息,以標(biāo)識所述通用文件中第一個(gè)文件和已擴(kuò)展的所述信息,其中來自所述通用文件中第一個(gè)文件的信息已被擴(kuò)展到所述預(yù)處理文件中,所述再生成包含使用所述標(biāo)記信息將指令而不是所述擴(kuò)展信息插入到對于所述初始文件的所述再生成文件中,所述指令控制對于所述通用文件中第一個(gè)文件的所述再生成文件的包含,其中所述通用文件中第一個(gè)文件被擴(kuò)展到所述預(yù)處理文件中,根據(jù)在所述選出的預(yù)處理文件中由所述標(biāo)記信息標(biāo)記的擴(kuò)展信息,再生成對于所述通用文件中第一個(gè)文件的所述再生成文件。
10.如權(quán)利要求9所述的用于處理文件的機(jī)器執(zhí)行方法,其中該多個(gè)所述初始文件引用的所述信息是軟件組件結(jié)構(gòu)的定義,所述選出的文件通過提供所述軟件組件的單元的實(shí)現(xiàn)程序而詳細(xì)描述了所述信息,所述方法包括為每個(gè)預(yù)處理文件檢測從中生成所述選出的預(yù)處理文件的其中一個(gè)所述初始文件,在用于擴(kuò)展來自所述通用文件中第一個(gè)文件的所述信息的第一指令之前,是否包含用于擴(kuò)展來自深一層通用文件的信息的在先指令,以及在每個(gè)再生成文件中生成所述在先指令的等同拷貝,其中在所述再生成文件中插入了用于擴(kuò)展所述通用文件中第一個(gè)文件的指令,在所述用于擴(kuò)展所述通用文件中第一個(gè)文件的指令之前插入所述等同拷貝。
11.一種計(jì)算機(jī)程序產(chǎn)品,包含用來執(zhí)行如以上任何一個(gè)權(quán)利要求所述的方法的機(jī)器指令。
12.一種被編程為用來處理文件的設(shè)備,所述設(shè)備包含存儲系統(tǒng),用于存儲多個(gè)初始文件和一個(gè)或多個(gè)通用文件,所述通用文件包含該多個(gè)所述初始文件引用的信息,和一個(gè)處理系統(tǒng),該處理系統(tǒng)被編程為執(zhí)行以下處理預(yù)處理所述初始文件中的每一個(gè)初始文件以生成一個(gè)相應(yīng)的預(yù)處理文件,所述預(yù)處理包括利用來自所述通用文件中第一個(gè)文件的信息來擴(kuò)展該多個(gè)所述初始文件;應(yīng)用集體處理步驟來對來自所述預(yù)處理文件的信息進(jìn)行協(xié)同改變;根據(jù)檢測到選出的文件詳細(xì)描述了來自所述通用文件中第一個(gè)文件的信息,選出所述預(yù)處理文件之一,以及對于受所述集體處理步驟影響的所述初始文件和所述通用文件中第一個(gè)文件再生成多個(gè)再生成文件,利用來自所述選出的預(yù)處理文件的信息來控制對于所述通用文件中第一個(gè)文件的所述再生成文件的所述再生成,以便所述選出的預(yù)處理文件中的信息控制在對于所述通用文件中第一個(gè)文件的所述再生成文件中將包含多少信息。
13.如權(quán)利要求12所述的設(shè)備,包含內(nèi)存,用于存儲來自所述預(yù)處理文件的信息以應(yīng)用所述集體處理步驟,設(shè)置所述設(shè)備以執(zhí)行下述處理第一次讀取所述預(yù)處理文件以執(zhí)行所述選擇;隨后讀取所述集體處理步驟的所述預(yù)處理文件,其中在所述通用文件中第一個(gè)文件中的擴(kuò)展信息中,僅將來自所述選出的預(yù)處理文件的擴(kuò)展信息保留在所述內(nèi)存中以在應(yīng)用集體處理期間使用。
14.如權(quán)利要求13所述的設(shè)備,其中所述選擇包括檢測在所述預(yù)處理文件中的軟件組件的實(shí)現(xiàn);如果一個(gè)特定預(yù)處理文件包含一個(gè)軟件組件的實(shí)現(xiàn),則選擇該特定的預(yù)處理文件,以便將來自所述第一個(gè)通用文件的信息保留在所述內(nèi)存中。
15.如權(quán)利要求14所述的設(shè)備,其中,根據(jù)所述第一次讀取預(yù)先選出所述第二次讀取期間讀取所述預(yù)處理文件的順序,選擇特定預(yù)處理文件在所述順序中的位置,以使得如果該特定預(yù)處理文件包含引用了一個(gè)或多個(gè)深一層軟件組件的軟件組件的實(shí)現(xiàn),那么在所述順序中定位所述特定預(yù)處理文件,以便在包含所有所述一個(gè)或多個(gè)深一層軟件組件的實(shí)現(xiàn)的一個(gè)或多個(gè)預(yù)處理文件之后讀取所述特定預(yù)處理文件。
16.如權(quán)利要求12所述的設(shè)備,其中,預(yù)處理包括在所述預(yù)處理文件中包含標(biāo)記信息,以標(biāo)識所述通用文件中第一個(gè)文件和已擴(kuò)展的所述信息,其中來自所述通用文件中第一個(gè)文件的信息已被擴(kuò)展到所述預(yù)處理文件中,所述再生成包含使用所述標(biāo)記信息將指令而不是所述擴(kuò)展信息插入到對于所述初始文件的所述再生成文件中,所述指令控制對于所述通用文件中第一個(gè)文件的所述再生成文件的包含,其中所述通用文件中第一個(gè)文件被擴(kuò)展到所述預(yù)處理文件中,根據(jù)在所述選出的預(yù)處理文件中由所述標(biāo)記信息標(biāo)記的擴(kuò)展信息,再生成對于所述通用文件中第一個(gè)文件的所述再生成文件。
17.如權(quán)利要求16所述的設(shè)備,其中該多個(gè)所述初始文件引用的所述信息是軟件組件結(jié)構(gòu)的定義,所述選出的文件通過提供所述軟件組件的單元的實(shí)現(xiàn)程序而詳細(xì)描述了所述信息,所述方法包括為每個(gè)預(yù)處理文件檢測從中生成所述選出的預(yù)處理文件的其中一個(gè)所述初始文件,在用于擴(kuò)展來自所述通用文件中第一個(gè)文件的所述信息的第一指令之前,是否包含用于擴(kuò)展來自深一層通用文件的信息的在先指令,以及在每個(gè)再生成文件中生成所述在先指令的等同拷貝,其中在所述再生成文件中插入了用于擴(kuò)展所述通用文件中第一個(gè)文件的指令,在所述用于擴(kuò)展所述通用文件中第一個(gè)文件的指令之前插入所述等同拷貝。
全文摘要
提供多個(gè)源文件和一個(gè)或多個(gè)頭文件。包含其中幾個(gè)源文件引用的信息的頭文件。預(yù)處理所述初始文件中的每一個(gè)以生成一個(gè)相應(yīng)的預(yù)處理文件,所述預(yù)處理包括利用來自所述第一頭文件的信息來擴(kuò)展多個(gè)所述源文件。應(yīng)用集體處理步驟來對來自所述預(yù)處理文件的信息進(jìn)行協(xié)同改變;改變的預(yù)處理文件用于再生成修改的源文件和頭文件。為了再生成第一頭文件,根據(jù)檢測到選出的文件詳細(xì)描述了來自所述第一頭文件的信息,選出所述預(yù)處理文件之一。從所選出的文件的信息再生成所述第一頭文件。
文檔編號G06F9/45GK1860437SQ200480010025
公開日2006年11月8日 申請日期2004年4月13日 優(yōu)先權(quán)日2003年4月16日
發(fā)明者翁德雷·波普 申請人:皇家飛利浦電子股份有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
读书| 元江| 龙岩市| 禹州市| 浪卡子县| 延寿县| 平顶山市| 余庆县| 苏尼特右旗| 贵定县| 资阳市| 西充县| 八宿县| 博爱县| 汝城县| 唐河县| 昌平区| 阜南县| 沁源县| 常山县| 神农架林区| 武冈市| 湘潭市| 南漳县| 蓬安县| 砚山县| 邓州市| 容城县| 蚌埠市| 驻马店市| 双江| 满洲里市| 务川| 兰州市| 若尔盖县| 高州市| 溧水县| 柯坪县| 惠东县| 海宁市| 宝鸡市|