一种面向主机系统的代码重定位方法及其系统的制作方法

文档序号:10488791阅读:403来源:国知局
一种面向主机系统的代码重定位方法及其系统的制作方法
【专利摘要】本发明提供一种面向主机系统的代码重定位方法,在获得了以插桩代码进行标识的第一中间文件之后,将第一中间文件中的源代码进行标准C函数的展开,从而获得了按照代码行展开的第二中间文件,之后,进行代码行的语法分析时,对抽象语义树上的各节点进行了代码行数的标记,这样,确保了中间语言代码与源代码之间的精确映射,在后续的代码优化和机器指令生成中,仍能确保这种精确的映射关系,从而,实现了机器指令与源代码之间的精确映射关系,实现调试过程中的代码精确定位。
【专利说明】
一种面向主机系统的代码重定位方法及其系统
技术领域
[0001] 本发明涉及计算机程序编译领域,特别涉及一种面向主机系统的代码重定位方法 及系统。
【背景技术】
[0002] 代码重定位技术被广泛应用于调试器中,在调试过程中的目标代码通常需要附加 调试信息,调试信息是在编译器生成机器码时一起产生,代表着可执行代码和源代码之间 的关系,这个信息以预定义的格式进行编码,并同机器码一起存储,在可执行代码中对源代 码到机器码做全部映射。
[0003] 调试信息可以按照可读的形式进行解读,其在调试过程中起到非常重要的作用, 例如,当在某一行上设定断点时,利用调试信息中的行信息找到实际应该陷入的地址;当某 个指令引起段错误时,利用调试信息中的行信息找到源代码中的对应行号,以便于进行修 改。可以看到,调试信息中的行信息可以在源代码与机器码之间建立双向的对应关系,便于 程序的调试。
[0004] 在现有技术面向主机系统的代码重定位方法中,在生成调试器用的可执行代码 时,仅对静态编译类语言源代码,如C、C++等进行载入,并在载入时记载源代码的行信息,然 而,静态编译类源代码中包含有头文件以及宏定义等代码,这些代码在预处理中都会进行 展开,会影响源代码的行数,这样,会导致源代码与机器码之间建立的双向对应关系并不精 确,在后续调试过程中,不能够精确的定位到源代码中的具体错误的行号处。
[0005] 此外,在银行业应用的主机系统为主流的IBM产品,由于行业应用的特殊背景,在 金融系统中,利用C语言开发的源代码中,通常还包括数据库操作代码以及进行联机交易过 程中所需要的对主机CICS(Customer Information Control System,客户信息控制系统) 相关的操作代码,而现有技术中,并没有对这方面进行响应的代码重定位处理,使得调试过 程不易进行错误定位,导致调试效率低。

【发明内容】

[0006] 有鉴于此,本发明的目的在于提供一种面向主机系统的代码重定位方法及其系 统,实现精确定位。
[0007] 为实现上述目的,本发明有如下技术方案:
[0008] -种面向主机系统的代码重定位方法,包括:
[0009] SOl,对源代码按照语句行或语句块进行插粧,以获得第一中间文件,插粧代码包 括助记符和行数标识;
[0010] S02,至少将第一中间文件中的头文件和宏定义进行标准C函数的展开,以获得第 二中间文件;
[0011] S03,对第二中间文件进行语法分析,生成抽象语义树,并记录插粧代码所在代码 行数,抽象语义树上的各节点进行了代码行数的标记,而后,生成中间语言代码;
[0012] S04,对中间语言代码进行代码优化;
[0013] S05,基于优化后的中间语言代码,生成机器指令。
[0014]可选地,在步骤S02中,还包括:将第一中间文件中的SQL语句和/或CICS语句进行 标准C函数的展开。
[0015] 可选地,对第二中间文件进行语法分析,生成抽象语义树,并记录插粧代码所在代 码行数,抽象语义树上的各节点进行了代码行数的标记的步骤包括:
[0016] 对第二中间文件中的代码行逐行进行语法分析,生成抽象语义树,并记录插粧代 码所在的代码行数,对一个代码行进行语法分析的步骤包括:对代码行进行语法分析后,在 该代码行上创建节点,并以该节点向前遍历,直到遇到插粧代码为止,向前遍历的行数与插 粧代码所在代码行的行数之和作为该代码行的代码行数,并标记在该代码行。
[0017] 可选地,对中间语言代码进行代码优化包括中间语言代码的移动、合并、删除或展 开。
[0018] 此外,本发明还提供了一种面向主机系统的代码重定位系统,包括:
[0019] 插粧单元,用于对源代码按照语句行或语句块进行插粧,以获得第一中间文件,插 粧代码包括助记符和行数标识;
[0020] 展开单元,用于至少将第一中间文件中的头文件和宏定义进行标准C函数的展开, 以获得第二中间文件;
[0021] 前端映射单元,用于对第二中间文件进行语法分析,生成抽象语义树,并记录插粧 代码所在代码行数,抽象语义树上的各节点进行了代码行数的标记,而后,生成中间语言代 码;
[0022] 后端映射单元,用于对中间语言代码进行代码优化;
[0023] 代码生成单元,用于基于优化后的中间语言代码,生成机器指令。
[0024] 可选地,展开单元还用于将第一中间文件中的SQL语句和/或CICS语句进行标准C 函数的展开。
[0025] 可选地,前端映射单元中,对第二中间文件中的代码行逐行进行语法分析,生成抽 象语义树,并记录插粧代码所在的代码行数,对一个代码行进行语法分析的步骤包括:对代 码行进行语法分析后,在该代码行上创建节点,并以该节点向前遍历,直到遇到插粧代码为 止,向前遍历的行数与插粧代码所在代码行的行数之和作为该代码行的代码行数,并标记 在该代码行。
[0026] 可选地,对中间语言代码进行代码优化包括中间语言代码的移动、合并、删除和/ 或展开。
[0027] 本发明实施例提供的面向主机系统的代码重定位方法及其系统,在获得了以插粧 代码进行标识的第一中间文件之后,将第一中间文件中的源代码进行标准C函数的展开,从 而获得了按照代码行展开的第二中间文件,之后,进行代码行的语法分析时,对抽象语义树 上的各节点进行了代码行数的标记,这样,确保了中间语言代码与源代码之间的精确映射, 在后续的代码优化和机器指令生成中,仍能确保这种精确的映射关系,从而,实现了机器指 令与源代码之间的精确映射关系,实现调试过程中的代码精确定位。
【附图说明】
[0028] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现 有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明 的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据 这些附图获得其他的附图。
[0029] 图1示出了根据本发明实施例的面向主机系统的代码重定位方法的流程图;
[0030]图2示出了根据本发明实施例的面向主机系统的代码重定位系统的结构示意图。
【具体实施方式】
[0031] 为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例 中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是 本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员 在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0032] 参考图1所示,本发明提出了一种代码重定位方法,面向主机系统,主要应用于银 行等金融系统,主要利用C语言开发源代码。在该方法中,在获得了以插粧代码进行标识的 第一中间文件之后,将第一中间文件中的源代码进行标准C函数的展开,从而获得了按照代 码行展开的第二中间文件,之后,进行代码行的语法分析时,对抽象语义树上的各节点进行 了代码行数的标记,这样,确保了中间语言代码与源代码之间的精确映射,在后续的代码优 化和机器指令生成中,仍能确保这种精确的映射关系,从而,实现了机器指令与源代码之间 的精确映射关系,实现调试过程中的代码精确定位。
[0033] 为了更好地理解本发明的技术方案和技术效果,以下将结合流程图对具体的实施 例进行详细的描述。
[0034] 在步骤SOl,对源代码按照语句行或语句块进行插粧,以获得第一中间文件,插粧 代码包括助记符和行数标识。
[0035] 在该步骤中,对源代码进行了插粧,插粧时按照语言逻辑进行,根据不同的需要, 可以按照完整的语句块进行插粧,也可以按照语句行进行插粧。源代码中包括头文件、宏定 义等标准C语言定义,以及SQL语句和CICS语句两种非标准C语言定义。在插粧之后,一方面 实现了对源代码行数的标记,另一方面记录了源代码中头文件、宏定义以及SQL语句、CICS 语句的相对位置。
[0036] 在该实施例中,面向的主机系统为主流的IBM系统,该系统中主要利用C语言开发 的源代码中,通常还包括数据库操作代码以及进行联机交易过程中所需要的对主机CICS (Customer Information Control System,客户信息控制系统)相关的操作代码。
[0037] 插粧代码包括助记符和行数标识,该插粧代码为伪代码,在源代码中起到标识及 行数记录的作用,助记符起到标识该处插入的为行信息的伪代码,助记符例如可以为@ line,行数标识可以用数字表示,行数标识的数字可以为代码行的实际行数,可以在源代码 中的语句块或语句行之前插入插粧代码,语句块为可以完整表达语义的一行或多行语句组 成,一般具有固定的表达方式,如根据关键字符、起始和结束成对出现的函数等来实现语义 行的识别,关键字符例如';等。语句行为表达一个语义的代码行,通常为一个函数表 达。以下以一段源代码为例,对该段源代码进行插粧,以便于更好地理解本发明实施例的插 粧步骤。 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] 可以看到,在该段代码中,以Oline+行数进行插粧,在完整的语句块或语句行之前 进行插粧代码的插入,在该具体的代码中,#ifdef 为一段完整的语句块,在其 起始处插入插粧代码Oline 1,之后在int main函数之前插入插粧代码Oline 1,插粧代码@ line 9至插粧代码Oline 13之间的语句块为CICS的执行语句,而Oline 6、@line 7、@line 8、@line 13、@line 17等都是在语句行之前进行的插粧代码的插入,这样,就在该段源代码 中按照语义行进行了插粧,插粧后的代码记做第一中间文件。以上仅为示例,根据具体的需 要,可以在需要的语句块或语句行之前插入插粧代码。
[0040] 在步骤S02,至少将第一中间文件中的头文件和宏定义进行标准C函数的展开,以 获得第二中间文件。
[0041] 在该步骤中,将插粧后的源代码,即第一中间文件,进行标准C函数的展开,在展开 时,至少将头文件和宏定义进行标准C函数的展开,以便于在按照代码行进行后续的步骤, 以实现精确的映射。更优地,可以进一步将第一中间文件中的SQL语句和/或CICS语句进行 标准C函数的展开,这样,对源代码中的关键的语句都进行了展开,获得了包含代码行的具 有插粧代码的第二中间文件。
[0042] 在进行标准C函数的展开时,是将头文件和宏定义、SQL语句和/或CICS语句拆分成 表示语法的代码行。
[0043] 具体的,对于头文件,是将第一中间文件中的头文件替换为头文件的实际代码,在 第一中间文件头文件所在的位置处将头文件进行替换,这样,头文件就进行了标准C函数的 展开,以代码行的形式出现在原头文件所在位置处。
[0044] 对于宏定义,同头文件的处理,是将第一中间文件中宏定义替换为宏定义的实际 代码,在第一中间文件宏定义所在的位置处将宏定义进行替换,这样,宏定义就进行了标准 C函数的展开,以代码行的形式出现在原宏定义所在位置处。
[0045] 对于CICS语句的C函数翻译,主要是进行了参数传递和函数调用,从而将CICS语句 展开为标准C函数。以如下CICS语句为例子,进行CICS语句标准C函数展开的说明:
[0046] EXEC CICS WRITEQ TS QUEUE("ZHTST,,)FROM(aa)LENGTH(strlen(aa));
[0047] 将该CICS语句进行参数传递和函数调用之后,实现了标准C函数的展开,在展开之 后,变为如下多条语句: { dl'hb0020=slrlcn{aa);
[0048] DFHEXEC("ZHTST",aa,...,dflibO〇20); }
[0049] 以如下SQL语句为例子,进行SQL语句标准C函数展开的说明: 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语句通过代码填充和结构体定义后,实现了标准C函数的展开,在展开之后, 变为如下多条语句: 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] 这样,在进行该步骤之后,实现了对源代码的展开,展开后的源代码称作第二中间 文件,该第二中间文件仍以插粧代码标识源代码之间的相对位置关系,保持与源代码的精 确映射关系。
[0057]在步骤S03,对第二中间文件进行语法分析,生成抽象语义树,抽象语义树上的各 节点进行了代码行数的标记,而后,生成中间语言代码。
[0058]语法分析是编译器的前端分析步骤,以生产抽象语义树,进而生成中间语言代码。 在本发明中,在生成的抽象语义树上,各节点还进行了代码行数的标记,由于插粧代码代表 了与源代码行的位置,而在抽象语义树上的代码行数标记实现了与插粧代码的映射关系, 从而,实现了抽象语义树与源代码的精确映射。
[0059] 在具体的实施例中,可以采用不同的方式进行抽象语义树上各节点的代码行数的 标记,例如先进行语法分析,在生成抽象语义树之后,在进行各节点行数的标记,或者,先进 行代码行数的标记,而后进行语法分析,再生成抽象语法树。
[0060] 在本发明优选的实施例中,在进行语法分析的同时进行代码行数的标记,具体的: 对第二中间文件中的代码行逐行进行语法分析,生成抽象语义树,并记录插粧代码所在的 代码行数,对一个代码行进行语法分析的步骤包括:对代码行进行语法分析后,在该代码行 上创建节点,并以该节点向前遍历,直到遇到粧代码为止,向前遍历的行数与插粧代码所在 代码行的行数之和作为该代码行的代码行数,并标记在该节点。
[0061] 以下以一个具体的实施例代码分析为例进行说明,如下述代码所示,当对插粧代 码Oline num下的代码行进行分析时,先记录插粧代码Oline num所在代码行的代码行数, 以行a2为例,在对该行分析结束后,在抽象语义树上建立一个节点' = = ',同时,向前进行 遍历,每遍历一行,计数器的值增加1,直到遇到插粧代码@1 ine num为止,这样,计数器中记 载了该节点所在行与插粧代码之间的相对行数的数值,那么,将插粧代码Oline num所在代 码行的代码行数与计数器的值的和就是行a2的代码行数,将该代码行数标记在该行中,该 代码行数标记了该代码行与插粧代码之间的相对位置关系。 (cijlinc num a! if(*prcv \ a2 == \: a3 ,W \
[0062] a4 (I \ a:5. *prev \. a6 == \ a:7 ") a8 break.
[0063] 在生成了标记有节点所在行的代码行数的抽象语义树之后,获得的映射关系为以 插粧代码为相对位置的源代码行对应的抽象语义树内的多个节点,通常地,抽象语义树内 的操作符合节点、内存访问操作被映射为功能指令,而其中的变量、常量节点被映射为功能 指令中的操作数,在本发明实施例中,同一条中间语言指令可能是由一个和多个抽象语义 树内的节点构成,即可能对应多个源代码行。具体地,通过无关节点删除、虚拟寄存器分配、 节点匹配、抽象语义树遍历,实现了中间语言代码的生成。而由于抽象语义树的各节点的代 码行数记录了与插粧代码的相对位置关系,在进行中间语言代码生成之后,这种相对位置 关系仍然保持。
[0064] 在步骤S04,对中间语言代码进行代码优化。
[0065] 代码优化是编译器后端分析的步骤,通常地,进行待优化是以降低程序运行时所 占用的时钟周期为目的的,在现有技术中,在优化过程中的基本块合并、软件流水带来的指 令数的降低或膨胀,这些都会打破优化前基本块与代码行之间的满映射关系,降低中间语 言指令与源代码行之间的映射关系的准确度。
[0066] 在本发明实施例中,对于代码优化的方法,主要是基于控制流图和数据依赖图进 行分析,在优化过程中,包括中间语言代码的移动、合并、删除或展开这四个方面,而基于本 发明上述获得的中间语言代码,经过代码优化后,仍能保持优化后的中间语言代码与源代 码的映射关系,详细说明如下。
[0067] 中间语言指令之间由于虚拟寄存器导致的数据依赖关系,构成了数据依赖图,而 由于分支控制指令将一条或多条中间语言指令划分为基本块,这些块与块之间的调用关 系,构成了控制流图。
[0068] 在进行代码优化时,若进行了代码移动,也就是说,中间语言代码沿着控制流图的 边进行移动,由于中间语言代码中添加了与源代码之间的行映射关系,即使进行了代码移 动,也不会影响到他们之间的精确映射关系;若进行了代码合并,新生产的中间语言代码将 继承进行合并之前所有的中间语言代码与源代码之间的映射关系,也就是说,保留了中间 语言代码与源代码之间的映射关系;若进行了代码删除,而未被删除的中间语言代码仍保 留着与源代码之间的映射关系。对于代码的展开,通常是软件流水通过循环展开,会导致控 制流图节点增加,在基本块膨胀的过程中,中间语言代码与源代码之间的映射关系仍然是 保留的。可以看到,在本发明的实施例中,由于插粧代码以及中间语言代码中各节点代码行 数的标记,使得中间语言代码与源代码之间存在精确的映射关系,在后续的代码优化过程 中,这种映射关系也不会被破坏。
[0069]在步骤S05,基于优化后的中间语言代码,生成机器指令。
[0070]在该步骤中,将优化后的中间语言代码生成目标处理器上支持的机器指令。
[0071] 通常地,由于中间语言代码中使用的是虚拟寄存器,而最终生成的机器指令却是 目标处理器上支持的物理寄存器,而物理寄存器的数量是有限的,因此,会导致寄存器重分 配的操作,这会导致指令条数的增加,需要添加这些指令与源代码的映射关系。而在本发明 实施例中,对于这些新增的指令,可以根据所在基本块内与其出现数据依赖的指令,继承与 源代码行之间的映射关系,从而在生成机器指令的步骤中,仍能保证与源代码行之间的精 确映射。
[0072] 至此,完成了本发明实施例的面向主机系统的代码重定位方法。
[0073] 此外,本发明还提供了一种实现上述方法的面向主机系统的代码重定位系统,参 考图2所示,包括:
[0074] 插粧单元100,用于对源代码按照语句行或语句块进行插粧,以获得第一中间文 件,插粧代码包括助记符和行数标识;
[0075] 展开单元110,用于至少将第一中间文件中的头文件和宏定义进行标准C函数的展 开,以获得第二中间文件;
[0076] 前端映射单元120,用于对第二中间文件进行语法分析,生成抽象语义树,并记录 插粧代码所在代码行数,抽象语义树上的各节点进行了代码行数的标记,而后,生成中间语 言代码;
[0077] 后端映射单元130,用于对中间语言代码进行代码优化;
[0078] 代码生成单元140,用于基于优化后的中间语言代码,生成机器指令。
[0079] 进一步地,展开单元120还用于将第一中间文件中的SQL语句和/或CICS语句进行 标准C函数的展开。
[0080] 进一步地,前端映射单元130中,对第二中间文件中的代码行逐行进行语法分析, 生成抽象语义树,并记录插粧代码所在的代码行数,对一个代码行进行语法分析的步骤包 括:对代码行进行语法分析后,在该代码行上创建节点,并以该节点向前遍历,直到遇到插 粧代码为止,向前遍历的行数与插粧代码所在代码行的行数之和作为该代码行的代码行 数,并标记在该代码行。
[0081] 进一步地,对中间语言代码进行代码优化包括中间语言代码的移动、合并、删除 和/或展开。
[0082] 本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部 分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实 施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例 的部分说明即可。以上所描述的系统实施例仅仅是示意性的,其中所述作为分离部件说明 的模块或单元可以是或者也可以不是物理上分开的,作为模块或单元显示的部件可以是或 者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根 据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术 人员在不付出创造性劳动的情况下,即可以理解并实施。
[0083]以上所述仅是本发明的优选实施方式,虽然本发明已以较佳实施例披露如上,然 而并非用以限定本发明。任何熟悉本领域的技术人员,在不脱离本发明技术方案范围情况 下,都可利用上述揭示的方法和技术内容对本发明技术方案做出许多可能的变动和修饰, 或修改为等同变化的等效实施例。因此,凡是未脱离本发明技术方案的内容,依据本发明的 技术实质对以上实施例所做的任何的简单修改、等同变化及修饰,均仍属于本发明技术方 案保护的范围内。
【主权项】
1. 一种面向主机系统的代码重定位方法,其特征在于,包括: SOI,对源代码按照语句行或语句块进行插粧,以获得第一中间文件,插粧代码包括助 记符和行数标识; S02,至少将第一中间文件中的头文件和宏定义进行标准C函数的展开,以获得第二中 间文件; S03,对第二中间文件进行语法分析,生成抽象语义树,并记录插粧代码所在代码行数, 抽象语义树上的各节点进行了代码行数的标记,而后,生成中间语言代码; S04,对中间语言代码进行代码优化; S05,基于优化后的中间语言代码,生成机器指令。2. 根据权利要求1所述的面向主机系统的代码重定位方法,其特征在于,在步骤S02中, 还包括:将第一中间文件中的SQL语句和/或CICS语句进行标准C函数的展开。3. 根据权利要求1所述的面向主机系统的代码重定位方法,其特征在于,对第二中间文 件进行语法分析,生成抽象语义树,并记录插粧代码所在代码行数,抽象语义树上的各节点 进行了代码行数的标记的步骤包括: 对第二中间文件中的代码行逐行进行语法分析,生成抽象语义树,并记录插粧代码所 在的代码行数,对一个代码行进行语法分析的步骤包括:对代码行进行语法分析后,在该代 码行上创建节点,并以该节点向前遍历,直到遇到插粧代码为止,向前遍历的行数与插粧代 码所在代码行的行数之和作为该代码行的代码行数,并标记在该代码行。4. 根据权利要求1所述的面向主机系统的代码重定位方法,其特征在于,对中间语言代 码进行代码优化包括中间语言代码的移动、合并、删除或展开。5. -种面向主机系统的代码重定位系统,其特征在于,包括: 插粧单元,用于对源代码按照语句行或语句块进行插粧,以获得第一中间文件,插粧代 码包括助记符和行数标识; 展开单元,用于至少将第一中间文件中的头文件和宏定义进行标准C函数的展开,以获 得第二中间文件; 前端映射单元,用于对第二中间文件进行语法分析,生成抽象语义树,并记录插粧代码 所在代码行数,抽象语义树上的各节点进行了代码行数的标记,而后,生成中间语言代码; 后端映射单元,用于对中间语言代码进行代码优化; 代码生成单元,用于基于优化后的中间语言代码,生成机器指令。6. 根据权利要求5所述的面向主机系统的代码重定位系统,其特征在于,展开单元还用 于将第一中间文件中的SQL语句和/或CICS语句进行标准C函数的展开。7. 根据权利要求5所述的面向主机系统的代码重定位系统,其特征在于,前端映射单元 中,对第二中间文件中的代码行逐行进行语法分析,生成抽象语义树,并记录插粧代码所在 的代码行数,对一个代码行进行语法分析的步骤包括:对代码行进行语法分析后,在该代码 行上创建节点,并以该节点向前遍历,直到遇到插粧代码为止,向前遍历的行数与插粧代码 所在代码行的行数之和作为该代码行的代码行数,并标记在该代码行。8. 根据权利要求5所述的面向主机系统的代码重定位系统,其特征在于,对中间语言代 码进行代码优化包括中间语言代码的移动、合并、删除和/或展开。
【文档编号】G06F9/45GK105843661SQ201610173680
【公开日】2016年8月10日
【申请日】2016年3月24日
【发明人】姚琥, 曹新平, 朱浩
【申请人】中国农业银行股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1