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