一種面向主機(jī)系統(tǒng)的代碼重定位方法及其系統(tǒng)的制作方法
【專利摘要】本發(fā)明提供一種面向主機(jī)系統(tǒng)的代碼重定位方法,在獲得了以插樁代碼進(jìn)行標(biāo)識的第一中間文件之后,將第一中間文件中的源代碼進(jìn)行標(biāo)準(zhǔn)C函數(shù)的展開,從而獲得了按照代碼行展開的第二中間文件,之后,進(jìn)行代碼行的語法分析時,對抽象語義樹上的各節(jié)點(diǎn)進(jìn)行了代碼行數(shù)的標(biāo)記,這樣,確保了中間語言代碼與源代碼之間的精確映射,在后續(xù)的代碼優(yōu)化和機(jī)器指令生成中,仍能確保這種精確的映射關(guān)系,從而,實(shí)現(xiàn)了機(jī)器指令與源代碼之間的精確映射關(guān)系,實(shí)現(xiàn)調(diào)試過程中的代碼精確定位。
【專利說明】
一種面向主機(jī)系統(tǒng)的代碼重定位方法及其系統(tǒng)
技術(shù)領(lǐng)域
[0001] 本發(fā)明涉及計(jì)算機(jī)程序編譯領(lǐng)域,特別涉及一種面向主機(jī)系統(tǒng)的代碼重定位方法 及系統(tǒng)。
【背景技術(shù)】
[0002] 代碼重定位技術(shù)被廣泛應(yīng)用于調(diào)試器中,在調(diào)試過程中的目標(biāo)代碼通常需要附加 調(diào)試信息,調(diào)試信息是在編譯器生成機(jī)器碼時一起產(chǎn)生,代表著可執(zhí)行代碼和源代碼之間 的關(guān)系,這個信息以預(yù)定義的格式進(jìn)行編碼,并同機(jī)器碼一起存儲,在可執(zhí)行代碼中對源代 碼到機(jī)器碼做全部映射。
[0003] 調(diào)試信息可以按照可讀的形式進(jìn)行解讀,其在調(diào)試過程中起到非常重要的作用, 例如,當(dāng)在某一行上設(shè)定斷點(diǎn)時,利用調(diào)試信息中的行信息找到實(shí)際應(yīng)該陷入的地址;當(dāng)某 個指令引起段錯誤時,利用調(diào)試信息中的行信息找到源代碼中的對應(yīng)行號,以便于進(jìn)行修 改??梢钥吹?,調(diào)試信息中的行信息可以在源代碼與機(jī)器碼之間建立雙向的對應(yīng)關(guān)系,便于 程序的調(diào)試。
[0004] 在現(xiàn)有技術(shù)面向主機(jī)系統(tǒng)的代碼重定位方法中,在生成調(diào)試器用的可執(zhí)行代碼 時,僅對靜態(tài)編譯類語言源代碼,如C、C++等進(jìn)行載入,并在載入時記載源代碼的行信息,然 而,靜態(tài)編譯類源代碼中包含有頭文件以及宏定義等代碼,這些代碼在預(yù)處理中都會進(jìn)行 展開,會影響源代碼的行數(shù),這樣,會導(dǎo)致源代碼與機(jī)器碼之間建立的雙向?qū)?yīng)關(guān)系并不精 確,在后續(xù)調(diào)試過程中,不能夠精確的定位到源代碼中的具體錯誤的行號處。
[0005] 此外,在銀行業(yè)應(yīng)用的主機(jī)系統(tǒng)為主流的IBM產(chǎn)品,由于行業(yè)應(yīng)用的特殊背景,在 金融系統(tǒng)中,利用C語言開發(fā)的源代碼中,通常還包括數(shù)據(jù)庫操作代碼以及進(jìn)行聯(lián)機(jī)交易過 程中所需要的對主機(jī)CICS(Customer Information Control System,客戶信息控制系統(tǒng)) 相關(guān)的操作代碼,而現(xiàn)有技術(shù)中,并沒有對這方面進(jìn)行響應(yīng)的代碼重定位處理,使得調(diào)試過 程不易進(jìn)行錯誤定位,導(dǎo)致調(diào)試效率低。
【發(fā)明內(nèi)容】
[0006] 有鑒于此,本發(fā)明的目的在于提供一種面向主機(jī)系統(tǒng)的代碼重定位方法及其系 統(tǒng),實(shí)現(xiàn)精確定位。
[0007] 為實(shí)現(xiàn)上述目的,本發(fā)明有如下技術(shù)方案:
[0008] -種面向主機(jī)系統(tǒng)的代碼重定位方法,包括:
[0009] SOl,對源代碼按照語句行或語句塊進(jìn)行插粧,以獲得第一中間文件,插粧代碼包 括助記符和行數(shù)標(biāo)識;
[0010] S02,至少將第一中間文件中的頭文件和宏定義進(jìn)行標(biāo)準(zhǔn)C函數(shù)的展開,以獲得第 二中間文件;
[0011] S03,對第二中間文件進(jìn)行語法分析,生成抽象語義樹,并記錄插粧代碼所在代碼 行數(shù),抽象語義樹上的各節(jié)點(diǎn)進(jìn)行了代碼行數(shù)的標(biāo)記,而后,生成中間語言代碼;
[0012] S04,對中間語言代碼進(jìn)行代碼優(yōu)化;
[0013] S05,基于優(yōu)化后的中間語言代碼,生成機(jī)器指令。
[0014]可選地,在步驟S02中,還包括:將第一中間文件中的SQL語句和/或CICS語句進(jìn)行 標(biāo)準(zhǔn)C函數(shù)的展開。
[0015] 可選地,對第二中間文件進(jìn)行語法分析,生成抽象語義樹,并記錄插粧代碼所在代 碼行數(shù),抽象語義樹上的各節(jié)點(diǎn)進(jìn)行了代碼行數(shù)的標(biāo)記的步驟包括:
[0016] 對第二中間文件中的代碼行逐行進(jìn)行語法分析,生成抽象語義樹,并記錄插粧代 碼所在的代碼行數(shù),對一個代碼行進(jìn)行語法分析的步驟包括:對代碼行進(jìn)行語法分析后,在 該代碼行上創(chuàng)建節(jié)點(diǎn),并以該節(jié)點(diǎn)向前遍歷,直到遇到插粧代碼為止,向前遍歷的行數(shù)與插 粧代碼所在代碼行的行數(shù)之和作為該代碼行的代碼行數(shù),并標(biāo)記在該代碼行。
[0017] 可選地,對中間語言代碼進(jìn)行代碼優(yōu)化包括中間語言代碼的移動、合并、刪除或展 開。
[0018] 此外,本發(fā)明還提供了一種面向主機(jī)系統(tǒng)的代碼重定位系統(tǒng),包括:
[0019] 插粧單元,用于對源代碼按照語句行或語句塊進(jìn)行插粧,以獲得第一中間文件,插 粧代碼包括助記符和行數(shù)標(biāo)識;
[0020] 展開單元,用于至少將第一中間文件中的頭文件和宏定義進(jìn)行標(biāo)準(zhǔn)C函數(shù)的展開, 以獲得第二中間文件;
[0021] 前端映射單元,用于對第二中間文件進(jìn)行語法分析,生成抽象語義樹,并記錄插粧 代碼所在代碼行數(shù),抽象語義樹上的各節(jié)點(diǎn)進(jìn)行了代碼行數(shù)的標(biāo)記,而后,生成中間語言代 碼;
[0022] 后端映射單元,用于對中間語言代碼進(jìn)行代碼優(yōu)化;
[0023] 代碼生成單元,用于基于優(yōu)化后的中間語言代碼,生成機(jī)器指令。
[0024] 可選地,展開單元還用于將第一中間文件中的SQL語句和/或CICS語句進(jìn)行標(biāo)準(zhǔn)C 函數(shù)的展開。
[0025] 可選地,前端映射單元中,對第二中間文件中的代碼行逐行進(jìn)行語法分析,生成抽 象語義樹,并記錄插粧代碼所在的代碼行數(shù),對一個代碼行進(jìn)行語法分析的步驟包括:對代 碼行進(jìn)行語法分析后,在該代碼行上創(chuàng)建節(jié)點(diǎn),并以該節(jié)點(diǎn)向前遍歷,直到遇到插粧代碼為 止,向前遍歷的行數(shù)與插粧代碼所在代碼行的行數(shù)之和作為該代碼行的代碼行數(shù),并標(biāo)記 在該代碼行。
[0026] 可選地,對中間語言代碼進(jìn)行代碼優(yōu)化包括中間語言代碼的移動、合并、刪除和/ 或展開。
[0027] 本發(fā)明實(shí)施例提供的面向主機(jī)系統(tǒng)的代碼重定位方法及其系統(tǒng),在獲得了以插粧 代碼進(jìn)行標(biāo)識的第一中間文件之后,將第一中間文件中的源代碼進(jìn)行標(biāo)準(zhǔn)C函數(shù)的展開,從 而獲得了按照代碼行展開的第二中間文件,之后,進(jìn)行代碼行的語法分析時,對抽象語義樹 上的各節(jié)點(diǎn)進(jìn)行了代碼行數(shù)的標(biāo)記,這樣,確保了中間語言代碼與源代碼之間的精確映射, 在后續(xù)的代碼優(yōu)化和機(jī)器指令生成中,仍能確保這種精確的映射關(guān)系,從而,實(shí)現(xiàn)了機(jī)器指 令與源代碼之間的精確映射關(guān)系,實(shí)現(xiàn)調(diào)試過程中的代碼精確定位。
【附圖說明】
[0028] 為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實(shí)施例或現(xiàn) 有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖是本發(fā)明 的一些實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù) 這些附圖獲得其他的附圖。
[0029] 圖1示出了根據(jù)本發(fā)明實(shí)施例的面向主機(jī)系統(tǒng)的代碼重定位方法的流程圖;
[0030]圖2示出了根據(jù)本發(fā)明實(shí)施例的面向主機(jī)系統(tǒng)的代碼重定位系統(tǒng)的結(jié)構(gòu)示意圖。
【具體實(shí)施方式】
[0031] 為使本發(fā)明實(shí)施例的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本發(fā)明實(shí)施例 中的附圖,對本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是 本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員 在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
[0032] 參考圖1所示,本發(fā)明提出了一種代碼重定位方法,面向主機(jī)系統(tǒng),主要應(yīng)用于銀 行等金融系統(tǒng),主要利用C語言開發(fā)源代碼。在該方法中,在獲得了以插粧代碼進(jìn)行標(biāo)識的 第一中間文件之后,將第一中間文件中的源代碼進(jìn)行標(biāo)準(zhǔn)C函數(shù)的展開,從而獲得了按照代 碼行展開的第二中間文件,之后,進(jìn)行代碼行的語法分析時,對抽象語義樹上的各節(jié)點(diǎn)進(jìn)行 了代碼行數(shù)的標(biāo)記,這樣,確保了中間語言代碼與源代碼之間的精確映射,在后續(xù)的代碼優(yōu) 化和機(jī)器指令生成中,仍能確保這種精確的映射關(guān)系,從而,實(shí)現(xiàn)了機(jī)器指令與源代碼之間 的精確映射關(guān)系,實(shí)現(xiàn)調(diào)試過程中的代碼精確定位。
[0033] 為了更好地理解本發(fā)明的技術(shù)方案和技術(shù)效果,以下將結(jié)合流程圖對具體的實(shí)施 例進(jìn)行詳細(xì)的描述。
[0034] 在步驟SOl,對源代碼按照語句行或語句塊進(jìn)行插粧,以獲得第一中間文件,插粧 代碼包括助記符和行數(shù)標(biāo)識。
[0035] 在該步驟中,對源代碼進(jìn)行了插粧,插粧時按照語言邏輯進(jìn)行,根據(jù)不同的需要, 可以按照完整的語句塊進(jìn)行插粧,也可以按照語句行進(jìn)行插粧。源代碼中包括頭文件、宏定 義等標(biāo)準(zhǔn)C語言定義,以及SQL語句和CICS語句兩種非標(biāo)準(zhǔn)C語言定義。在插粧之后,一方面 實(shí)現(xiàn)了對源代碼行數(shù)的標(biāo)記,另一方面記錄了源代碼中頭文件、宏定義以及SQL語句、CICS 語句的相對位置。
[0036] 在該實(shí)施例中,面向的主機(jī)系統(tǒng)為主流的IBM系統(tǒng),該系統(tǒng)中主要利用C語言開發(fā) 的源代碼中,通常還包括數(shù)據(jù)庫操作代碼以及進(jìn)行聯(lián)機(jī)交易過程中所需要的對主機(jī)CICS (Customer Information Control System,客戶信息控制系統(tǒng))相關(guān)的操作代碼。
[0037] 插粧代碼包括助記符和行數(shù)標(biāo)識,該插粧代碼為偽代碼,在源代碼中起到標(biāo)識及 行數(shù)記錄的作用,助記符起到標(biāo)識該處插入的為行信息的偽代碼,助記符例如可以為@ line,行數(shù)標(biāo)識可以用數(shù)字表示,行數(shù)標(biāo)識的數(shù)字可以為代碼行的實(shí)際行數(shù),可以在源代碼 中的語句塊或語句行之前插入插粧代碼,語句塊為可以完整表達(dá)語義的一行或多行語句組 成,一般具有固定的表達(dá)方式,如根據(jù)關(guān)鍵字符、起始和結(jié)束成對出現(xiàn)的函數(shù)等來實(shí)現(xiàn)語義 行的識別,關(guān)鍵字符例如';等。語句行為表達(dá)一個語義的代碼行,通常為一個函數(shù)表 達(dá)。以下以一段源代碼為例,對該段源代碼進(jìn)行插粧,以便于更好地理解本發(fā)明實(shí)施例的插 粧步驟。 ip.ine I j#irii'lude <^v<;d?fs,h> |#prag^a csect(cod€,w^EWmEDii} j#eod!f j^Line 6 j ir?t ms in ( void) { j#Line 7 ? 總mset《ridfM,64}; Inline B j shsred .datd .ptr ::: NULLi Ifiine 9 CwLOADh, "PROGRAM", wSETw, mHOLDh, wRESPw>W8ESP2W}· I di:s L娜 P職綱(dat獅duk) 丨 SE丁(shsred dsta-ptr)
[0038] j 圓 ~ 丨 職SP1 < res pvs 1)瓶SP2 ( resp2vs 1); inline 13 I if {{respval) || (resplval)) { Ifiirie 14 I printf(iiEXivC CICS LOAD with IIDiD for failed vdt^5 response Ci>des\ i and %dV》w> I datemodule, respvsiA resplva.I).; Inline I? i retUro(^l); ipLiae 18 Γ } inline 20 !>
[0039] 可以看到,在該段代碼中,以O(shè)line+行數(shù)進(jìn)行插粧,在完整的語句塊或語句行之前 進(jìn)行插粧代碼的插入,在該具體的代碼中,#ifdef 為一段完整的語句塊,在其 起始處插入插粧代碼Oline 1,之后在int main函數(shù)之前插入插粧代碼Oline 1,插粧代碼@ line 9至插粧代碼Oline 13之間的語句塊為CICS的執(zhí)行語句,而Oline 6、@line 7、@line 8、@line 13、@line 17等都是在語句行之前進(jìn)行的插粧代碼的插入,這樣,就在該段源代碼 中按照語義行進(jìn)行了插粧,插粧后的代碼記做第一中間文件。以上僅為示例,根據(jù)具體的需 要,可以在需要的語句塊或語句行之前插入插粧代碼。
[0040] 在步驟S02,至少將第一中間文件中的頭文件和宏定義進(jìn)行標(biāo)準(zhǔn)C函數(shù)的展開,以 獲得第二中間文件。
[0041] 在該步驟中,將插粧后的源代碼,即第一中間文件,進(jìn)行標(biāo)準(zhǔn)C函數(shù)的展開,在展開 時,至少將頭文件和宏定義進(jìn)行標(biāo)準(zhǔn)C函數(shù)的展開,以便于在按照代碼行進(jìn)行后續(xù)的步驟, 以實(shí)現(xiàn)精確的映射。更優(yōu)地,可以進(jìn)一步將第一中間文件中的SQL語句和/或CICS語句進(jìn)行 標(biāo)準(zhǔn)C函數(shù)的展開,這樣,對源代碼中的關(guān)鍵的語句都進(jìn)行了展開,獲得了包含代碼行的具 有插粧代碼的第二中間文件。
[0042] 在進(jìn)行標(biāo)準(zhǔn)C函數(shù)的展開時,是將頭文件和宏定義、SQL語句和/或CICS語句拆分成 表示語法的代碼行。
[0043] 具體的,對于頭文件,是將第一中間文件中的頭文件替換為頭文件的實(shí)際代碼,在 第一中間文件頭文件所在的位置處將頭文件進(jìn)行替換,這樣,頭文件就進(jìn)行了標(biāo)準(zhǔn)C函數(shù)的 展開,以代碼行的形式出現(xiàn)在原頭文件所在位置處。
[0044] 對于宏定義,同頭文件的處理,是將第一中間文件中宏定義替換為宏定義的實(shí)際 代碼,在第一中間文件宏定義所在的位置處將宏定義進(jìn)行替換,這樣,宏定義就進(jìn)行了標(biāo)準(zhǔn) C函數(shù)的展開,以代碼行的形式出現(xiàn)在原宏定義所在位置處。
[0045] 對于CICS語句的C函數(shù)翻譯,主要是進(jìn)行了參數(shù)傳遞和函數(shù)調(diào)用,從而將CICS語句 展開為標(biāo)準(zhǔn)C函數(shù)。以如下CICS語句為例子,進(jìn)行CICS語句標(biāo)準(zhǔn)C函數(shù)展開的說明:
[0046] EXEC CICS WRITEQ TS QUEUE("ZHTST,,)FROM(aa)LENGTH(strlen(aa));
[0047] 將該CICS語句進(jìn)行參數(shù)傳遞和函數(shù)調(diào)用之后,實(shí)現(xiàn)了標(biāo)準(zhǔn)C函數(shù)的展開,在展開之 后,變?yōu)槿缦露鄺l語句: { dl'hb0020=slrlcn{aa);
[0048] DFHEXEC("ZHTST",aa,...,dflibO〇20); }
[0049] 以如下SQL語句為例子,進(jìn)行SQL語句標(biāo)準(zhǔn)C函數(shù)展開的說明: EXEC SQL SELECT CNT TR CONN CTRL, ? XT_ rR SPTM CTRL
[0050] INTO :wk_cnt_lr_conn_clrl, :vvk_ixi_tr_spim_ctrl FROM SC SiiEC TR CTRL WHERE COD_TR IN ( :wk_codJr, AND ID AOR SYSID == :wk_sys_id
[0051 ] AND IND ENBL = :\vk_ ind cnbi ORDER EiY CGD TR DESC FETCH FIRST I ROWS ONLY WITH HR
[0052]該SQL語句通過代碼填充和結(jié)構(gòu)體定義后,實(shí)現(xiàn)了標(biāo)準(zhǔn)C函數(shù)的展開,在展開之后, 變?yōu)槿缦露鄺l語句: struct { char SQLDAID[8]; long SQLDA BC; short SQLN; short SQLDj char SQLPVELT[ (si/.c0r(SQLE;LTS) ^ 3)]; j S0LPVARS2; struct { char SQLDAID[8]; long SQLDA BC; short SQLN;
[0053] short SQ L D; char S〇LAVELT[ (sizcoITSQLELTS)2)]; I SQLAVARS2; SQLELTS_PTR2 = (SQLELTS &SQLPVARS2.SQLPVELT; SQLELTS_PTR2->SQLTYPE = 460; SQLELTS_PTR2->SQLLEN =9; SQLELTS_PTR2->SQLADDR = (char &( wk_ood_tr); SQLELTS_PTR2->SQLIND = NULL, SQLELTS_PTR2->SQLNAMLEN = 0; SQLELTSPTR2 = SQLELTSPTR2 + I; SQLEUTS_PTR2->SQI;rYPE = 460; SQLELTS_PTR2->SQLLEN =5; S〇LELTS_PTR2->SQLADDR == (char *) &( wk_sys_id ); SQLELTS PTR2->SQLIND = NULL. SQLE LTS_PTR 2->S〇L NAMLEN = 0; SQLELTSJ) 丁 R2 = SC)LELTS_PTR2 + I; SQLElirSmPTRl^SQUrYPE = 452; SQL.ELTS_PTR2->SQLLEN = I: SQLELTS_ PTR2->SQLADDR = (char &( wk」nd_enbl ); SQLHLlS_PrR2->SgLlND = NULL; SQLEIirSJiTRl^SQLNAMLEN = 0;
[0054] slrcpy(SQLPVARS2.SQLDAiD:OxE20xD80xD30xC40xCl 0x400 SQLPmRSl, SQLDABC ^ 148; SQLPVARS2.SQLN =3; SQLPVARS2.SQLD = 3; SQLPLIST2.SQLVPARM = (chars|i) &SQLPVARS2.SQLDAID; SQLELTS PTR2 = (SQLELTS !;<) &SQLAVARS2.SQLAVELT: SQLE〇S^TM->SQnryPE = 500; SQLELTS_PTR2->SQLLEN =2; SQLELTS_PTR2->SQLADDR 二(chat *) &( vvk_cnt_tr_conn_cirl ); SQ LE LTSPTR. 2->S〇LI N D = NULL; SQ LE LTS_PTR2->S〇L.N A MLEN = 0; SQLELTS PTR2 = SQLELTS_i>TR2 + I; SQLElirSJiTM^SQmPE = 460; SQLEUrS-PTR2->SQliEN = 71; S〇LELTS_PTR2->SQLADDR = (char *) &i( wk txt tr sptm etrl); S〇LELTS_PTR2->SQLIND == NULL; SQLELTS_PTR2->SQLNAMLEN = 0; slrcpy(SQLAVARS2,SQLDAID,,OxE20xD80xl:)30xC40xC 10x400 SQLAVARS2.SQLDABC = 104; SQLAVARS2.SQLN = 2;
[0055] SQLAVARS2.SQLD =2' SQLPL:IST2,SQLAPARM = (char &SQLAVARS2,SQLDA:ID; SQLPLIST2.SQLCODEP = (char *) &sqlca; SQLPLIST2.SQLTIMES[ 0 ] = OxlAOE; SQLPLIST2.SQLTIMES[ I ] = 0x93AC; SQLPLIST2.SQLTIMES[ 2 ] = Oxl A5A; SQLPLIST2.SQLTIMES[ 3 ] = 0xF6E0; DSNHLI ((unsigned ini ) &SQLPL1ST2); >
[0056] 這樣,在進(jìn)行該步驟之后,實(shí)現(xiàn)了對源代碼的展開,展開后的源代碼稱作第二中間 文件,該第二中間文件仍以插粧代碼標(biāo)識源代碼之間的相對位置關(guān)系,保持與源代碼的精 確映射關(guān)系。
[0057]在步驟S03,對第二中間文件進(jìn)行語法分析,生成抽象語義樹,抽象語義樹上的各 節(jié)點(diǎn)進(jìn)行了代碼行數(shù)的標(biāo)記,而后,生成中間語言代碼。
[0058]語法分析是編譯器的前端分析步驟,以生產(chǎn)抽象語義樹,進(jìn)而生成中間語言代碼。 在本發(fā)明中,在生成的抽象語義樹上,各節(jié)點(diǎn)還進(jìn)行了代碼行數(shù)的標(biāo)記,由于插粧代碼代表 了與源代碼行的位置,而在抽象語義樹上的代碼行數(shù)標(biāo)記實(shí)現(xiàn)了與插粧代碼的映射關(guān)系, 從而,實(shí)現(xiàn)了抽象語義樹與源代碼的精確映射。
[0059] 在具體的實(shí)施例中,可以采用不同的方式進(jìn)行抽象語義樹上各節(jié)點(diǎn)的代碼行數(shù)的 標(biāo)記,例如先進(jìn)行語法分析,在生成抽象語義樹之后,在進(jìn)行各節(jié)點(diǎn)行數(shù)的標(biāo)記,或者,先進(jìn) 行代碼行數(shù)的標(biāo)記,而后進(jìn)行語法分析,再生成抽象語法樹。
[0060] 在本發(fā)明優(yōu)選的實(shí)施例中,在進(jìn)行語法分析的同時進(jìn)行代碼行數(shù)的標(biāo)記,具體的: 對第二中間文件中的代碼行逐行進(jìn)行語法分析,生成抽象語義樹,并記錄插粧代碼所在的 代碼行數(shù),對一個代碼行進(jìn)行語法分析的步驟包括:對代碼行進(jìn)行語法分析后,在該代碼行 上創(chuàng)建節(jié)點(diǎn),并以該節(jié)點(diǎn)向前遍歷,直到遇到粧代碼為止,向前遍歷的行數(shù)與插粧代碼所在 代碼行的行數(shù)之和作為該代碼行的代碼行數(shù),并標(biāo)記在該節(jié)點(diǎn)。
[0061] 以下以一個具體的實(shí)施例代碼分析為例進(jìn)行說明,如下述代碼所示,當(dāng)對插粧代 碼Oline num下的代碼行進(jìn)行分析時,先記錄插粧代碼Oline num所在代碼行的代碼行數(shù), 以行a2為例,在對該行分析結(jié)束后,在抽象語義樹上建立一個節(jié)點(diǎn)' = = ',同時,向前進(jìn)行 遍歷,每遍歷一行,計(jì)數(shù)器的值增加1,直到遇到插粧代碼@1 ine num為止,這樣,計(jì)數(shù)器中記 載了該節(jié)點(diǎn)所在行與插粧代碼之間的相對行數(shù)的數(shù)值,那么,將插粧代碼Oline num所在代 碼行的代碼行數(shù)與計(jì)數(shù)器的值的和就是行a2的代碼行數(shù),將該代碼行數(shù)標(biāo)記在該行中,該 代碼行數(shù)標(biāo)記了該代碼行與插粧代碼之間的相對位置關(guān)系。 (cijlinc num a! if(*prcv \ a2 == \: a3 ,W \
[0062] a4 (I \ a:5. *prev \. a6 == \ a:7 ") a8 break.
[0063] 在生成了標(biāo)記有節(jié)點(diǎn)所在行的代碼行數(shù)的抽象語義樹之后,獲得的映射關(guān)系為以 插粧代碼為相對位置的源代碼行對應(yīng)的抽象語義樹內(nèi)的多個節(jié)點(diǎn),通常地,抽象語義樹內(nèi) 的操作符合節(jié)點(diǎn)、內(nèi)存訪問操作被映射為功能指令,而其中的變量、常量節(jié)點(diǎn)被映射為功能 指令中的操作數(shù),在本發(fā)明實(shí)施例中,同一條中間語言指令可能是由一個和多個抽象語義 樹內(nèi)的節(jié)點(diǎn)構(gòu)成,即可能對應(yīng)多個源代碼行。具體地,通過無關(guān)節(jié)點(diǎn)刪除、虛擬寄存器分配、 節(jié)點(diǎn)匹配、抽象語義樹遍歷,實(shí)現(xiàn)了中間語言代碼的生成。而由于抽象語義樹的各節(jié)點(diǎn)的代 碼行數(shù)記錄了與插粧代碼的相對位置關(guān)系,在進(jìn)行中間語言代碼生成之后,這種相對位置 關(guān)系仍然保持。
[0064] 在步驟S04,對中間語言代碼進(jìn)行代碼優(yōu)化。
[0065] 代碼優(yōu)化是編譯器后端分析的步驟,通常地,進(jìn)行待優(yōu)化是以降低程序運(yùn)行時所 占用的時鐘周期為目的的,在現(xiàn)有技術(shù)中,在優(yōu)化過程中的基本塊合并、軟件流水帶來的指 令數(shù)的降低或膨脹,這些都會打破優(yōu)化前基本塊與代碼行之間的滿映射關(guān)系,降低中間語 言指令與源代碼行之間的映射關(guān)系的準(zhǔn)確度。
[0066] 在本發(fā)明實(shí)施例中,對于代碼優(yōu)化的方法,主要是基于控制流圖和數(shù)據(jù)依賴圖進(jìn) 行分析,在優(yōu)化過程中,包括中間語言代碼的移動、合并、刪除或展開這四個方面,而基于本 發(fā)明上述獲得的中間語言代碼,經(jīng)過代碼優(yōu)化后,仍能保持優(yōu)化后的中間語言代碼與源代 碼的映射關(guān)系,詳細(xì)說明如下。
[0067] 中間語言指令之間由于虛擬寄存器導(dǎo)致的數(shù)據(jù)依賴關(guān)系,構(gòu)成了數(shù)據(jù)依賴圖,而 由于分支控制指令將一條或多條中間語言指令劃分為基本塊,這些塊與塊之間的調(diào)用關(guān) 系,構(gòu)成了控制流圖。
[0068] 在進(jìn)行代碼優(yōu)化時,若進(jìn)行了代碼移動,也就是說,中間語言代碼沿著控制流圖的 邊進(jìn)行移動,由于中間語言代碼中添加了與源代碼之間的行映射關(guān)系,即使進(jìn)行了代碼移 動,也不會影響到他們之間的精確映射關(guān)系;若進(jìn)行了代碼合并,新生產(chǎn)的中間語言代碼將 繼承進(jìn)行合并之前所有的中間語言代碼與源代碼之間的映射關(guān)系,也就是說,保留了中間 語言代碼與源代碼之間的映射關(guān)系;若進(jìn)行了代碼刪除,而未被刪除的中間語言代碼仍保 留著與源代碼之間的映射關(guān)系。對于代碼的展開,通常是軟件流水通過循環(huán)展開,會導(dǎo)致控 制流圖節(jié)點(diǎn)增加,在基本塊膨脹的過程中,中間語言代碼與源代碼之間的映射關(guān)系仍然是 保留的??梢钥吹?,在本發(fā)明的實(shí)施例中,由于插粧代碼以及中間語言代碼中各節(jié)點(diǎn)代碼行 數(shù)的標(biāo)記,使得中間語言代碼與源代碼之間存在精確的映射關(guān)系,在后續(xù)的代碼優(yōu)化過程 中,這種映射關(guān)系也不會被破壞。
[0069]在步驟S05,基于優(yōu)化后的中間語言代碼,生成機(jī)器指令。
[0070]在該步驟中,將優(yōu)化后的中間語言代碼生成目標(biāo)處理器上支持的機(jī)器指令。
[0071] 通常地,由于中間語言代碼中使用的是虛擬寄存器,而最終生成的機(jī)器指令卻是 目標(biāo)處理器上支持的物理寄存器,而物理寄存器的數(shù)量是有限的,因此,會導(dǎo)致寄存器重分 配的操作,這會導(dǎo)致指令條數(shù)的增加,需要添加這些指令與源代碼的映射關(guān)系。而在本發(fā)明 實(shí)施例中,對于這些新增的指令,可以根據(jù)所在基本塊內(nèi)與其出現(xiàn)數(shù)據(jù)依賴的指令,繼承與 源代碼行之間的映射關(guān)系,從而在生成機(jī)器指令的步驟中,仍能保證與源代碼行之間的精 確映射。
[0072] 至此,完成了本發(fā)明實(shí)施例的面向主機(jī)系統(tǒng)的代碼重定位方法。
[0073] 此外,本發(fā)明還提供了一種實(shí)現(xiàn)上述方法的面向主機(jī)系統(tǒng)的代碼重定位系統(tǒng),參 考圖2所示,包括:
[0074] 插粧單元100,用于對源代碼按照語句行或語句塊進(jìn)行插粧,以獲得第一中間文 件,插粧代碼包括助記符和行數(shù)標(biāo)識;
[0075] 展開單元110,用于至少將第一中間文件中的頭文件和宏定義進(jìn)行標(biāo)準(zhǔn)C函數(shù)的展 開,以獲得第二中間文件;
[0076] 前端映射單元120,用于對第二中間文件進(jìn)行語法分析,生成抽象語義樹,并記錄 插粧代碼所在代碼行數(shù),抽象語義樹上的各節(jié)點(diǎn)進(jìn)行了代碼行數(shù)的標(biāo)記,而后,生成中間語 言代碼;
[0077] 后端映射單元130,用于對中間語言代碼進(jìn)行代碼優(yōu)化;
[0078] 代碼生成單元140,用于基于優(yōu)化后的中間語言代碼,生成機(jī)器指令。
[0079] 進(jìn)一步地,展開單元120還用于將第一中間文件中的SQL語句和/或CICS語句進(jìn)行 標(biāo)準(zhǔn)C函數(shù)的展開。
[0080] 進(jìn)一步地,前端映射單元130中,對第二中間文件中的代碼行逐行進(jìn)行語法分析, 生成抽象語義樹,并記錄插粧代碼所在的代碼行數(shù),對一個代碼行進(jìn)行語法分析的步驟包 括:對代碼行進(jìn)行語法分析后,在該代碼行上創(chuàng)建節(jié)點(diǎn),并以該節(jié)點(diǎn)向前遍歷,直到遇到插 粧代碼為止,向前遍歷的行數(shù)與插粧代碼所在代碼行的行數(shù)之和作為該代碼行的代碼行 數(shù),并標(biāo)記在該代碼行。
[0081] 進(jìn)一步地,對中間語言代碼進(jìn)行代碼優(yōu)化包括中間語言代碼的移動、合并、刪除 和/或展開。
[0082] 本說明書中的各個實(shí)施例均采用遞進(jìn)的方式描述,各個實(shí)施例之間相同相似的部 分互相參見即可,每個實(shí)施例重點(diǎn)說明的都是與其他實(shí)施例的不同之處。尤其,對于系統(tǒng)實(shí) 施例而言,由于其基本相似于方法實(shí)施例,所以描述得比較簡單,相關(guān)之處參見方法實(shí)施例 的部分說明即可。以上所描述的系統(tǒng)實(shí)施例僅僅是示意性的,其中所述作為分離部件說明 的模塊或單元可以是或者也可以不是物理上分開的,作為模塊或單元顯示的部件可以是或 者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網(wǎng)絡(luò)單元上??梢愿?據(jù)實(shí)際的需要選擇其中的部分或者全部模塊來實(shí)現(xiàn)本實(shí)施例方案的目的。本領(lǐng)域普通技術(shù) 人員在不付出創(chuàng)造性勞動的情況下,即可以理解并實(shí)施。
[0083]以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,雖然本發(fā)明已以較佳實(shí)施例披露如上,然 而并非用以限定本發(fā)明。任何熟悉本領(lǐng)域的技術(shù)人員,在不脫離本發(fā)明技術(shù)方案范圍情況 下,都可利用上述揭示的方法和技術(shù)內(nèi)容對本發(fā)明技術(shù)方案做出許多可能的變動和修飾, 或修改為等同變化的等效實(shí)施例。因此,凡是未脫離本發(fā)明技術(shù)方案的內(nèi)容,依據(jù)本發(fā)明的 技術(shù)實(shí)質(zhì)對以上實(shí)施例所做的任何的簡單修改、等同變化及修飾,均仍屬于本發(fā)明技術(shù)方 案保護(hù)的范圍內(nèi)。
【主權(quán)項(xiàng)】
1. 一種面向主機(jī)系統(tǒng)的代碼重定位方法,其特征在于,包括: SOI,對源代碼按照語句行或語句塊進(jìn)行插粧,以獲得第一中間文件,插粧代碼包括助 記符和行數(shù)標(biāo)識; S02,至少將第一中間文件中的頭文件和宏定義進(jìn)行標(biāo)準(zhǔn)C函數(shù)的展開,以獲得第二中 間文件; S03,對第二中間文件進(jìn)行語法分析,生成抽象語義樹,并記錄插粧代碼所在代碼行數(shù), 抽象語義樹上的各節(jié)點(diǎn)進(jìn)行了代碼行數(shù)的標(biāo)記,而后,生成中間語言代碼; S04,對中間語言代碼進(jìn)行代碼優(yōu)化; S05,基于優(yōu)化后的中間語言代碼,生成機(jī)器指令。2. 根據(jù)權(quán)利要求1所述的面向主機(jī)系統(tǒng)的代碼重定位方法,其特征在于,在步驟S02中, 還包括:將第一中間文件中的SQL語句和/或CICS語句進(jìn)行標(biāo)準(zhǔn)C函數(shù)的展開。3. 根據(jù)權(quán)利要求1所述的面向主機(jī)系統(tǒng)的代碼重定位方法,其特征在于,對第二中間文 件進(jìn)行語法分析,生成抽象語義樹,并記錄插粧代碼所在代碼行數(shù),抽象語義樹上的各節(jié)點(diǎn) 進(jìn)行了代碼行數(shù)的標(biāo)記的步驟包括: 對第二中間文件中的代碼行逐行進(jìn)行語法分析,生成抽象語義樹,并記錄插粧代碼所 在的代碼行數(shù),對一個代碼行進(jìn)行語法分析的步驟包括:對代碼行進(jìn)行語法分析后,在該代 碼行上創(chuàng)建節(jié)點(diǎn),并以該節(jié)點(diǎn)向前遍歷,直到遇到插粧代碼為止,向前遍歷的行數(shù)與插粧代 碼所在代碼行的行數(shù)之和作為該代碼行的代碼行數(shù),并標(biāo)記在該代碼行。4. 根據(jù)權(quán)利要求1所述的面向主機(jī)系統(tǒng)的代碼重定位方法,其特征在于,對中間語言代 碼進(jìn)行代碼優(yōu)化包括中間語言代碼的移動、合并、刪除或展開。5. -種面向主機(jī)系統(tǒng)的代碼重定位系統(tǒng),其特征在于,包括: 插粧單元,用于對源代碼按照語句行或語句塊進(jìn)行插粧,以獲得第一中間文件,插粧代 碼包括助記符和行數(shù)標(biāo)識; 展開單元,用于至少將第一中間文件中的頭文件和宏定義進(jìn)行標(biāo)準(zhǔn)C函數(shù)的展開,以獲 得第二中間文件; 前端映射單元,用于對第二中間文件進(jìn)行語法分析,生成抽象語義樹,并記錄插粧代碼 所在代碼行數(shù),抽象語義樹上的各節(jié)點(diǎn)進(jìn)行了代碼行數(shù)的標(biāo)記,而后,生成中間語言代碼; 后端映射單元,用于對中間語言代碼進(jìn)行代碼優(yōu)化; 代碼生成單元,用于基于優(yōu)化后的中間語言代碼,生成機(jī)器指令。6. 根據(jù)權(quán)利要求5所述的面向主機(jī)系統(tǒng)的代碼重定位系統(tǒng),其特征在于,展開單元還用 于將第一中間文件中的SQL語句和/或CICS語句進(jìn)行標(biāo)準(zhǔn)C函數(shù)的展開。7. 根據(jù)權(quán)利要求5所述的面向主機(jī)系統(tǒng)的代碼重定位系統(tǒng),其特征在于,前端映射單元 中,對第二中間文件中的代碼行逐行進(jìn)行語法分析,生成抽象語義樹,并記錄插粧代碼所在 的代碼行數(shù),對一個代碼行進(jìn)行語法分析的步驟包括:對代碼行進(jìn)行語法分析后,在該代碼 行上創(chuàng)建節(jié)點(diǎn),并以該節(jié)點(diǎn)向前遍歷,直到遇到插粧代碼為止,向前遍歷的行數(shù)與插粧代碼 所在代碼行的行數(shù)之和作為該代碼行的代碼行數(shù),并標(biāo)記在該代碼行。8. 根據(jù)權(quán)利要求5所述的面向主機(jī)系統(tǒng)的代碼重定位系統(tǒng),其特征在于,對中間語言代 碼進(jìn)行代碼優(yōu)化包括中間語言代碼的移動、合并、刪除和/或展開。
【文檔編號】G06F9/45GK105843661SQ201610173680
【公開日】2016年8月10日
【申請日】2016年3月24日
【發(fā)明人】姚琥, 曹新平, 朱浩
【申請人】中國農(nóng)業(yè)銀行股份有限公司