C程序編譯方法及編譯器的制造方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及通信技術(shù)領(lǐng)域,尤其涉及一種C程序編譯方法及編譯器。
【背景技術(shù)】
[0002]C語言被廣泛應(yīng)用于開發(fā)各種系統(tǒng)軟件,如操作系統(tǒng)、編譯器、嵌入式系統(tǒng)、并行計(jì)算等,因此,針對各種目標(biāo)機(jī)器的C程序編譯器也層出不窮。C程序編譯器的功能就是將用戶的C程序轉(zhuǎn)換成語義等價的目標(biāo)機(jī)程序。在經(jīng)典編譯架構(gòu)中,編譯過程通常被劃分為5個串行的模塊,即:詞法分析、語法分析、語義分析及中間代碼生成、中間代碼優(yōu)化、目標(biāo)代碼生成。通常將詞法分析、語法分析、語義分析及中間代碼生成階段合稱為前端,將中間代碼優(yōu)化、目標(biāo)代碼生成階段合稱為后端。前端主要完成與源語言相關(guān)的各類分析工作,而后端主要涉及與目標(biāo)機(jī)相關(guān)的各類轉(zhuǎn)換、生成工作。隨著用戶C程序規(guī)模及復(fù)雜程度不斷增大,編譯過程將耗費(fèi)更多的時間。
[0003]現(xiàn)有技術(shù)中,中間代碼優(yōu)化和目標(biāo)代碼生成均是以C程序的文件為單位執(zhí)行的,需要逐一的處理文件中的各個函數(shù),速度很慢,導(dǎo)致編譯過程中后端的階段非常耗時。因此,降低后端階段的耗時,減少C程序編譯時間,從而提高C程序編譯效率成為亟待解決的問題。
【發(fā)明內(nèi)容】
[0004]本發(fā)明提供一種C程序編譯方法及編譯器,能夠降低后端階段的耗時,從而提高C程序編譯效率。
[0005]一方面,本發(fā)明提供一種C程序編譯方法,包括:依次對C程序進(jìn)行詞法分析、語法分析、語義分析及中間代碼生成,
[0006]將經(jīng)過所述語義分析及中間代碼生成的C程序以函數(shù)為單位分配在至少兩個線程上,以分別進(jìn)行中間代碼優(yōu)化;
[0007]對經(jīng)過所述中間代碼優(yōu)化的C程序進(jìn)行目標(biāo)代碼生成。
[0008]另一方面,本發(fā)明提供一種C程序編譯器,包括:用于對C程序進(jìn)行詞法分析的詞法分析器、用于對詞法分析后的C程序進(jìn)行語法分析的語法分析器、用于對語法分析后的C程序進(jìn)行語義分析及中間代碼生成的語義分析及中間代碼生成器、中間代碼優(yōu)化器和目標(biāo)代碼生成器,
[0009]所述中間代碼優(yōu)化器,用于將經(jīng)過所述語義分析及中間代碼生成的C程序以函數(shù)為單位分配在至少兩個線程上,以分別進(jìn)行中間代碼優(yōu)化;
[0010]所述目標(biāo)代碼生成器,用于對經(jīng)過所述中間代碼優(yōu)化的C程序進(jìn)行目標(biāo)代碼生成。
[0011]本發(fā)明提供的C程序編譯方法及編譯器,依次對C程序進(jìn)行詞法分析、語法分析、語義分析及中間代碼生成,將經(jīng)過語義分析及中間代碼生成的C程序以函數(shù)為單位分配在至少兩個線程上,以分別進(jìn)行中間代碼優(yōu)化;對經(jīng)過中間代碼優(yōu)化的C程序進(jìn)行目標(biāo)代碼生成。這樣一來,編譯器在進(jìn)行中間代碼優(yōu)化時,可以以函數(shù)為單位,在提供的至少兩個線程上并行的處理各函數(shù),加快了優(yōu)化的速度,進(jìn)而減少了 C程序編譯時間,提高了 C程序編譯效率。
【附圖說明】
[0012]為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作一簡單地介紹,顯而易見地,下面描述中的附圖是本發(fā)明的一些實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0013]圖1為本發(fā)明提供的C程序編譯方法的流程示意圖;
[0014]圖2為本發(fā)明提供的另一 C程序編譯方法的流程示意圖;
[0015]圖3為本發(fā)明提供的符號系統(tǒng)的結(jié)構(gòu)示意圖;
[0016]圖4為本發(fā)明提供的編譯并行方法的流程示意圖;
[0017]圖5為本發(fā)明C程序編譯器的結(jié)構(gòu)示意圖;
[0018]圖6為本發(fā)明另一 C程序編譯器的結(jié)構(gòu)示意圖;
[0019]圖7為本發(fā)明再一 C程序編譯器的結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0020]為使本發(fā)明實(shí)施例的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例。基于本發(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
[0021]圖1為本發(fā)明提供的C程序編譯方法的流程示意圖,如圖1所示,該方法包括:
[0022]SlOUC程序編譯器依次對C程序進(jìn)行詞法分析、語法分析、語義分析及中間代碼生成。
[0023]需要說明的是,詞法分析、語法分析、語義分析及中間代碼生成,主要完成與源語言相關(guān)的各類分析工作,如對組成C程序文件的各個函數(shù)進(jìn)行分析以得到各個函數(shù)的信息如函數(shù)長度等等。
[0024]S102、C程序編譯器將經(jīng)過語義分析及中間代碼生成的C程序以函數(shù)為單位分配在至少兩個線程上,以分別進(jìn)行中間代碼優(yōu)化。
[0025]進(jìn)一步地,編譯器可以將中間代碼以函數(shù)為單位獨(dú)立組織,即為每個函數(shù)分配一個優(yōu)化線程,并將所有線程加入線程池,由操作系統(tǒng)統(tǒng)一調(diào)度,如,中央處理器(CenterProcess Unit, CPU)可支持的線程為4個,該的包括的函數(shù)為6個,其函數(shù)長度經(jīng)過前端分析確定為:一個較長的函數(shù),三個很短的函數(shù)和兩個中等長度的函數(shù),這時,可以將較長的函數(shù)分配到一個線程上,其他兩個中等長度的函數(shù)各分配一個線程,最后將三個很短的函數(shù)分配到同一個線程上;或者,將較長的函數(shù)分配到一個線程上,其他兩個中等長度的函數(shù)各分配一個線程,并在其各自的線程上也分別分配一個很短的函數(shù),將最后一個很短的線程分配到另一個空置的線程上等等,此處僅僅舉例說明可以根據(jù)函數(shù)的長度分配到不同的線程上,但不以上述分配方式做任何限定。且保護(hù)范圍不限于上述舉例,以前端分析得出的其他函數(shù)信息的分配方法均在保護(hù)范圍之內(nèi)。
[0026]進(jìn)一步地,在線程上的函數(shù)可以以各函數(shù)為單位分別優(yōu)化,優(yōu)化可以使得C程序編譯出的執(zhí)行程序執(zhí)行加快或者C程序編譯出的文件較小,分別優(yōu)化可以加快優(yōu)化的速度。
[0027]S103、C程序編譯器對經(jīng)過中間代碼優(yōu)化的C程序進(jìn)行目標(biāo)代碼生成。
[0028]進(jìn)一步地,編譯器可以對上述優(yōu)化后的C程序進(jìn)行目標(biāo)代碼生成,C程序可以是分別利用上述線程以函數(shù)為單位并行進(jìn)行代碼生成,還可以是以其他方式分配在不同線程上以函數(shù)為單位并行進(jìn)行代碼生成。
[0029]本發(fā)明提供的C程序編譯方法,依次對C程序進(jìn)行詞法分析、語法分析、語義分析及中間代碼生成,將經(jīng)過語義分析及中間代碼生成的C程序以函數(shù)為單位分配在至少兩個線程上,以分別進(jìn)行中間代碼優(yōu)化;對經(jīng)過中間代碼優(yōu)化的C程序進(jìn)行目標(biāo)代碼生成。這樣一來,編譯器在進(jìn)行中間代碼優(yōu)化時,可以以函數(shù)為單位,在提供的至少兩個線程上并行的處理各函數(shù),加快了優(yōu)化的速度,進(jìn)而減少了 C程序編譯時間,提高了 C程序編譯效率。
[0030]下面采用具體的實(shí)施例,對圖1所示方法實(shí)施例的技術(shù)方案進(jìn)行詳細(xì)說明。
[0031]圖2為本發(fā)明提供的另一 C程序編譯方法的流程示意圖,如圖2所示,該方法包括:
[0032]S201、C程序編譯器依次對C程序進(jìn)行詞法分析、語法分析、語義分析及中間代碼生成獲取C程序中各函數(shù)的信息。
[0033]S202、C程序編譯器根據(jù)獲取的C程序中各函數(shù)的信息將各函數(shù)分配在CPU可支持的至少兩個線程上。
[0034]舉例來說,各函數(shù)的信息可以是函數(shù)長度,或者該函數(shù)執(zhí)行優(yōu)化的歷史參照時間長短等。
[0035]S203、C程序編譯器為各函數(shù)對應(yīng)分配一個符號訪問接口,符號訪問接口與全局符號數(shù)據(jù)相連,且與函數(shù)對應(yīng)的局部符號數(shù)據(jù)相連。
[0036]舉例來說,圖3為本發(fā)明提供的符號系統(tǒng)的結(jié)構(gòu)示意圖,符號系統(tǒng)是編譯器的數(shù)據(jù)中心,主要定義了編譯過程中各種數(shù)據(jù)結(jié)構(gòu)及其訪問接口,如符號信息、類型系統(tǒng)、抽象語法樹等。如圖3所示,本發(fā)明考慮到后端多線程對符號系統(tǒng)的并發(fā)訪問,因此對于符號系統(tǒng)設(shè)計(jì)也是以函數(shù)為并發(fā)控制粒度設(shè)計(jì)的:為C程序中的每個函數(shù)提供一個符號訪問接口,該符號訪問接口與全局符號數(shù)據(jù)相連,使得函數(shù)可以改寫全局符號,且該符號訪問接口與該函數(shù)對應(yīng)的局部符號數(shù)據(jù)相連,使得該函數(shù)可以改寫自己的局部符號。
[0037]S204、C程序編譯器在分配到的線程上對各函數(shù)進(jìn)行優(yōu)化,優(yōu)化至少包括各函數(shù)分別通過對應(yīng)的符號訪問接口對全局符號中函數(shù)需改寫的符號進(jìn)行標(biāo)記,并通過符號訪問接口在函數(shù)對應(yīng)的局部符號中改寫需改寫的符號。
[0038]進(jìn)一步地,本實(shí)施例只是描繪了在編譯優(yōu)化過程中針對并行編譯模式設(shè)計(jì)的一個數(shù)據(jù)訪問控制機(jī)制,并不是以此概括所有的編譯優(yōu)化方法,優(yōu)化并不以此舉例為限定。
[0039]舉例來說,符號可以是變量、變量類型、變量結(jié)構(gòu)信息,字段,訪問權(quán)限等等,改寫可以是函數(shù)對符號的使用或?qū)Ψ柕亩x,如函數(shù)XXl通過XXl函數(shù)的符號訪問接口使用了一次其函數(shù)自身的局部變量,該局部變量會記錄下這次使用,或者,也可以是對全局變量的改寫或定義。
[0040]進(jìn)一步地,在函數(shù)在各線程上并發(fā)優(yōu)化時,符號系統(tǒng)會為全局符號建立一份完整的映射,再針對每個函數(shù)的形成屬于該函數(shù)的局部符號,這部分的數(shù)據(jù)是可以改寫的。即為每個函數(shù)提供一個獨(dú)立的符號訪問接口,該符號訪問接口數(shù)據(jù)相連的符號系統(tǒng)提供的全局符號可讀取且可標(biāo)記需改寫的內(nèi)容,局部符號可改寫,使得在線程上并行優(yōu)化的各函數(shù)可以分別通過相應(yīng)的符號訪問接口同時與符號系統(tǒng)交互,讀取全局符號并分別改寫其對應(yīng)的局部符號。除了函數(shù)符號訪問接口之外,符號系統(tǒng)還提供了一個全局符號更新接口,該接口主要用于編譯過程中對全局符號進(jìn)行更新。
[0041]S205、C程序編譯器對各線程上完成優(yōu)化的函數(shù)進(jìn)行數(shù)據(jù)維護(hù),數(shù)據(jù)維護(hù)為根據(jù)全局符號中各符號上的標(biāo)記更新全局符號。
[0042]進(jìn)一步地,為保證符號信息及中間代碼的一致性、完整性,所有優(yōu)化線程執(zhí)行完畢后,可以對各線程的優(yōu)化結(jié)果合并、整理,并通知符號系統(tǒng)進(jìn)行數(shù)據(jù)維護(hù)。
[0043]舉例來說,編譯器可以將所有函數(shù)對某個全局符號的改寫整合在一起,如對于一個全局變量a,標(biāo)記有函數(shù)XXl對它進(jìn)行了一次定義,函數(shù)XX2使用了它一次,那么整合的時候可以將函數(shù)XXl對它進(jìn)行了一次定義,函數(shù)XX2使用了它一次對應(yīng)記錄在這個全局符號a里,并保留這個全局符號a ;如對某一個全局變量b,沒有任何標(biāo)記,即函數(shù)XXl沒有對它進(jìn)行改寫,函數(shù)XX2也沒有對它進(jìn)行改寫,統(tǒng)計(jì)發(fā)現(xiàn)也沒有任何該C程序中的其他函數(shù)對b進(jìn)行過改寫,那么整合的時候可以全局符號里的b刪除。這樣可以根據(jù)符號的信息將優(yōu)化等編譯過程中對符號的改寫記錄下來,一方面可以刪除不需要的符號節(jié)省資源,另一方面可以提高后續(xù)調(diào)試的準(zhǔn)確度。
[0044]S206、C程序