本申請(qǐng)涉及計(jì)算機(jī)技術(shù)領(lǐng)域,尤其涉及一種文件編譯方法及裝置。
背景技術(shù):
為使代碼編寫簡(jiǎn)潔靈活、并有效地節(jié)省程序運(yùn)行時(shí)所在系統(tǒng)的內(nèi)存空間,編程人員會(huì)將一些常用的功能函數(shù)封裝在對(duì)應(yīng)功能模塊下的共享庫(kù)文件中、并在需要時(shí)直接調(diào)用。然而,這也使得系統(tǒng)文件之間產(chǎn)生了一定的依賴關(guān)系,這些依賴關(guān)系可以存在于可執(zhí)行程序文件與共享庫(kù)文件之間,也可以存在于兩個(gè)或多個(gè)共享庫(kù)文件之間。文件依靠文件間的依賴關(guān)系、與被依賴的文件相互作用、共同完成系統(tǒng)中的每一項(xiàng)任務(wù)。要使文件的依賴關(guān)系真實(shí)有效,一般需要在這些文件尚未編譯之前,就采用動(dòng)態(tài)鏈接的方式預(yù)先在這些文件所對(duì)應(yīng)的源碼文件間建立起相對(duì)靜態(tài)的依賴關(guān)系。
現(xiàn)有技術(shù)中,編譯器在對(duì)存有依賴關(guān)系的源碼文件進(jìn)行編譯時(shí),會(huì)遵循如下原則:先對(duì)所有共享庫(kù)文件所對(duì)應(yīng)的源碼文件進(jìn)行編譯、生成共享庫(kù)文件,再對(duì)可執(zhí)行程序文件所對(duì)應(yīng)的源碼文件進(jìn)行編譯、生成可執(zhí)行程序文件,其中,共享庫(kù)文件和可執(zhí)行程序文件統(tǒng)稱為目標(biāo)文件;并且,在對(duì)共享庫(kù)文件所對(duì)應(yīng)的源碼文件進(jìn)行編譯時(shí),會(huì)依照各源碼文件間的依賴關(guān)系,先對(duì)被依賴的源碼文件進(jìn)行編譯,再對(duì)其它源碼文件進(jìn)行編譯。以上兩點(diǎn)共同保證了:編譯器在對(duì)每一源碼文件進(jìn)行編譯時(shí),該文件所依賴的源碼文件已經(jīng)經(jīng)過(guò)了編譯操作、生成了相應(yīng)的目標(biāo)文件,并由此實(shí)現(xiàn)每一工程目錄下所有源碼文件的正常編譯。然而,當(dāng)存在兩個(gè)或多個(gè)共享庫(kù)文件所對(duì)應(yīng)的源碼文件采用上述動(dòng)態(tài)鏈接的方式循環(huán)依賴時(shí),這些文件將通過(guò)文件間的依賴關(guān)系、形成一個(gè)封閉的依賴關(guān)系鏈,而由于該依賴關(guān)系鏈中的任一文件都將同時(shí)依賴其它文件、并為其它文件所依賴,故編譯器無(wú)論從哪一文件開始編譯,都將因?yàn)楫?dāng)前文件所依賴的文件尚未編譯而報(bào)告當(dāng)前文件編譯失敗,并由此導(dǎo)致涉及這些循環(huán)依賴源碼文件的所有編譯過(guò)程均無(wú)法正常執(zhí)行。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本申請(qǐng)?zhí)峁┮环N文件編譯方法及裝置,以當(dāng)存在兩個(gè)或者多個(gè)共享庫(kù)文件所對(duì)應(yīng)的源碼文件采用上述動(dòng)態(tài)鏈接的方式循環(huán)依賴時(shí),實(shí)現(xiàn)涉及這些循環(huán)依賴源碼文件的所有編譯過(guò)程正常執(zhí)行。
根據(jù)本申請(qǐng)實(shí)施例的第一方面,提供一種文件編譯的方法,所述方法包括:
接收編譯指令,針對(duì)編譯指令所提供的每一功能模塊的路徑,確定該路徑下共享庫(kù)文件所對(duì)應(yīng)的編譯配置文件,其中,功能模塊為用以實(shí)現(xiàn)系統(tǒng)功能的預(yù)配置文件或文件集;
針對(duì)編譯配置文件中記錄的共享庫(kù)文件名稱,判斷以該名稱命名的文件是否存在,并在不存在的情況下,創(chuàng)建以該名稱命名的軟鏈接文件;該軟鏈接文件所指向的公共替身文件的自然編譯完成時(shí)刻,已被配置為預(yù)設(shè)編譯完成時(shí)刻,且該預(yù)設(shè)編譯完成時(shí)刻早于系統(tǒng)中任一源碼文件所對(duì)應(yīng)的自然更新時(shí)刻;
針對(duì)所找到的每一編譯配置文件中記錄的共享庫(kù)文件名稱,判斷以該名稱命名的文件的編譯完成時(shí)刻是否早于該共享庫(kù)文件所對(duì)應(yīng)源碼文件的自然更新時(shí)刻;如果是,則對(duì)該共享庫(kù)文件所對(duì)應(yīng)的源碼文件進(jìn)行編譯,以創(chuàng)建該源碼文件對(duì)應(yīng)的共享庫(kù)文件。
根據(jù)本申請(qǐng)實(shí)施例的第二方面,提供一種文件編譯的裝置,所述裝置包括:
接收單元,用于接收編譯指令;
確定單元,用于針對(duì)編譯指令所提供的每一功能模塊的路徑,確定該路徑下共享庫(kù)文件所對(duì)應(yīng)的編譯配置文件,其中,功能模塊為用以實(shí)現(xiàn)系統(tǒng)功能的預(yù)配置文件或文件集;
第一判斷單元,用于針對(duì)編譯配置文件中記錄的共享庫(kù)文件名稱,判斷以該名稱命名的文件是否存在;
第一創(chuàng)建單元,用于在以該名稱命名的文件不存在的情況下,創(chuàng)建以該名稱命名的軟鏈接文件;該軟鏈接文件所指向的公共替身文件的自然編譯完成時(shí)刻,已被配置為預(yù)設(shè)時(shí)刻預(yù)設(shè)編譯完成時(shí)刻,且該預(yù)設(shè)時(shí)刻預(yù)設(shè)編譯完成時(shí)刻早于系統(tǒng)中任一源碼文件所對(duì)應(yīng)的自然更新時(shí)刻;
第二判斷單元,用于針對(duì)所找到的每一編譯配置文件中記錄的共享庫(kù)文件名稱,判斷以該名稱命名的文件的自然編譯完成時(shí)刻是否早于該共享庫(kù)文件所對(duì)應(yīng)源碼文件的自然更新時(shí)刻;
第二創(chuàng)建單元,用于在第二判斷單元的判斷結(jié)果為是時(shí),對(duì)該共享庫(kù)文件所對(duì)應(yīng)的源碼文件進(jìn)行編譯,以創(chuàng)建該源碼文件對(duì)應(yīng)的共享庫(kù)文件。
本申請(qǐng)中,當(dāng)接收到編譯指令,并確定每一功能模塊路徑下尚未存在以編譯配置文件中記錄的共享庫(kù)文件名稱命名的文件時(shí),編譯器會(huì)創(chuàng)建一個(gè)以該名稱命名的軟鏈接文件,而由于軟鏈接文件所指向的公共替身文件的自然編譯完成時(shí)刻,已被配置為預(yù)設(shè)編譯完成時(shí)刻,且該預(yù)設(shè)編譯完成時(shí)刻早于該共享庫(kù)文件所對(duì)應(yīng)源碼文件的自然更新時(shí)刻,故會(huì)觸發(fā)編譯器對(duì)該共享庫(kù)文件所對(duì)應(yīng)源碼文件的重新編譯,在生成真正共享庫(kù)文件的同時(shí),覆蓋掉與該真實(shí)共享庫(kù)文件重名的軟鏈接文件。則當(dāng)系統(tǒng)中存在兩個(gè)或多個(gè)共享庫(kù)文件所對(duì)應(yīng)的源碼文件采用動(dòng)態(tài)鏈接的方式循環(huán)依賴時(shí),由于編譯器在編譯生成真正的共享庫(kù)文件之前,已預(yù)先生成了與真正共享庫(kù)文件同名的、且已編譯完成的軟鏈接文件,故會(huì)不引發(fā)因任一被依賴文件尚未編譯而導(dǎo)致的編譯失敗,從而實(shí)現(xiàn)涉及這些循環(huán)依賴源碼文件的所有編譯過(guò)程正常執(zhí)行。
附圖說(shuō)明
圖1是本申請(qǐng)一種文件編譯方法的流程圖;
圖2是本申請(qǐng)一種文件編譯方法的一個(gè)實(shí)施例流程圖;
圖3是本申請(qǐng)一種文件編譯裝置的第一種結(jié)構(gòu)圖;
圖4是本申請(qǐng)一種文件編譯裝置的第二種結(jié)構(gòu)圖;
圖5是本申請(qǐng)一種文件編譯裝置的第三種結(jié)構(gòu)圖。
具體實(shí)施方式
這里將詳細(xì)地對(duì)示例性實(shí)施例進(jìn)行說(shuō)明,其示例表示在附圖中。下面的描述涉及附圖時(shí),除非另有表示,不同附圖中的相同數(shù)字表示相同或相似的要素。以下示例性實(shí)施例中所描述的實(shí)施方式并不代表與本申請(qǐng)相一致的所有實(shí)施方式。相反,它們僅是與如所附權(quán)利要求書中所詳述的、本申請(qǐng)的一些方面相一致的裝置和方法的例子。
在本申請(qǐng)使用的術(shù)語(yǔ)是僅僅出于描述特定實(shí)施例的目的,而非旨在限制本申請(qǐng)。在本申請(qǐng)和所附權(quán)利要求書中所使用的單數(shù)形式的“一種”、“所述”和“該”也旨在包括多數(shù)形式,除非上下文清楚地表示其他含義。還應(yīng)當(dāng)理解,本文中使用的術(shù)語(yǔ)“和/或”是指并包含一個(gè)或多個(gè)相關(guān)聯(lián)的列出項(xiàng)目的任何或所有可能組合。
應(yīng)當(dāng)理解,盡管在本申請(qǐng)可能采用術(shù)語(yǔ)第一、第二、第三等來(lái)描述各種信息,但這些信息不應(yīng)限于這些術(shù)語(yǔ)。這些術(shù)語(yǔ)僅用來(lái)將同一類型的信息彼此區(qū)分開。例如,在不脫離本申請(qǐng)范圍的情況下,第一信息也可以被稱為第二信息,類似地,第二信息也可以被稱為第一信息。取決于語(yǔ)境,如在此所使用的詞語(yǔ)“如果”可以被解釋成為“在……時(shí)”或“當(dāng)……時(shí)”或“響應(yīng)于確定”。
隨著編程語(yǔ)言的日漸成熟和廣泛應(yīng)用,編程人員通常會(huì)將一些常用的功能函數(shù)封裝在對(duì)應(yīng)功能模塊下的共享庫(kù)文件中、并在需要時(shí)直接調(diào)用。這不僅會(huì)賦予代碼編寫工作更高的靈活度、而且可以有效地節(jié)省程序運(yùn)行時(shí)所在系統(tǒng)的內(nèi)存空間。比如,在一示例性實(shí)施例中,當(dāng)系統(tǒng)需要同時(shí)執(zhí)行多個(gè)可執(zhí)行程序文件時(shí),中央處理單元可能會(huì)同時(shí)運(yùn)行多個(gè)進(jìn)程,用以完成每一可執(zhí)行程序文件所對(duì)應(yīng)的任務(wù)。在這一過(guò)程中,這些同時(shí)運(yùn)行的可執(zhí)行程序文件可能都需要調(diào)用內(nèi)存管理函數(shù),用以進(jìn)行內(nèi)存管理,而此時(shí)如果在每一可執(zhí)行程序文件所對(duì)應(yīng)的源碼文件中均寫明該內(nèi)存管理函數(shù)的函數(shù)實(shí)現(xiàn),則由于系統(tǒng)在對(duì)可執(zhí)行程序文件進(jìn)行執(zhí)行操作時(shí),會(huì)將該文件的所有代碼讀取到系統(tǒng)內(nèi)存中,故會(huì)導(dǎo)致系統(tǒng)內(nèi)存中存有多份內(nèi)容相同的函數(shù)實(shí)現(xiàn),從而增加了系統(tǒng)內(nèi)存的使用率。但是,如果將這一內(nèi)存管理函數(shù)預(yù)先保存在共享庫(kù)文件中、且僅在各文件中直接調(diào)用,則系統(tǒng)內(nèi)存中將僅會(huì)存有一份該內(nèi)存管理函數(shù)的函數(shù)實(shí)現(xiàn),有效節(jié)省了系統(tǒng)內(nèi)存的內(nèi)存空間。其中,共享庫(kù)文件的本質(zhì)是封裝有相近、或相關(guān)功能函數(shù)的函數(shù)庫(kù),用以為編程人員提供一些既有的、通用的函數(shù)實(shí)現(xiàn);而上述系統(tǒng),可以是操作系統(tǒng)、運(yùn)行于操作系統(tǒng)中的應(yīng)用程序、以及特定產(chǎn)品或軟件的開發(fā)系統(tǒng)等。
然而,上述將常用的功能函數(shù)封裝在對(duì)應(yīng)功能模塊下的共享庫(kù)文件中、并在需要時(shí)直接調(diào)用的機(jī)制,也使得系統(tǒng)文件之間產(chǎn)生了一定的依賴關(guān)系,比如上述可執(zhí)行程序文件對(duì)內(nèi)存管理函數(shù)所在共享庫(kù)文件的依賴。為此,要使上述文件間的依賴關(guān)系真實(shí)有效,一般需要在這些文件尚未編譯之前,就采用動(dòng)態(tài)鏈接的方式預(yù)先在這些文件所對(duì)應(yīng)的源碼文件間建立起相對(duì)靜態(tài)的依賴關(guān)系。但在編譯器目前固有的編譯原則下,當(dāng)存在兩個(gè)或多個(gè)共享庫(kù)文件所對(duì)應(yīng)的源碼文件采用上述動(dòng)態(tài)鏈接的方式循環(huán)依賴時(shí),這些循環(huán)依賴文件所對(duì)應(yīng)的源碼文件、以及涉及這些循環(huán)依賴源碼文件的所有編譯過(guò)程都將無(wú)法正常執(zhí)行。這是因?yàn)檫@些文件會(huì)通過(guò)文件間的依賴關(guān)系、形成一個(gè)封閉的依賴關(guān)系鏈,而由于該依賴關(guān)系鏈中的任一文件都將同時(shí)依賴其它文件、并為其它文件所依賴,故編譯器無(wú)論從哪一文件開始編譯,都將因?yàn)楫?dāng)前文件所依賴的文件尚未編譯而報(bào)告當(dāng)前文件編譯失敗。其中,上述動(dòng)態(tài)鏈接方式的特點(diǎn)在于:當(dāng)一可執(zhí)行程序文件所對(duì)應(yīng)的進(jìn)程啟動(dòng)時(shí),進(jìn)程會(huì)首先將該文件所依賴的共享庫(kù)文件讀取到內(nèi)存中,以便后續(xù)使用。這種方式下,編譯器可以檢查出函數(shù)調(diào)用時(shí)所傳形參和實(shí)參在類型、數(shù)量、順序等方面的合法性,從而提高代碼運(yùn)行的可靠性。在Linux操作系統(tǒng)下,上述動(dòng)態(tài)鏈接具體是指:在每一目標(biāo)文件所對(duì)應(yīng)的編譯配置文件中指定該目標(biāo)文件所依賴的共享庫(kù)文件名稱。
為解決上述問(wèn)題,本領(lǐng)域技術(shù)人員已做過(guò)不同的嘗試,但也同時(shí)引入了新的問(wèn)題。比如:
在現(xiàn)有技術(shù)的一種實(shí)現(xiàn)方式中,當(dāng)?shù)谝还蚕韼?kù)文件與第二共享庫(kù)文件需要互相調(diào)用對(duì)方的函數(shù)時(shí),即上述第一共享庫(kù)文件與第二共享庫(kù)文件所對(duì)應(yīng)的源碼文件循環(huán)依賴時(shí),編程人員可在第一共享庫(kù)文件所對(duì)應(yīng)的源碼文件中使用動(dòng)態(tài)加載的方式調(diào)用第二共享庫(kù)文件中的函數(shù),而在第二共享庫(kù)文件所對(duì)應(yīng)的源碼文件中保留使用動(dòng)態(tài)鏈接的方式調(diào)用第一共享庫(kù)文件中的函數(shù)。其中,上述動(dòng)態(tài)加載方式的特點(diǎn)在于:當(dāng)一可執(zhí)行程序文件所對(duì)應(yīng)的進(jìn)程啟動(dòng)時(shí),進(jìn)程僅會(huì)在代碼運(yùn)行到相應(yīng)位置時(shí)才去讀取該文件所依賴的共享庫(kù)文件。
在這種情況下,如果第一共享庫(kù)文件所對(duì)應(yīng)的源碼文件先于第二共享庫(kù)文件所對(duì)應(yīng)的源碼文件進(jìn)行編譯,則由于第一共享庫(kù)文件所對(duì)應(yīng)的源碼文件對(duì)第二共享庫(kù)文件所對(duì)應(yīng)的源碼文件所使用的依賴方式為動(dòng)態(tài)加載方式,所以依照編譯器的固有編譯原則,編譯器不會(huì)將對(duì)第二共享庫(kù)文件的編譯完成作為對(duì)第一共享庫(kù)文件所對(duì)應(yīng)的源碼文件開始編譯的先決條件,而是直接對(duì)第一共享庫(kù)文件所對(duì)應(yīng)的源碼文件進(jìn)行編譯;當(dāng)?shù)谝还蚕韼?kù)文件編譯完成時(shí),第二共享庫(kù)文件所對(duì)應(yīng)的源碼文件便可以實(shí)現(xiàn)正常編譯。但是在上述動(dòng)態(tài)加載方式下,編譯器將無(wú)法檢查出函數(shù)調(diào)用時(shí)所傳形參和實(shí)參在類型、數(shù)量、順序等方面的合法性,故會(huì)導(dǎo)致代碼運(yùn)行時(shí)的可靠性降低,甚至為企業(yè)造成重大的損失。
在現(xiàn)有技術(shù)的第二中實(shí)現(xiàn)方式中,比如,在Linux系統(tǒng)下針對(duì)共享庫(kù)文件循環(huán)調(diào)用問(wèn)題的既有實(shí)現(xiàn)中,編程人員可在第一共享庫(kù)文件和第二共享庫(kù)文件所對(duì)應(yīng)的源碼文件中直接指定所調(diào)用的對(duì)方庫(kù)文件中的函數(shù)名稱;并保證至少不在其中一個(gè)共享庫(kù)文件所對(duì)應(yīng)的編譯配置文件中指定另一共享庫(kù)文件的名稱,比如,在第一共享庫(kù)文件所對(duì)應(yīng)的編譯配置文件中不指定第二共享庫(kù)文件的名稱。
在這種情況下,如果使第一共享庫(kù)文件所對(duì)應(yīng)的源碼文件先于第二共享庫(kù)文件所對(duì)應(yīng)的源碼文件進(jìn)行編譯,則可保證編譯過(guò)程的正常進(jìn)行。但這種編程方式需要編程人員投入大量的精力去校驗(yàn)文件間的依賴關(guān)系,以在需要時(shí)對(duì)目標(biāo)文件所對(duì)應(yīng)的編譯配置文件進(jìn)行重新配置,編程復(fù)雜度較高。
需要指出的是,以上兩種現(xiàn)有技術(shù)的實(shí)現(xiàn)方式,均需要編程人員根據(jù)文件間的依賴關(guān)系對(duì)各文件的編譯順序進(jìn)行實(shí)時(shí)維護(hù),這不僅會(huì)耗費(fèi)較多的人工成本,而且編程效率和可靠性均會(huì)降低。
針對(duì)上述共享庫(kù)文件循環(huán)調(diào)用的問(wèn)題,本申請(qǐng)?zhí)岢隽艘环N文件編譯方法,該方法不僅可以保證涉及這些循環(huán)依賴源碼文件的所有編譯過(guò)程正常執(zhí)行,而且打破了現(xiàn)有技術(shù)實(shí)現(xiàn)方式中需要維護(hù)文件編譯順序的限制。
為了使本技術(shù)領(lǐng)域的人員更好地理解本申請(qǐng)實(shí)施例中的技術(shù)方案,并使本申請(qǐng)實(shí)施例的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖對(duì)本申請(qǐng)實(shí)施例中技術(shù)方案作進(jìn)一步詳細(xì)的說(shuō)明。
參見圖1,圖1是本申請(qǐng)一種文件編譯方法的流程圖,該流程圖可以包括以下步驟:
步驟101:編譯器接收編譯指令,針對(duì)編譯指令所提供的每一功能模塊的路徑,確定該路徑下共享庫(kù)文件所對(duì)應(yīng)的編譯配置文件。
本方法實(shí)施例中,編譯指令可以通過(guò)多種方式為編譯器提供每一功能模塊的路徑。
在本方法實(shí)施例的第一種實(shí)現(xiàn)方式中,編譯指令可提供一模塊清單的入口地址,該模塊清單記錄了每一功能模塊的路徑,且所記錄的功能模塊的路徑可以任意順序排列。有關(guān)模塊清單中功能模塊路徑可以任意順序排列的原因,將在后續(xù)實(shí)施例中加以說(shuō)明,在此不再贅述。
在本方法實(shí)施例的第二種實(shí)現(xiàn)方式中,編譯指令可直接攜帶每一功能模塊的路徑,以供編譯器直接從所接收到的編譯指令中獲取所需功能模塊的路徑。
在本方法實(shí)施例中,編譯指令可以是一個(gè)腳本文件,運(yùn)行該腳本文件所獲得的輸出信號(hào),將可作為編譯器執(zhí)行編譯操作的開始標(biāo)志。其中,上述輸出信號(hào),即可以理解為:該編譯指令所提供的模塊清單入口地址、或每一功能模塊路徑。
在本方法實(shí)施例中,上述功能模塊可以理解為:用以實(shí)現(xiàn)系統(tǒng)功能的預(yù)配置文件或文件集。通常情況下,上述預(yù)配置文件可以為共享庫(kù)文件;上述預(yù)配置文件集可以為多個(gè)共享庫(kù)文件的集合、或共享庫(kù)文件與可執(zhí)行程序文件的集合,文件集中的每一文件均存放于相同的路徑、且具備相近或相關(guān)的功能,用以配合完成該功能模塊的所支持的系統(tǒng)功能。
本領(lǐng)域技術(shù)人員可以理解的是,每一目標(biāo)文件均可以唯一對(duì)應(yīng)一個(gè)編譯配置文件。該編譯配置文件用于輔助生成其所對(duì)應(yīng)的目標(biāo)文件,具體記錄了該目標(biāo)文件的名稱、該目標(biāo)文件所對(duì)應(yīng)的一個(gè)或多個(gè)源碼文件、以及該目標(biāo)文件或其所對(duì)應(yīng)源碼文件與其它文件的依賴關(guān)系;在這一編譯配置文件中,可以找到上述所有文件的文件路徑,并由此查看該文件內(nèi)部所記錄的、本文件的自然更新時(shí)刻等信息。
本方法實(shí)施例中,編譯器可以通過(guò)遍歷每一功能模塊的路徑的方式,找到每一路徑下共享庫(kù)文件所對(duì)應(yīng)的編譯配置文件、并依次執(zhí)行相應(yīng)操作。
步驟102:編譯器針對(duì)編譯配置文件中記錄的共享庫(kù)文件名稱,判斷以該名稱命名的文件是否存在,并在不存在的情況下,創(chuàng)建以該名稱命名的軟鏈接文件。
本方法實(shí)施例中,當(dāng)在編譯器所遍歷到的功能模塊路徑下,保存的是一編程人員新創(chuàng)建一源碼文件、即該源碼文件從未被編譯生成過(guò)其所對(duì)應(yīng)的目標(biāo)文件時(shí),編譯器將無(wú)法根據(jù)該目標(biāo)文件所對(duì)應(yīng)編譯配置文件中記錄的目標(biāo)文件名稱找到該目標(biāo)文件。此時(shí),編譯器會(huì)在該路徑下,創(chuàng)建一以該目標(biāo)文件名稱命名的軟鏈接文件,且該軟鏈接文件所指向的公共替身文件的自然編譯完成時(shí)刻,已被配置為預(yù)設(shè)編譯完成時(shí)刻,且該預(yù)設(shè)編譯完成時(shí)刻早于系統(tǒng)中任一源碼文件所對(duì)應(yīng)的自然更新時(shí)刻。
創(chuàng)建以目標(biāo)文件命名的軟鏈接文件的目在于:當(dāng)這一新創(chuàng)建源碼文件與另一新創(chuàng)建源碼文件以動(dòng)態(tài)鏈接的方式、形成相互依賴關(guān)系時(shí),編譯器可以在其中任一文件的保存路徑下找到一與未生成目標(biāo)文件同名、且已經(jīng)編譯完成的目標(biāo)文件,以保證該編譯過(guò)程的正常執(zhí)行。其中軟鏈接文件所指向的公共替身文件的生成方式可以為:編譯一個(gè)為空的源碼文件、且該源碼文件不依賴任何其它源碼文件。
上述預(yù)設(shè)編譯完成時(shí)刻可以為系統(tǒng)所支持的最早時(shí)刻,比如,在大多數(shù)操作系統(tǒng)中,系統(tǒng)所支持的最早時(shí)刻為1970年1月1日零點(diǎn)。
步驟103:編譯器針對(duì)所找到的每一編譯配置文件中記錄的共享庫(kù)文件名稱,判斷以該名稱命名的文件的編譯完成時(shí)刻是否早于該共享庫(kù)文件所對(duì)應(yīng)源碼文件的自然更新時(shí)刻;如果是,則對(duì)該共享庫(kù)文件所對(duì)應(yīng)的源碼文件進(jìn)行編譯,以創(chuàng)建該源碼文件對(duì)應(yīng)的共享庫(kù)文件。
本方法實(shí)施例中,編譯器在每次接收到編程人員下達(dá)的編譯指令后,都會(huì)執(zhí)行以上步驟101和102,以保證每一功能模塊路徑下的每一共享庫(kù)文件都存在其文件本身或與其文件本身同名的軟鏈接文件。在此之后,編譯器會(huì)再次對(duì)編譯指令所提供的每一功能模塊的路徑進(jìn)行遍歷,本次遍歷,編譯器會(huì)針對(duì)所找到的每一編譯配置文件中記錄的共享庫(kù)文件名稱,判斷以該名稱命名的文件的自然編譯完成時(shí)刻是否早于該共享庫(kù)文件所對(duì)應(yīng)源碼文件的自然更新時(shí)刻,并在是時(shí)對(duì)該共享庫(kù)文件所對(duì)應(yīng)的源碼文件進(jìn)行編譯,以創(chuàng)建該源碼文件對(duì)應(yīng)的共享庫(kù)文件。由于前述步驟所創(chuàng)建軟鏈接文件所指向的公共替身文件的編譯時(shí)刻已預(yù)配置為一個(gè)比所有源碼文件都早的預(yù)設(shè)編譯完成時(shí)刻,所以上述所有軟鏈接文件都會(huì)觸發(fā)編譯器的重編譯機(jī)制,并被重編譯的真正共享庫(kù)文件覆蓋。至此,每一功能模塊路徑下的共享庫(kù)文件已經(jīng)創(chuàng)建完成。
需要指出的是,本步驟中所述的編譯完成時(shí)刻,可以為自然編譯完成時(shí)刻,也可以為預(yù)設(shè)編譯完成時(shí)刻;但在某一具體時(shí)刻下,每一文件有且僅有一個(gè)編譯完成時(shí)刻。
由以上方法實(shí)施例可以看出,當(dāng)接收到編譯指令,并確定每一功能模塊路徑下尚未存在以編譯配置文件中記錄的共享庫(kù)文件名稱命名的文件時(shí),編譯器會(huì)創(chuàng)建一個(gè)以該名稱命名的軟鏈接文件,而由于軟鏈接文件所指向的公共替身文件的自然編譯完成時(shí)刻,已被配置為預(yù)設(shè)編譯完成時(shí)刻,且該預(yù)設(shè)編譯完成時(shí)刻早于該共享庫(kù)文件所對(duì)應(yīng)源碼文件的自然更新時(shí)刻,故會(huì)觸發(fā)編譯器對(duì)該共享庫(kù)文件所對(duì)應(yīng)源碼文件的重新編譯,在生成真正共享庫(kù)文件的同時(shí),覆蓋掉與該真實(shí)共享庫(kù)文件重名的軟鏈接文件。則當(dāng)系統(tǒng)中存在兩個(gè)或多個(gè)共享庫(kù)文件所對(duì)應(yīng)的源碼文件采用動(dòng)態(tài)鏈接的方式循環(huán)依賴時(shí),由于編譯器在編譯生成真正的共享庫(kù)文件之前,已預(yù)先生成了與真正共享庫(kù)文件同名的、且已編譯完成的軟鏈接文件,故會(huì)不引發(fā)因任一被依賴文件尚未編譯而導(dǎo)致的編譯失敗,從而實(shí)現(xiàn)涉及這些循環(huán)依賴源碼文件的所有編譯過(guò)程正常執(zhí)行。
參見圖2,圖2是本申請(qǐng)一種文件編譯方法的一個(gè)實(shí)施例流程圖。與前述方法實(shí)施例不同的是,本實(shí)施例以一個(gè)具體示例的方式,展示了本申請(qǐng)?jiān)诮鉀Q共享庫(kù)文件間循環(huán)調(diào)用時(shí)所存在的編譯失敗問(wèn)題時(shí)的優(yōu)勢(shì),且更具有實(shí)際操作意義。
假設(shè)編譯指令中共提供了四個(gè)功能模塊的路徑,這些功能模塊分別為模塊A、模塊B、模塊C、模塊D,且它們的路徑依次為路徑A、路徑B、路徑C、路徑D。
其中,路徑A可用于保存共享庫(kù)文件1和可執(zhí)行程序文件1;路徑B可用于保存共享庫(kù)文件2;路徑C可用于保存共享庫(kù)文件3;路徑D可用于保存可執(zhí)行程序文件2。且可執(zhí)行程序文件1需要調(diào)用共享庫(kù)文件1中的函數(shù),共享庫(kù)文件1和共享庫(kù)文件2互相調(diào)用對(duì)方的函數(shù),共享庫(kù)文件3需要調(diào)用共享庫(kù)文件2中的函數(shù),可執(zhí)行程序文件2需要調(diào)用共享庫(kù)文件1、2、3中的函數(shù);且假設(shè)上述每一文件均尚未生成。以下結(jié)合本示例詳細(xì)闡述本申請(qǐng)的核心思想:
步驟201:創(chuàng)建一公共替身文件。
本實(shí)施例中,該公共替身文件為一合法的共享庫(kù)文件,其本身并不包含任何有意義的函數(shù)實(shí)現(xiàn),該文件的自然編譯完成時(shí)刻可配置為1970年1月1日零點(diǎn)。
步驟202:創(chuàng)建一環(huán)境變量。
本實(shí)施例中,該環(huán)境變量可包含第一指示值和第二指示值。其中,第一指示值用以指示當(dāng)前過(guò)程為軟鏈接文件創(chuàng)建過(guò)程,第二指示值用以指示當(dāng)前過(guò)程為共享庫(kù)文件創(chuàng)建過(guò)程。該環(huán)境變量在整個(gè)編譯流程中可見,可創(chuàng)建于每一編譯配置文件的公共部分,也可創(chuàng)建于編譯配置文件之外。
需要指出的是,由于步驟201與步驟202通常由人工完成,故未在圖2中示出。
步驟203:編譯器接收編譯指令。
本實(shí)施例中,該編譯指令可提供一模塊清單的入口地址,該模塊清單中記錄有模塊A、模塊B、模塊C、以及模塊D的路徑。
步驟204:編譯器針對(duì)編譯指令所提供的每一功能模塊的路徑,確定該路徑下共享庫(kù)文件所對(duì)應(yīng)的編譯配置文件。
本實(shí)施例中,本步驟所確定的編譯配置文件具體為共享庫(kù)文件1、共享庫(kù)文件2、以及共享庫(kù)文件3所對(duì)應(yīng)的編譯配置文件。
步驟205:編譯器確認(rèn)環(huán)境變量的指示值取值為第一指示值還是第二指示值,當(dāng)其指示值為第一指示值時(shí),執(zhí)行步驟206;當(dāng)其指示值為第二指示值時(shí),執(zhí)行步驟207。
本實(shí)施例中,環(huán)境變量指示值的默認(rèn)取值為第一指示值,而其取值在編譯流程中的變化在后續(xù)步驟均有體現(xiàn),在此不再贅述。
步驟206:編譯器針對(duì)編譯配置文件中記錄的共享庫(kù)文件名稱,判斷以該名稱命名的文件是否存在,并在不存在的情況下,創(chuàng)建以該名稱命名的軟鏈接文件。
本實(shí)施例中,編譯器將具體判斷上述共享庫(kù)文件1、共享庫(kù)文件2、以及共享庫(kù)文件3是否存在,并在判斷出上述文件均不存在時(shí),分別創(chuàng)建軟鏈接文件1、軟鏈接文件2、以及軟鏈接文件3。其中所創(chuàng)建的軟鏈接文件與其對(duì)應(yīng)的真正的共享庫(kù)文件同名。
本實(shí)施例中,當(dāng)上述文件存在時(shí),編譯器會(huì)繼續(xù)遍歷下一個(gè)功能模塊的路徑,并在遍歷至清單終止標(biāo)志時(shí),將上述環(huán)境變量的指示值配置為第二指示值。
在此之后,編譯器的固有邏輯會(huì)認(rèn)為上述共享庫(kù)文件1、共享庫(kù)文件2、以及共享庫(kù)文件3均已經(jīng)創(chuàng)建完成。
步驟207:針對(duì)所找到的每一編譯配置文件中記錄的共享庫(kù)文件名稱,判斷以該名稱命名的文件的編譯完成時(shí)刻是否早于該共享庫(kù)文件所對(duì)應(yīng)源碼文件的自然更新時(shí)刻;如果是,則對(duì)該共享庫(kù)文件所對(duì)應(yīng)的源碼文件進(jìn)行編譯,以創(chuàng)建該源碼文件對(duì)應(yīng)的共享庫(kù)文件。
本實(shí)施例中,針對(duì)所找到的每一編譯配置文件中記錄的共享庫(kù)文件名稱,編譯器會(huì)判斷出以該名稱命名的文件的自然編譯完成時(shí)刻、即以該名稱命名的軟鏈接文件的編譯完成時(shí)刻,早于該共享庫(kù)文件所對(duì)應(yīng)源碼文件的自然更新時(shí)刻,故會(huì)對(duì)該共享庫(kù)文件所對(duì)應(yīng)的源碼文件進(jìn)行編譯,以創(chuàng)建該源碼文件對(duì)應(yīng)的共享庫(kù)文件。
本實(shí)施例中,如果否,則繼續(xù)遍歷下一個(gè)功能模塊的路徑,并在遍歷至清單終止標(biāo)志時(shí),直接執(zhí)行以下步驟208。
至此,真正的共享庫(kù)文件1、共享庫(kù)文件2、以及共享庫(kù)文件3已經(jīng)創(chuàng)建完成。
步驟208:針對(duì)所找到的每一編譯配置文件中記錄的可執(zhí)行程序文件的名稱,判斷以該名稱命名的可執(zhí)行程序文件是否存在;并在不存在,或者存在、但所存在的可執(zhí)行程序文件的編譯完成時(shí)刻早于該文件所對(duì)應(yīng)的源碼文件的自然更新時(shí)刻時(shí),對(duì)該可執(zhí)行程序文件所對(duì)應(yīng)的源碼文件進(jìn)行編譯,以創(chuàng)建該源碼文件對(duì)應(yīng)的共享庫(kù)文件。
本實(shí)施例中,當(dāng)上述文件存在、且所存在的可執(zhí)行程序文件的自然編譯完成時(shí)刻晚于該文件所對(duì)應(yīng)的源碼文件的自然更新時(shí)刻時(shí),編譯器會(huì)直接遍歷下一個(gè)功能模塊的路徑,并在遍歷至清單終止標(biāo)志時(shí),將上述環(huán)境變量的指示值配置為第一指示值。
至此,可執(zhí)行程序文件1、可執(zhí)行程序文件2已創(chuàng)建完成;即編譯器完成了本實(shí)施例中對(duì)所有目標(biāo)文件的創(chuàng)建。
由以上實(shí)施例可以看出,在本申請(qǐng)所提供的實(shí)現(xiàn)方式中,不論目標(biāo)文件所對(duì)應(yīng)的源碼文件間是否存在循環(huán)依賴關(guān)系、或源碼文件間的依賴關(guān)系如何復(fù)雜,編程人員都無(wú)需對(duì)功能模塊路徑的存放順序進(jìn)行限制。這不僅可以有效降低人工成本,也可同時(shí)提高編程人員的編程效率、以及程序運(yùn)行時(shí)的可靠性。
與前述一種文件編譯方法的實(shí)施例相對(duì)應(yīng),本申請(qǐng)還提供了一種文件編譯裝置的實(shí)施例。
參見圖3,圖3是本申請(qǐng)一種文件編譯裝置結(jié)構(gòu)圖。該裝置可以包括:接收單元301、確定單元302、第一判斷單元304、第一創(chuàng)建單元305、第二判斷單元306、第二創(chuàng)建單元307。
其中,接收單元301,用于接收編譯指令;
確定單元302,用于針對(duì)編譯指令所提供的每一功能模塊的路徑,確定該路徑下共享庫(kù)文件所對(duì)應(yīng)的編譯配置文件,其中,功能模塊為用以實(shí)現(xiàn)系統(tǒng)功能的預(yù)配置文件或文件集;
第一判斷單元304,用于針對(duì)編譯配置文件中記錄的共享庫(kù)文件名稱,判斷以該名稱命名的文件是否存在;
第一創(chuàng)建單元305,用于在以該名稱命名的文件不存在的情況下,創(chuàng)建以該名稱命名的軟鏈接文件;該軟鏈接文件所指向的公共替身文件的自然編譯完成時(shí)刻,已被配置為預(yù)設(shè)編譯完成時(shí)刻,且該預(yù)設(shè)編譯完成時(shí)刻早于系統(tǒng)中任一源碼文件所對(duì)應(yīng)的自然更新時(shí)刻;
第二判斷單元306,用于針對(duì)所找到的每一編譯配置文件中記錄的共享庫(kù)文件名稱,判斷以該名稱命名的文件的自然編譯完成時(shí)刻是否早于該共享庫(kù)文件所對(duì)應(yīng)源碼文件的自然更新時(shí)刻;
第二創(chuàng)建單元307,用于在第二判斷單元306的判斷結(jié)果為是時(shí),對(duì)該共享庫(kù)文件所對(duì)應(yīng)的源碼文件進(jìn)行編譯,以創(chuàng)建該源碼文件對(duì)應(yīng)的共享庫(kù)文件。
在本實(shí)施例的第一種實(shí)現(xiàn)方式中,每一功能模塊的路徑記錄于一模塊清單,該模塊清單的入口地址由所接收到的編譯指令攜帶,且該模塊清單所記錄的功能模塊的路徑,以任意順序排列。
在本實(shí)施例的第二種實(shí)現(xiàn)方式中,預(yù)設(shè)編譯完成時(shí)刻為:系統(tǒng)所支持的最早時(shí)刻。
在本實(shí)施例的第三種實(shí)現(xiàn)方式中,上述裝置還可以包括:第三判斷單元308、第三創(chuàng)建單元309,具體可參見圖4,圖4是本申請(qǐng)一種文件編譯裝置的第二種結(jié)構(gòu)圖。
其中,第三判斷單元308,用于針對(duì)所找到的每一編譯配置文件中記錄的可執(zhí)行程序文件的名稱,判斷以該名稱命名的可執(zhí)行程序文件是否存在;
第三創(chuàng)建單元309,用于在可執(zhí)行程序文件不存在,或者存在、但所存在的可執(zhí)行程序文件的自然編譯完成時(shí)刻早于該文件所對(duì)應(yīng)的源碼文件的自然更新時(shí)刻時(shí),對(duì)該可執(zhí)行程序文件所對(duì)應(yīng)的源碼文件進(jìn)行編譯,以創(chuàng)建該源碼文件對(duì)應(yīng)的共享庫(kù)文件。
在本實(shí)施例的第四種實(shí)現(xiàn)方式中,上述裝置還可以包括:變量創(chuàng)建單元300、確認(rèn)單元303,具體可參見圖5,圖5是本申請(qǐng)一種文件編譯裝置的第三種結(jié)構(gòu)圖。
其中,變量創(chuàng)建單元300,用于創(chuàng)建一包含第一指示值和第二指示值的環(huán)境變量,第一指示值用以指示當(dāng)前為軟鏈接文件創(chuàng)建過(guò)程,第二指示值用以指示當(dāng)前為共享庫(kù)文件創(chuàng)建過(guò)程;
上述裝置還可以包括:確認(rèn)單元303,用于在確定該路徑下共享庫(kù)文件所對(duì)應(yīng)的編譯配置文件之后,確認(rèn)環(huán)境變量的指示值取值,并根據(jù)確認(rèn)出的指示值取值,對(duì)軟鏈接文件或共享庫(kù)文件進(jìn)行創(chuàng)建。
由以上裝置實(shí)施例可得,當(dāng)接收到編譯指令,并確定每一功能模塊路徑下尚未存在以編譯配置文件中記錄的共享庫(kù)文件名稱命名的文件時(shí),編譯器會(huì)創(chuàng)建一個(gè)以該名稱命名的軟鏈接文件,而由于軟鏈接文件所指向的公共替身文件的自然編譯完成時(shí)刻,已被配置為預(yù)設(shè)編譯完成時(shí)刻,且該預(yù)設(shè)編譯完成時(shí)刻早于該共享庫(kù)文件所對(duì)應(yīng)源碼文件的自然更新時(shí)刻,故會(huì)觸發(fā)編譯器對(duì)該共享庫(kù)文件所對(duì)應(yīng)源碼文件的重新編譯,在生成真正共享庫(kù)文件的同時(shí),覆蓋掉與該真實(shí)共享庫(kù)文件重名的軟鏈接文件。則當(dāng)系統(tǒng)中存在兩個(gè)或多個(gè)共享庫(kù)文件所對(duì)應(yīng)的源碼文件采用動(dòng)態(tài)鏈接的方式循環(huán)依賴時(shí),由于編譯器在編譯生成真正的共享庫(kù)文件之前,已預(yù)先生成了與真正共享庫(kù)文件同名的、且已編譯完成的軟鏈接文件,故會(huì)不引發(fā)因任一被依賴文件尚未編譯而導(dǎo)致的編譯失敗,從而實(shí)現(xiàn)涉及這些循環(huán)依賴源碼文件的所有編譯過(guò)程正常執(zhí)行。
上述裝置中各個(gè)單元的功能和作用的實(shí)現(xiàn)過(guò)程具體詳見上述方法中對(duì)應(yīng)步驟的實(shí)現(xiàn)過(guò)程,在此不再贅述。
對(duì)于裝置實(shí)施例而言,由于其基本對(duì)應(yīng)于方法實(shí)施例,所以相關(guān)之處參見方法實(shí)施例的部分說(shuō)明即可。以上所描述的裝置實(shí)施例僅僅是示意性的,其中作為分離部件說(shuō)明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上??梢愿鶕?jù)實(shí)際的需要選擇其中的部分或者全部模塊來(lái)實(shí)現(xiàn)本申請(qǐng)方案的目的。本領(lǐng)域普通技術(shù)人員在不付出創(chuàng)造性勞動(dòng)的情況下,即可以理解并實(shí)施。
以上僅為本申請(qǐng)的較佳實(shí)施例而已,并不用以限制本申請(qǐng),凡在本申請(qǐng)的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本申請(qǐng)保護(hù)的范圍之內(nèi)。