程序代码编译方法、装置、电子设备及存储介质与流程

文档序号:30509527发布日期:2022-06-25 01:28阅读:91来源:国知局
程序代码编译方法、装置、电子设备及存储介质与流程

1.本技术涉及计算机技术领域,尤其涉及一种程序代码编译方法、装置、电子设备及存储介质。


背景技术:

2.程序代码通常包括多个函数,多个函数既有主调函数又有被主调函数调用的被调函数。主调函数调用被调函数时,需要借助寄存器和调用栈(call stack)传递数据。通常,主调函数在调用被调函数时,假设被调函数会修改cpu(central processing unit,中央处理器)中全部的寄存器所保存的数值,为此需要将全部的寄存器所保存的数值保存至调用栈(call stack)上,并在函数调用结束后,将保存在调用栈的数值重新恢复至寄存器中。若遇到程序代码的代码量比较大,且被调函数比较多的情况,上述方式会浪费很多算力,影响程序代码性能。


技术实现要素:

3.本技术的多个方面提供一种程序代码编译方法、装置、电子设备及存储介质,用以减少指令消耗,降低保存寄存器消耗的算力资源,降低寄存器被修改的频率,改善程序代码性能和体积。
4.本技术实施例提供一种程序代码编译方法,包括:获取目标应用程序对应的以源语言表示的源代码,目标应用程序是指依托于虚拟化运行环境的应用程序;针对源代码定义函数调用约定,函数调用约定指示被调用者保存寄存器集合以及该集合中被调用者保存寄存器在调用栈上的保存顺序;根据函数调用约定对源代码进行编译,以及在编译过程中至少在中间代码生成阶段、指令选择阶段和寄存器分配阶段针对函数调用约定进行实现,以得到可执行代码。
5.本技术实施例还提供一种程序代码编译装置,包括:获取模块,用于获取目标应用程序对应的以源语言表示的源代码,目标应用程序是指依托于虚拟化运行环境的应用程序;定义模块,用于针对源代码定义函数调用约定,函数调用约定指示被调用者保存寄存器集合以及该集合中被调用者保存寄存器在调用栈上的保存顺序;编译模块,用于根据函数调用约定对源代码进行编译,以及在编译过程中至少在中间代码生成阶段、指令选择阶段和寄存器分配阶段针对函数调用约定进行实现,以得到可执行代码。
6.本技术实施例还提供一种电子设备,包括:存储器和处理器;存储器,用于存储计算机程序;处理器耦合至存储器,用于执行计算机程序以用于执行程序代码编译方法中的步骤。
7.本技术实施例还提供一种存储有计算机程序的计算机存储介质,当计算机程序被处理器执行时,致使处理器能够实现程序代码编译方法中的步骤。
8.在本技术实施例中,在程序代码编译过程中引入被调用者寄存器机制,使得在程序运行时,被调函数只会对被调用者保存寄存器集合中的寄存器进行入栈保护,且是在需
要修改被调用者保存寄存器集合中的寄存器的情况下,才会保存这些寄存器的值到调用栈上并在调用结束时恢复至寄存器中,如果不需要修改这些寄存器的值,则不保存这些寄存器的值到调用栈,由此,在很大程度上可以减少指令消耗,降低保存寄存器消耗的算力资源,降低寄存器被修改的频率,改善程序代码性能和体积。
附图说明
9.此处所说明的附图用来提供对本技术的进一步理解,构成本技术的一部分,本技术的示意性实施例及其说明用于解释本技术,并不构成对本技术的不当限定。在附图中:
10.图1为本技术实施例提供的一种程序代码编译方法的流程图;
11.图2为本技术实施例提供的一种程序代码编译装置的结构示意图;
12.图3为本技术实施例提供的一种电子设备的结构示意图。
具体实施方式
13.为使本技术的目的、技术方案和优点更加清楚,下面将结合本技术具体实施例及相应的附图对本技术技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。
14.通常,主调函数在调用被调函数时,假设被调函数会修改cpu(central processing unit,中央处理器)中全部的寄存器所保存的数值,为此需要将全部的寄存器所保存的数值保存至调用栈(call stack)上,并在函数调用结束后,将保存在调用栈的数值重新恢复至寄存器中。若遇到程序代码的代码量比较大,且被调函数比较多的情况,上述方式会浪费很多算力,影响程序代码性能。针对上述技术问题,本技术实施例提供一种程序代码编译方法、装置、电子设备及存储介质。在本技术实施例中,在程序代码编译过程中引入被调用者寄存器机制,使得在程序运行时,被调函数只会对被调用者保存寄存器集合中的寄存器进行入栈保护,且是在需要修改被调用者保存寄存器集合中的寄存器的情况下,才会保存这些寄存器的值到调用栈上并在调用结束时恢复至寄存器中,如果不需要修改这些寄存器的值,则不保存这些寄存器的值到调用栈,由此,在很大程度上可以减少指令消耗,降低保存寄存器消耗的算力资源,降低寄存器被修改的频率,改善程序代码性能和体积。
15.以下结合附图,详细说明本技术各实施例提供的技术方案。
16.图1为本技术实施例提供的一种程序代码编译方法的流程图。该方法可由程序代码编译装置执行,该装置可以由软件和/或硬件的方式实现,并一般可以集成在电子设备中。参见图1,该方法可以包括以下步骤:
17.101、获取目标应用程序对应的以源语言表示的源代码,目标应用程序是指依托于虚拟化运行环境的应用程序。
18.102、针对源代码定义函数调用约定,函数调用约定指示被调用者保存寄存器集合以及该集合中被调用者保存寄存器在调用栈上的保存顺序。
19.103、根据函数调用约定对源代码进行编译,以及在编译过程中至少在中间代码生成阶段、指令选择阶段和寄存器分配阶段针对函数调用约定进行实现,以得到可执行代码。
20.通常,编译器(compiler)编译程序代码的流程是使用不同的编译工具对源代码文件进行语法分析和词法分析等,形成抽象语法树(abstract syntax code,ast);在中间代码生成阶段,将抽象语法树转换成中间表示(intermediate representation,ir),并对中间表示进行优化;在指令选择(instruction selection)阶段,优化后的中间表示经过指令选操作,可转换成机器可识别的机器代码;在寄存器分配阶段,对机器代码执行寄存器分配操作,得到最终可执行代码。其中,编译器可以是采用llvm(low level virtual machine,底层虚拟机)构架的编译器(compiler)。
21.本实施例对源代码的源语言不做限制,源语言例如包括但不限于:dart语言、c语言和c++语言等各种编程语言。其中,dart是面向对象的、类定义的、单继承的编程语言,支持接口(interfaces)、混入(mixins)、抽象类(abstract classes)、具体化泛型(reified generics)、可选类型(optional typing)等。
22.在本实施例中,可以对应用程序关联的源代码进行编译。其中,应用程序可以是依托于虚拟化运行环境或真实电子设备的应用程序。其中,依托于虚拟化运行环境备的应用程序可以理解为运行在虚拟机(virtual machine,vm)中的应用程序。为了便于理解,将依托于虚拟化运行环境的应用程序称作为目标应用程序。可选地,目标应用程序可以是flutter引擎或者是使用flutter引擎的应用程序。其中,flutter引擎以hummer为代号,也可以称为hummer引擎,但不限于此。在目标应用程序为使用flutter/hummer引擎的应用程序,且该应用程序对应的代码是采用dart语言编写的情况下,则可以提供vm运行环境(例如提供dart运行环境的虚拟机,可简称为dart虚拟机),并在vm运行环境中使用llvm编译器,采用利用llvm编译器的能力对源代码进行编译从而改进目标应用程序对应的可执行代码的质量。本实施例的编译过程融合了被调用者保存寄存器机制,具体编译过程参见下述实施例。
23.在本实施例中,对需要编译的源代码进行函数调用约定的定义。所定义的函数调用约定指示被调用者保存寄存器集合以及该集合中被调用者保存寄存器在调用栈上的保存顺序。其中,被调用者保存寄存器(callee saved registers)是指供被主调函数进行传参使用的寄存器,被调用者保存寄存器中的数值可以被被调函数进行访问和修改。如果被调函数需要修改被调用者保存寄存器中的数值,则需要将该被调用者保存寄存器中的数值保存到调用栈中,并在函数调用后,由被调函数恢复,即从调用栈读出并重新写入该被调用者保存寄存器中。与被调用者保存寄存器相对的是调用者保存寄存器(caller saved registers),调用者保存寄存器中的数值不需要保存,如果某个程序需要保存该调用者保存寄存器的值,需要主调函数将调用者保存寄存器的值先保存至调用栈中。通常,在cpu可提供的寄存器中,寄存器rax、寄存器rcx、寄存器rdx、寄存器r8、寄存器r9、寄存器r10、寄存器r11等被划分为调用者保存寄存器。寄存器rbx、寄存器rbp、寄存器rdi、寄存器rsi、寄存器rsp、寄存器r12、寄存器r13、寄存器r14和寄存器r15等被划分为被调用者保存寄存器。
24.具体而言,针对源代码中每条主调函数调用被调函数的调用指令,将调用指令执行时被调函数所需使用到的寄存器作为该调用指令对应的被调用者保存寄存器,并将该被调用者保存寄存器加入至该调用指令对应的被调用者保存寄存器集合,最后,根据被调用者保存寄存器集合及该集合中被调用者保存寄存器在调用栈上的保存顺序定义该调用指令的函数调用约定。其中,被调用者保存寄存器集合中各个被调用者保存寄存器按照被调
用者保存寄存器在调用栈上的保存顺序进行排序。被调用者保存寄存器在调用栈上的保存顺序是指被调函数将对应的被调用者保存寄存器中的数值保存至调用栈的顺序。例如,某条调用指令涉及的被调函数依次需要使用寄存器r12、寄存器r13和寄存器r14,则该条调用指令对应的被调用者保存寄存器集合中依次包括寄存器r12、寄存器r13和寄存器r14。
25.在针对源代码中的调用指令进行函数调用约定后,基于函数调用约定对源代码进行编译。整个编译流程与常规编译流程基本一致,不同的是,在编译过程中至少在中间代码生成阶段、指令选择阶段和寄存器分配阶段针对函数调用约定进行实现,以得到支持被调用者保存寄存器机制的可执行代码。本实施例得到的可执行代码在运行过程中,可降低寄存器被修改的频率,进而降低保存寄存器的次数,消耗减少的算力资源,具有较好的代码执行性能。
26.作为一种示例,在中间代码生成阶段针对函数调用约定进行实现的可选实现方式是:在将源代码转换成中间代码过程中,在中间代码的函数声明中和中间态调用指令中添加属性信息,以得到中间代码;其中,该属性信息均表征被调用者保存寄存器集合以及该集合中被调用者保存寄存器在调用栈上的保存顺序。
27.值得注意的是,属性信息表示形式与中间代码对应的中间表示方式有关。以llvm编译器为例,llvm中间代码是一种llvm底层指令。可选的,若中间代码对应的中间表示方式支持字符串,则属性信息为自定义的字符串。例如,某条调用指令对应的函数调用约定对应的是{r10,r11,r12,r13}集合,则以字符串表示的属性信息为{r10,r11,r12,r13},该字符串表示的属性信息在中间代码生成阶段,会被添加至中间代码的函数声明中和中间态调用指令中。其中,中间态调用指令是源代码中的调用指令在中间代码生成阶段转化得到的中间表示。
28.值得注意的是,在中间代码的函数声明中也添加属性信息,可以通知编译器有新增的函数调用约定需要在编译过程中进行处理。
29.作为一种示例,在指令选择阶段针对函数调用约定进行实现的可选实现方式是:在将中间代码转换成目标机器代码过程中,针对用于为中间态调用指令选择机器调用指令的选择算法,添加对属性信息进行处理的处理算法;处理算法用于把属性信息转换为被选择的机器调用指令的操作数的对象,操作数的对象表示执行该机器调用指令的主调函数不能修改被调用者保存寄存器集合中的被调用者保存寄存器。
30.在本实施例,用于为中间态调用指令选择机器调用指令的选择算法可以是现有的任意指令选择算法,例如包括但不限于:基于树模式匹配(tree-based pattern-matching)算法、基于模式扩展(pattern expansion)算法和基于激进迭代式窥孔优化(aggressive iterative peephole optimization)算法。
31.在本实施例中,在选择算法中添加对中间代码中新增的属性信息进行处理的处理算法,经过该处理算法处理的属性信息在指令选择阶段被转换成机器调用指令的操作数的对象,该操作数的对象表示执行该机器调用指令的主调函数不能修改被调用者保存寄存器集合中的被调用者保存寄存器。可选地,在采用llvm编译器的情况下,该操作数的对象可以是一个regmask类型的对象,该对象是一个位集合,集合内的寄存器不会被修改。其中,机器调用指令是指可被机器执行的调用指令。机器调用指令是中间表示的中间态调用指令经过指令选择得到的,也是源语言表示的调用指令所对应的机器代码。
32.值得注意的是,在代码执行阶段,在执行到机器调用指令时,基于为机器调用指令新增的操作数的对象,主调函数不能修改被调用者保存寄存器集合中的被调用者保存寄存器,另外,基于为机器调用指令新增的操作数的对象,机器调用指令所调用的被调函数仅仅会使用被调用者保存寄存器集合中的被调用者保存寄存器,也即,被调函数仅仅是将被调用者保存寄存器中的数值保存至调用栈上,并在调用结束后,将保存至调用栈上的数值恢复至被调用者保存寄存器中。举例来说,在指令选择阶段,对中间代码中新增的以字符串形式表示的属性信息进行处理,得到的操作数可以是regmask形式,llvm通过regmask形式能够识别调用约定。regmask形式是个集合,比如regmask{r10,r11,r12,r13}表示对应的机器调用指令的主调函数不会修改寄存器r10、r11、r12和r13,符合之前被调用者保存寄存器集合约定,是约定的具体实现。
33.应理解,这样的函数调用方式由于不要求被调函数将cpu中全部的寄存器的值保存在调用栈上,并在调用结束后,将调用栈上的数值恢复至各个寄存器中,能够极大地减少指令消耗,节约算力资源,改善程序代码性能。
34.作为一种示例,在寄存器分配阶段针对函数调用约定进行实现的可选实现方式是:在采用的寄存器分配算法中添加干扰算法,干扰算法用于限定被调用者保存寄存器集合与垃圾回收操作可操作的变量类型之间的分配关系;基于添加干扰算法之后的寄存器分配算法,为目标机器代码中的变量分配寄存器。
35.寄存器分配,是通过将程序变量尽可能地分配到寄存器,从而提高程序执行速度的一种方法。本实施例的寄存器是指编译器用于表示变量的寄存器,可以是cpu寄存器或者是调用栈上的空间,本技术实施例中重点是指cpu寄存器。可选地,在采用llvm编译器的情况下,寄存器分配也被称为llvm liveintervals。llvm liveintervals是一种llvm算法,用于计算寄存器的生命周期和干扰,可以生成llvm liveinterval集合用于查询。llvm liveinterval是llvm数据结构,用于描述寄存器的生命周期。在本实施例中,寄存器分配算法可以是现有任意的寄存器分配算法,例如包括但不限于:图着色(graph coloring)算法、线性扫描(linear scan)算法、整数线性规划算法、基于ssa(static single assignment,静态单赋值)的寄存器分配算法。
36.在本实施例中,在寄存器分配算法中新增干扰算法,该干扰算法基于限定被调用者保存寄存器集合与垃圾回收操作可操作的变量类型之间的分配关系,可以约束被调用者保存寄存器集合所分配到的变量。其中,分配关系可以指示目标机器代码中具有与垃圾回收操作可操作的变量类型相同的变量是否可以分配给被调用者保存寄存器集合中的被调用者保存寄存器。
37.其中,垃圾回收(garbage collection,gc)操作的目的是为了追踪所有正在使用的对象,并且将剩余的对象标记为垃圾,随后标记为垃圾的对象会被清除,回收这些垃圾对象占据的内存,从而实现内存的自动管理。
38.值得注意的是,在目标机器代码的变量的变量类型是垃圾回收(garbage collection,gc)操作可操作的变量类型,则在垃圾回收操作触发期间,垃圾回收操作会对保存该变量的数值的内存空间进行扫描,并在确定所扫描的变量的数值是活跃值时,继续在内存空间中保存该活跃值;并在确定所扫描的变量的数值不是活跃值时,则清除在内存空间中所保存的活跃值。关于内存管理中的垃圾回收操作的更多介绍可以参见相关技术。
39.作为一种示例,基于添加干扰算法之后的寄存器分配算法,为目标机器代码中的变量分配寄存器的可选实现方式是:针对被调用者保存寄存器集合中的每个被调用者保存寄存器,遍历目标代码中的机器调用指令涉及的变量;若当前遍历到的变量的变量类型属于上述分配关系中限定的指针类型或者引用类型,则将当前遍历到的变量分配给被调用者保存寄存器。
40.其中,上述分配关系中指示垃圾回收操作可操作的变量类型可以是指针类型或者引用类型,而除指针类型或者引用类型之前的其他变量类型不是垃圾回收操作可操作的变量类型。其他变量类型例如包括但不限于:整数类型、字符类型、浮点型等等。
41.值得注意的是,在机器调用指令涉及的变量不属于上述分配关系中限定的指针类型或者引用类型,则将cpu中的其他寄存器分配给当前遍历到的变量。
42.作为另一种示例,基于添加干扰算法之后的寄存器分配算法,为目标机器代码中的变量分配寄存器的可选实现方式是:针对目标代码中的任意变量,遍历cpu中的寄存器,若当前遍历到的寄存器为被调用者保存寄存器集合中的被调用者保存寄存器;判断变量的变量类型是否属于分配关系中限定的指针类型或者引用类型;若变量的变量类型是分配关系中限定的指针类型或者引用类型,则将当前遍历到的被调用者保存寄存器分配给变量;若变量的变量类型是除指针类型或者引用类型之外的其他变量类型,则禁止将被调用者保存寄存器分配给变量。
43.举例来说,假如gc不应该扫描的值分配到被调用者保存寄存器集合中某个被调用者保存寄存器,且机器调用指令执行时被调用函数使用了该被调用者保存寄存器,例如,一个gc不应该扫描的整数值0分配到了被调用者保存寄存器r10中,被调用函数也使用了r10,根据函数调用约定,整数值0需要保存至调用栈上。假如此时发生了gc操作,gc检查到被调用函数时,会扫描调用栈上r10值所在的位置,从而扫描到了整数值0,此时,gc操作会尝试标记内存中整数值0所对应的对象,从而引起崩溃。
44.实际应用中,有些源代码会使用了安全点(safe point)技术。安全点是在程序执行期间的所有gc root已知并且所有堆对象的内容一致的点。gc root是指垃圾收集器(garbage collector)的对象,gc会收集哪些不是gc roots且没有被gc roots引用的对象。若源代码使用了安全点技术,则上述方法还包括:在编译过程中的安全点生成阶段,针对函数调用约定进行实现。
45.进一步可选的,在编译过程中的安全点生成阶段,针对函数调用约定进行实现包括:针对指令选择阶段选择出的机器调用指令生成对应的安全点,在安全点的元数据中增加被调用者保存寄存器集合中的被调用者保存寄存器在调用栈中对应的扫描位置。
46.实际应用中,可以为每条机器调用指令生成一个对应的安全点,并在安全点的元数据新增该机器调用指令对应的扫描位置,该扫描位置是指被调用者保存寄存器集合中的被调用者保存寄存器在调用栈中对应的扫描位置。gc可以安全地扫描这些位置上的值而不会崩溃。在本实施例中,针对使用了安全点的函数能够全面地利用被调用者保存寄存器机制降低生成代码的体积、提高代码的性能。
47.在本实施例中,在源代码经过上述编译过程之后可得到可执行代码,该可执行代码支持被调用者保存寄存器机制,因此,与传统可执行代码的执行过程有所不同,具体是指:在可执行代码的运行阶段,在运行到可执行代码的入口点时,可以初始化被调用者保存
寄存器集合中被调用者保存寄存器为特定值,其中,特定值例如为null值,null值是一个可以被gc安全扫描的值;以及在可执行代码运行过程中垃圾回收操作被触发时,若垃圾回收操作涉及机器调用指令,根据对应安全点中的扫描位置对调用栈进行扫描。
48.本技术实施例提供的程序代码编译方法,在程序代码编译过程中引入被调用者寄存器机制,使得在程序运行时,被调函数只需在需要修改被调用者保存寄存器集合中寄存器的值时,才会将这些寄存器中的值保存到调用栈上并在调用结束时恢复至寄存器中,对cpu中被调函数所不使用的其它寄存器无需保存这些寄存器到调用栈,由此,在很大程度上可以减少指令消耗,降低保存寄存器消耗的算力资源,降低寄存器被修改的频率,改善程序代码性能和体积。另外,本实施例的程序代码编译方法,可以在所有函数上使用,既能应用于快路径,也能应用于慢路径。其中,快/慢路径是指程序发生跳转的时候定义进入频率高低的路径,例如检查栈空间是否溢出,不溢出是快路径,溢出是慢路径。由于不溢出的概率程序确定是高概率事件,所以定义为为快路径。
49.需要说明的是,上述实施例所提供方法的各步骤的执行主体均可以是同一设备,或者,该方法也由不同设备作为执行主体。比如,步骤101至步骤103的执行主体可以为设备a;又比如,步骤101和102的执行主体可以为设备a,步骤103的执行主体可以为设备b;等等。
50.另外,在上述实施例及附图中的描述的一些流程中,包含了按照特定顺序出现的多个操作,但是应该清楚了解,这些操作可以不按照其在本文中出现的顺序来执行或并行执行,操作的序号如101、102等,仅仅是用于区分开各个不同的操作,序号本身不代表任何的执行顺序。另外,这些流程可以包括更多或更少的操作,并且这些操作可以按顺序执行或并行执行。需要说明的是,本文中的“第一”、“第二”等描述,是用于区分不同的消息、设备、模块等,不代表先后顺序,也不限定“第一”和“第二”是不同的类型。
51.图2为本技术实施例提供的一种程序代码编译装置的结构示意图。参见图2,该装置可以包括:获取模块21、定义模块22和编译模块23。
52.其中,获取模块21,用于获取目标应用程序对应的以源语言表示的源代码,目标应用程序是指依托于虚拟化运行环境的应用程序;
53.定义模块22,用于针对源代码定义函数调用约定,函数调用约定指示被调用者保存寄存器集合以及该集合中被调用者保存寄存器在调用栈上的保存顺序;
54.编译模块23,用于根据函数调用约定对源代码进行编译,以及在编译过程中至少在中间代码生成阶段、指令选择阶段和寄存器分配阶段针对函数调用约定进行实现,以得到可执行代码。
55.进一步可选的,编译模块23在中间代码生成阶段针对函数调用约定进行实现时,具体用于:在将源代码转换成中间代码过程中,在中间代码的函数声明中和中间态调用指令中添加属性信息,以得到中间代码;其中,属性信息均表征被调用者保存寄存器集合以及该集合中被调用者保存寄存器在调用栈上的保存顺序。
56.进一步可选的,中间代码对应的中间表示方式支持字符串,则属性信息为自定义的字符串。
57.进一步可选的,编译模块23在指令选择阶段针对函数调用约定进行实现时,具体用于:在将中间代码转换成目标机器代码过程中,针对用于为中间态调用指令选择机器调用指令的选择算法,添加对属性信息进行处理的处理算法;处理算法用于把属性信息转换
为被选择的机器调用指令的操作数的对象,操作数的对象表示执行该机器调用指令的主调函数不能修改被调用者保存寄存器集合中的被调用者保存寄存器。
58.进一步可选的,编译模块23在寄存器分配阶段针对函数调用约定进行实现时,具体用于:在采用的寄存器分配算法中添加干扰算法,干扰算法用于限定被调用者保存寄存器集合与垃圾回收操作可操作的变量类型之间的分配关系;基于添加干扰算法之后的寄存器分配算法,为目标机器代码中的变量分配寄存器。
59.进一步可选的,编译模块23基于添加干扰算法之后的寄存器分配算法,为目标机器代码中的变量分配寄存器时,具体用于:针对被调用者保存寄存器集合中的每个被调用者保存寄存器,遍历目标代码中的机器调用指令涉及的变量;若当前遍历到的变量的变量类型属于分配关系中限定的指针类型或者引用类型,则将当前遍历到的变量分配给被调用者保存寄存器。
60.进一步可选的,若源代码使用了安全点技术,则编译模块23还用于:
61.在编译过程中的安全点生成阶段,针对函数调用约定进行实现。
62.进一步可选的,编译模块23在编译过程中的安全点生成阶段,针对函数调用约定进行实现时,具体用于:针对指令选择阶段选择出的机器调用指令生成对应的安全点,在安全点的元数据中增加被调用者保存寄存器集合中的被调用者保存寄存器在调用栈中对应的扫描位置。
63.进一步可选的,还包括:执行模块;执行模块,用于在运行到可执行代码的入口点时,初始化被调用者保存寄存器集合中被调用者保存寄存器为特定值;以及在可执行代码运行过程中垃圾回收操作被触发时,若垃圾回收操作涉及机器调用指令,根据对应安全点中的扫描位置对调用栈进行扫描。
64.图2所示的程序代码编译装置可以执行图1所示实施例所示的程序代码编译方法,其实现原理和技术效果不再赘述。对于上述实施例中的程序代码编译装置其中各个模块、单元执行操作的具体方式已经在有关该方法的实施例中进行了详细描述,此处将不做详细阐述说明。
65.图3为本技术实施例提供的一种电子设备的结构示意图。如图3所示,该电子设备包括:存储器31和处理器32;
66.存储器31,用于存储计算机程序,并可被配置为存储其它各种数据以支持在计算平台上的操作。这些数据的示例包括用于在计算平台上操作的任何应用程序或方法的指令,联系人数据,电话簿数据,消息,图片,视频等。
67.存储器31可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(sram),电可擦除可编程只读存储器(eeprom),可擦除可编程只读存储器(eprom),可编程只读存储器(prom),只读存储器(rom),磁存储器,快闪存储器,磁盘或光盘。
68.处理器32,与存储器31耦合,用于执行存储器31中的计算机程序,以用于:获取目标应用程序对应的以源语言表示的源代码,目标应用程序是指依托于虚拟化运行环境的应用程序;针对源代码定义函数调用约定,函数调用约定指示被调用者保存寄存器集合以及该集合中被调用者保存寄存器在调用栈上的保存顺序;根据函数调用约定对源代码进行编译,以及在编译过程中至少在中间代码生成阶段、指令选择阶段和寄存器分配阶段针对函
数调用约定进行实现,以得到可执行代码。
69.进一步可选的,处理器32在中间代码生成阶段针对函数调用约定进行实现时,具体用于:在将源代码转换成中间代码过程中,在中间代码的函数声明中和中间态调用指令中添加属性信息,以得到中间代码;其中,属性信息均表征被调用者保存寄存器集合以及该集合中被调用者保存寄存器在调用栈上的保存顺序。
70.进一步可选的,中间代码对应的中间表示方式支持字符串,则属性信息为自定义的字符串。
71.进一步可选的,处理器32在指令选择阶段针对函数调用约定进行实现时,具体用于:在将中间代码转换成目标机器代码过程中,针对用于为中间态调用指令选择机器调用指令的选择算法,添加对属性信息进行处理的处理算法;处理算法用于把属性信息转换为被选择的机器调用指令的操作数的对象,操作数的对象表示执行该机器调用指令的主调函数不能修改被调用者保存寄存器集合中的被调用者保存寄存器。
72.进一步可选的,处理器32在寄存器分配阶段针对函数调用约定进行实现时,具体用于:在采用的寄存器分配算法中添加干扰算法,干扰算法用于限定被调用者保存寄存器集合与垃圾回收操作可操作的变量类型之间的分配关系;基于添加干扰算法之后的寄存器分配算法,为目标机器代码中的变量分配寄存器。
73.进一步可选的,处理器32基于添加干扰算法之后的寄存器分配算法,为目标机器代码中的变量分配寄存器时,具体用于:针对被调用者保存寄存器集合中的每个被调用者保存寄存器,遍历目标代码中的机器调用指令涉及的变量;若当前遍历到的变量的变量类型属于分配关系中限定的指针类型或者引用类型,则将当前遍历到的变量分配给被调用者保存寄存器。
74.进一步可选的,若源代码使用了安全点技术,则处理器32还用于:
75.在编译过程中的安全点生成阶段,针对函数调用约定进行实现。
76.进一步可选的,处理器32在编译过程中的安全点生成阶段,针对函数调用约定进行实现时,具体用于:针对指令选择阶段选择出的机器调用指令生成对应的安全点,在安全点的元数据中增加被调用者保存寄存器集合中的被调用者保存寄存器在调用栈中对应的扫描位置。
77.进一步可选的,处理器32还用于在运行到可执行代码的入口点时,初始化被调用者保存寄存器集合中被调用者保存寄存器为特定值;以及在可执行代码运行过程中垃圾回收操作被触发时,若垃圾回收操作涉及机器调用指令,根据对应安全点中的扫描位置对调用栈进行扫描。
78.进一步,如图3所示,该电子设备还包括:通信组件33、显示器34、电源组件35、音频组件36等其它组件。图3中仅示意性给出部分组件,并不意味着电子设备只包括图3所示组件。另外,图3中虚线框内的组件为可选组件,而非必选组件,具体可视电子设备的产品形态而定。本实施例的电子设备可以实现为台式电脑、笔记本电脑、智能手机或iot设备等终端设备,也可以是常规服务器、云服务器或服务器阵列等服务端设备。若本实施例的电子设备实现为台式电脑、笔记本电脑、智能手机等终端设备,可以包含图3中虚线框内的组件;若本实施例的电子设备实现为常规服务器、云服务器或服务器阵列等服务端设备,则可以不包含图3中虚线框内的组件。
79.关于处理器执行各动作的详细实施过程可参见前述方法实施例或设备实施例中的相关描述,在此不再赘述。
80.相应地,本技术实施例还提供一种存储有计算机程序的计算机可读存储介质,计算机程序被执行时能够实现上述方法实施例中可由电子设备执行的各步骤。
81.相应地,本技术实施例还提供一种计算机程序产品,包括计算机程序/指令,当计算机程序/指令被处理器执行时,致使处理器能够实现上述方法实施例中可由电子设备执行的各步骤。
82.上述通信组件被配置为便于通信组件所在设备和其他设备之间有线或无线方式的通信。通信组件所在设备可以接入基于通信标准的无线网络,如wifi,2g、3g、4g/lte、5g等移动通信网络,或它们的组合。在一个示例性实施例中,通信组件经由广播信道接收来自外部广播管理系统的广播信号或广播相关信息。在一个示例性实施例中,通信组件还包括近场通信(nfc)模块,以促进短程通信。例如,在nfc模块可基于射频识别(rfid)技术,红外数据协会(irda)技术,超宽带(uwb)技术,蓝牙(bt)技术和其他技术来实现。
83.上述显示器包括屏幕,其屏幕可以包括液晶显示器(lcd)和触摸面板(tp)。如果屏幕包括触摸面板,屏幕可以被实现为触摸屏,以接收来自用户的输入信号。触摸面板包括一个或多个触摸传感器以感测触摸、滑动和触摸面板上的手势。触摸传感器可以不仅感测触摸或滑动动作的边界,而且还检测与触摸或滑动操作相关的持续时间和压力。
84.上述电源组件,为电源组件所在设备的各种组件提供电力。电源组件可以包括电源管理系统,一个或多个电源,及其他与为电源组件所在设备生成、管理和分配电力相关联的组件。
85.上述音频组件,可被配置为输出和/或输入音频信号。例如,音频组件包括一个麦克风(mic),当音频组件所在设备处于操作模式,如呼叫模式、记录模式和语音识别模式时,麦克风被配置为接收外部音频信号。所接收的音频信号可以被进一步存储在存储器或经由通信组件发送。在一些实施例中,音频组件还包括一个扬声器,用于输出音频信号。
86.本领域内的技术人员应明白,本技术的实施例可提供为方法、系统、或计算机程序产品。因此,本技术可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本技术可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
87.本技术是参照根据本技术实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
88.这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
89.这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
90.在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。
91.内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flash ram)。内存是计算机可读介质的示例。
92.计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
93.还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括要素的过程、方法、商品或者设备中还存在另外的相同要素。
94.以上仅为本技术的实施例而已,并不用于限制本技术。对于本领域技术人员来说,本技术可以有各种更改和变化。凡在本技术的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本技术的权利要求范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1