基于树型程序分支的计算机程序即时编译方法

文档序号:6539567阅读:143来源:国知局
基于树型程序分支的计算机程序即时编译方法
【专利摘要】基于树型程序分支的计算机程序即时编译方法,属于编译方法【技术领域】。本发明中结构化基本块流图的程序执行中按照控制流的指示,依次解释执行每个基本块,遇到循环结构时则统计程序分支的出现次数。在出现次数大于给定的阈值,将当前分支设置为热点分支;对其中每个基本块进行编译处理,生成并保存目标程序分支。如果当前分支中包含其他热点分支、分支入口属于其他热点分支或部分基本块属于其他热点分支,则按照不同的策略,将当前分支与其他热点分支进行合并。本方法编译处理粒度较小,具有良好的动态可扩展性,减少了在运行时刻频繁地切换执行方式所带来的额外负担,可以大幅度提高基本块制流图的运行效率。
【专利说明】基于树型程序分支的计算机程序即时编译方法
【技术领域】
[0001]本发明涉及计算机系统中运行程序的编译优化方法,属于计算机语言技术,用于在程序运行的过程中适时地改变程序的执行方式以其整体性能。
技术背景
[0002]计算机程序设计语言的实现通常采用编译实现方法。通过编译系统事先将高级程序设计语言描述的程序翻译等价的、执行效率更高的目标语言程序,避免逐句解释高级语言程序所需要的解释负担,能够十分有效地提高程序的执行效率。然而,对于网络环境下使用的众多程序设计语言,描述计算功能的实用程序可能构造于未知的其他站点,或者是动态生成,无法预先采用编译技术进行优化处理。为了利用编译技术带来的性能改善,此类程序设计语言的有效实现常采用某种即时编译技术。例如,著名的Java虚拟机系统中,采用了这种即时编译技术,设法在程序解释执行的过程中,统计各个程序片段的执行频度,识别出执行频度较高的程序片段,进行编译处理;以编译产生的目标程序的执行代替原程序的解释执行,以求获得程序执行效率的整体提升。
[0003]鉴于计算机程序设计语言的多样性,以及程序片段的复杂性,现有的即时编译技术通常采用程序中的函数或子例程作为即时编译处理的基本单元,进而在程序执行中统计各个函数和子例程的执行次数,获得执行频度较高的热点函数,进行编译处理。然而,即时编译处理的程序粒度越大,则编译处理的开销越大,有可能在很大程度上抵消编译优化所带来的好处。为此,本发明提出一种基于执行路径的即时编译方法,允许以程序分支等更小粒度的热点程序片段作为即时编译的处理对象,能够更准确地识别出执行频度较高的程序分支,更有效地利用编译技术来提高程序的执行效率。
[0004]和其他基于程序分支的即时编译方法相比,本发明针对程序运行的结构化的基本块控制流图,适用于所有能够将控制逻辑转化为结构化基本块控制流图的程序设计语言,在程序解释和编译执行的过程中,允许将新发现的执行路径编译处理后,扩展到已经编译好的目标程序中,形成一种树型的热点程序分支,具有良好的动态可扩展性,减少了在运行时刻频繁地切换执行方式所带来的额外负担。

【发明内容】

[0005]本发明的目的是为符合结构化控制流的计算程序,提供高效灵活、便于高执行频度程序的识别、便于执行方式切换的即时编译方法,以支持高性能程序执行的解释编译系统的实现。
[0006]本发明的特征为:
[0007]1、本发明基于树型程序分支的计算机程序即时编译方法,其特征在于计算机程序是按照结构化基本
[0008]块流图的表示,实现步骤如下:
[0009]步骤SI按照控制流的指示,依次解释执行每个基本块,遇到循环结构时则记录程序分支的起点;
[0010]步骤S2如果再次遇到相同循环结构的起点时,则记录程序分支信息,累计该分支的出现次数;
[0011]步骤S3如果当前分支路径的出现次数大于给定的阈值,则按照以下步骤对当前分支进行编译处理:
[0012]步骤S3.1为当前分支设置编译标记,表示为热点分支;
[0013]步骤S3.2按照以下步骤,对当前分支中的每个基本块进行编译处理:
[0014]步骤S3.2.1将当前基本块翻译为目标代码模块;
[0015]步骤S3.2.2遇到其他分支入口,则生成出口指令;
[0016]步骤S3.2.3将步骤S3.2.1和S3.2.2生成的代码合并为目标程序分支;
[0017]步骤S3.3保存步骤S3.2所生成的目标程序分支;
[0018]步骤S3.4如果当前分支和其他分支有包含关系,则按照以下步骤进行处理:
[0019]步骤S3.4.1如果当前分支中包含了其他热点分支,则将其他热点分支作为当前分支的子分支,合并为树型的程序分支;
[0020]步骤S3.4.2如果当前分支入口属于其他热点分支,则将当前分支作为其他热点分支的子分支,合并为树型的程序分支;
[0021]步骤S3.4.3如果当前分支中部分基本块属于其他热点分支,且分支入口相同,则将其他热点分支作为当前分支的子分支,合并为树型的程序分支;
[0022]步骤S4每当再次执行循环结构时,如果该循环已经具有编译标记,则将解释执行方式切换为编译执行方式,按照以下步骤进行执行目标程序中的每条指令:
[0023]步骤S4.1将解释执行环境的上下文信息转换为目标程序的上下文信息,并保留返回地址;
[0024]步骤S4.2按照控制指令顺序执行目标程序中的指令序列;
[0025]步骤S4.3如果遇到了出口指令,则将编译执行方式切换为解释执行方式,按照目标程序的上下文信息恢复解释执行环境的上下文信息,随后按照出口指令的指示继续程序的解释执行。
[0026]步骤S4.4如果目标程序执行结束,则将编译执行方式切换为解释执行方式,按照目标程序的上下文信息恢复解释执行环境的上下文信息,随后按照预留的返回地址,继续下一基本块的解释执行。
[0027]本发明可以取得如下有益效果:
[0028]本发明针对程序运行的结构化的基本块控制流图,适用于所有能够将控制逻辑转化为结构化基本块控制流图的程序设计语言,与其他基于程序分支的即时编译方法相比,本方法编译处理粒度较小,在程序解释和编译执行的过程中,允许将新发现的执行路径编译处理后,扩展到已经编译好的目标程序中,形成一种树型的热点程序分支,具有良好的动态可扩展性,减少了在运行时刻频繁地切换执行方式所带来的额外负担。在基本块控制流图和入数据具有一定的规模的情况下,可以大幅度提高基本块制流图的运行效率。
【专利附图】

【附图说明】
[0029]图1:基于基本块控制流的程序解释执行和即时编译过程[0030]图2:程序分支的编译执行过程
[0031]图3:具体实施举例
【具体实施方式】
[0032]本发明提供的即时编译方法用于实现各种程序设计语言的处理系统,将其解释执行方式转换为解释执行和编译执行混合执行方式。具体实施方法如下:
[0033]采用传统的SECD抽象机模型作为程序设计语言的实现模型,采用常见的SECD抽象机指令作为中间语言。对于程序设计语言的特殊功能,设置一组专用的SECD抽象机指令来表示计算功能。SECD指令系统的设计中,参数栈、上下文环境和转储栈必须为程序的执行提供完整的动态上下文,以保证程序设计语言的语义正确性。
[0034]为程序设计语言的实现提供翻译程序,将程序设计语言描述的程序翻译为SECD抽象机指令组成的中间语言程序,进而转化为严格结构化的基本块控制流图。在翻译过程中,保证由SECD控制指令的组合符合结构化程序设计的要求。
[0035]为描述计算逻辑的基本块控制流图,提供解释编译执行系统。按照控制流图中控制指令的指示,依次解释执行每个基本块。遇到循环入口的基本块B3则为程序分支的起点;当每次遇到程序分支起点时,则记录程序分支的执行次数;如果当前分支的出现次数大于给定的阈值,则为当前分支作为热点程序分支,设置编译标记,并且对当前分支中的每个基本块进行编译处理,在示例中,B6所在分支(以加粗线进行标示)运行次数首先超过阈值,进行编译处理。在编译处理过程中,将当前基本块翻译为目标代码模块;遇到其他分支入口,则生成出口指令,因为B6分支不包括基本块B5、B8,因此需要在此生成出口指令;将所有基本块翻译得到的目标代码模块合并为目标程序分支。如果当前分支中包含了其他热点分支,说明当前分支所在的循环处于其他循环的内部,则将其他热点分支作为当前分支的子分支,合并为树型的程序分支;如果当前分支入口属于其他热点分支,则将当前分支作为其他热点分支的子分支,合并为树型的程序分支;如果当前分支中部分基本块属于其他热点分支,且分支入口相同,那么说明当前分支所在的循环中有其他分支是热点分支,已经被编译处理过,则将其他分支作为当前分支的子分支,合并为树型的程序分支,从而使得多个热点分支合并为一个热点分支,减少了过多的上下文环境切换过程带来的额外负载,在示例中,如果B5所在分支也达到阈值,进行编译,则符合本情况,应该将B5所在分支当做B6所在分支的子分支进行编译。
[0036]在解释执行过程中,每当再次执行循环结构时,如果该循环已经具有编译标记,则将解释执行方式切换为编译执行方式,在示例中,若B6所在分支已经编译完成,则再次运行到B3时,需要切换到编译执行方式,将解释执行环境中的SECD抽象机中参数栈和上下文环境中的数据转换到目标程序的系统栈中,保证目标程序能够访问到动态上下文环境中绑定到各个变量的数据信息,进而执行目标程序中的每条指令。目标程序的执行过程中,按照控制指令顺序执行目标程序中的指令序列;如果遇到了特殊的出口指令时,则将编译执行方式切换为解释执行方式,将系统栈中的数据恢复到SECD抽象机的参数栈和上下文环境中,使得编译环境下发生在动态上下文环境中的数据变化能够反映到SECD抽象机的参数栈和上下文环境中,并且按照出口指令的指示继续程序的解释执行。如果目标程序执行结束时,同样将编译执行方式切换为解释执行方式,将系统栈中的数据恢复到SECD抽象机的参数栈和上下文环境中,保持编译环境和解释环境的一致性,继续下一基本块的解释执行。
[0037]对于程序设计语言中特殊的控制功能,分别采用不同的即时编译策略。对于非递归的函数和子例程,采用函数内联方法,将内部基本块流图合并到外部的基本块流图,使得基于程序分支的即时编译方法能够应用到函数内部。这种方法实现了跨函数的即时编译优化,使得函数内外的热点分支都得到了编译处理,而不常用的程序分支仍保留解释执行方式。对于递归定义的函数和子例程,则将函数体中的第一个基本块看作循环入口的基本块,采用上述即时编译方法,仍然可以保证最常用的程序分支参与编译处理,不针对其他非常用的分支进行编译优化,以避免不必要的编译开销。
【权利要求】
1.基于树型程序分支的计算机程序即时编译方法,其特征在于:计算机程序是按照结构化基本块流图的表不,实现步骤如下: 步骤Si按照控制流的指示,依次解释执行每个基本块,遇到循环结构时则记录程序分支的起点; 步骤S2如果再次遇到相同循环结构的起点时,则记录程序分支信息,累计该分支的出现次数; 步骤S3如果当前分支路径的出现次数大于给定的阈值,则按照以下步骤对当前分支进行编译处理: 步骤S3.1为当前分支设置编译标记,表示为热点分支; 步骤S3.2按照以下步骤,对当前分支中的每个基本块进行编译处理: 步骤S3.2.1将当前基本块翻译为目标代码模块; 步骤S3.2.2遇到其他分支入口,则生成出口指令; 步骤S3.2.3将步骤S3.2.1和S3.2.2生成的代码合并为目标程序分支; 步骤S3.3保存步骤S3.2所生成的目标程序分支; 步骤S3.4如果当前分支和其他分支有包含关系,则按照以下步骤进行处理: 步骤S3.4.1如果当前分支中包含了其他热点分支,则将其他热点分支作为当前分支的子分支,合并为树型的程序分支; 步骤S3.4.2如果当前分支入口属于其他热点分支,则将当前分支作为其他热点分支的子分支,合并为树型的程序分支; 步骤S3.4.3如果当前分支中部分基本块属于其他热点分支,且分支入口相同,则将其他热点分支作为当前分支的子分支,合并为树型的程序分支; 步骤S4每当再次执行循环结构时,如果该循环已经具有编译标记,则将解释执行方式切换为编译执行方式,按照以下步骤进行执行目标程序中的每条指令: 步骤S4.1将解释执行环境的上下文信息转换为目标程序的上下文信息,并保留返回地址; 步骤S4.2按照控制指令顺序执行目标程序中的指令序列; 步骤S4.3如果遇到了出口指令,则将编译执行方式切换为解释执行方式,按照目标程序的上下文信息恢复解释执行环境的上下文信息,随后按照出口指令的指示继续程序的解释执行。 步骤S4.4如果目标程序执行结束,则将编译执行方式切换为解释执行方式,按照目标程序的上下文信息恢复解释执行环境的上下文信息,随后按照预留的返回地址,继续下一基本块的解释执行。
2.根据权利要求基于树型程序分支的计算机程序即时编译方法,其特征在于:所述的给定阈值按照结构化基本块流图的规模和程序输入数据规模给定的,取值范围大于O。
3.根据权利要求基于树型程序分支的计算机程序即时编译方法,其特征在于:所述基于树型程序分支的计算机程序即时编译方法中出口指令,其包含其他分支入口的信息,但不包含分支全部内容,用以在当前分支中表示其他分支的指令。
【文档编号】G06F9/45GK103838616SQ201410078456
【公开日】2014年6月4日 申请日期:2014年3月5日 优先权日:2014年3月5日
【发明者】廖湖声, 武辰之, 于成龙, 高红雨, 苏航 申请人:北京工业大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1