一种指令生成方法、装置、电子设备及存储介质制造方法及图纸

技术编号:27562259 阅读:56 留言:0更新日期:2021-03-09 22:04
本发明专利技术实施例提供了一种指令生成方法和装置,所述方法包括:在静态编译过程中,获取需即时编译的父程序调用的需静态编译的子程序,确定所述子程序使用寄存器的使用信息,然后在即时编译过程中,根据所述使用信息,生成所述寄存器的编译后的保存指令或恢复指令,使得即时编译器可以得知静态编译的子程序使用寄存器的情况,继而能够只针对必要的寄存器生成保存或恢复指令,达到减少即时编译器生成的指令数量的效果,从而提高即时编译的程序的执行性能。能。能。

【技术实现步骤摘要】
一种指令生成方法、装置、电子设备及存储介质


[0001]本专利技术涉及计算机
,特别是涉及一种指令生成方法、一种指令生成装置、一种电子设备以及一种可读存储介质。

技术介绍

[0002]动态编译是某些程式语言在执行时用来增进效能的方法,一般指的是程序在运行时进行编译。与之相对的是事前编译,也叫静态编译。静态编译就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应静态库(例如,拓展名为.a或.lib的库)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。静态编译典型的例子是gcc(GNU Compiler Collection,GNU编译器套件)的编译方式。gcc会先将源程序编译成可执行的机器码,在部署或分发程序时,直接部署编译后的机器码即可,在程序执行时不再需要编译过程。
[0003]动态编译的典型例子是Java(一种计算机编程语言)虚拟机中的即时编译(Just-in-time compilation,简称JIT)方式。Java程序是一种字节码程序,并不能在实际的物理机上直接执行,在执行Java程序时一般先进行解释执行,其执行速度肯定比可执行的二进制机器码程序慢。为了提高执行速度,引入了JIT。在运行时,当识别到热点方法或循环时,JIT会对热点方法进行动态编译,将字节码编译成本地可执行的机器码,,然后直接运行编译后的机器码,并把翻译过来的机器码保存起来,以备下次使用。
[0004]编译的程序中会存在调用者和被调用者。在进行子程序调用时,由调用者(caller)负责保存的寄存器称为caller-saved(调用者保存)寄存器。在进行子程序调用时,由被调用者(callee)负责保存的寄存器称为callee-saved(被调用者保存)寄存器。
[0005]在编译一个程序中的调用者和被调用者时,若调用者和被调用者在同一编译器和同一时刻进行编译,在编译时编译器知道被调用子程序的信息,因此可以在编译时确定子程序所需的寄存器,在调用处只保存子程序中使用了的caller-saved寄存器即可,从而避免保存和恢复不必要的caller-saved寄存器,生成最优的代码。
[0006]但是显然这种方式无法适用于即时编译和静态编译混用的情况。在即时编译时,被调用子程序已经由其他静态编译器编译成机器码,无法进行相关的寄存器保存和恢复的优化。
[0007]现有技术中,在即时编译程序调用静态编译程序的前后,不得不对所有的caller-saved寄存器进行保存和恢复操作,有可能会产生一些不必要的保存和恢复,在caller-saved寄存器较多的体系结构中,有可能会产生较大的性能开销。

技术实现思路

[0008]本专利技术实施例所要解决的技术问题是提供一种指令生成方法、装置、电子设备及可读存储介质,以便解决即时编译和静态编译混用时无法对寄存器的保存与恢复进行优化的问题。
[0009]为了解决上述问题,本专利技术提供了一种指令生成方法,包括:
[0010]在静态编译过程中,获取需即时编译的父程序调用的需静态编译的子程序;
[0011]在静态编译过程中,确定所述子程序使用寄存器的使用信息;
[0012]在即时编译过程中,根据所述使用信息,生成所述寄存器的编译后的保存指令或恢复指令。
[0013]可选地,所述获取需即时编译的父程序调用的需静态编译的子程序包括:
[0014]在待静态编译的子程序调用函数中识别到第一关键字,其中,所述第一关键字用于标识需即时编译的父程序调用的需静态编译的子程序;
[0015]获取所述第一关键字对应的所述子程序。
[0016]可选地,所述确定所述子程序使用寄存器的使用信息包括:
[0017]对所述子程序进行静态编译,得到所述使用信息;
[0018]保存所述使用信息到缓存中。
[0019]可选地,所述保存所述使用信息到缓存中包括:
[0020]在待静态编译的入栈函数或出栈函数中识别到第二关键字,其中,所述第二关键字用于标识所述使用信息;
[0021]将所述第二关键字对应的所述使用信息传递给入栈函数或出栈函数。
[0022]可选地,在所述获取需即时编译的父程序调用的需静态编译的子程序之前,所述方法还包括:
[0023]检测静态编译器是否符合预设要求;
[0024]若不符合所述预设要求,则将所述使用信息替换为预设使用信息,且将待静态编译的程序代码中的第一关键字或第二关键字置为空,其中,所述第一关键字用于标识需即时编译的父程序调用的需静态编译的子程序,所述第二关键字用于标识所述使用信息。
[0025]相应的,本专利技术还提供了一种指令生成装置,包括:
[0026]子程序获取模块,用于在静态编译过程中,获取需即时编译的父程序调用的需静态编译的子程序;
[0027]信息确定模块,用于在静态编译过程中,确定所述子程序使用寄存器的使用信息;
[0028]指令生成模块,用于在即时编译过程中,根据所述使用信息,生成所述寄存器的编译后的保存指令或恢复指令。
[0029]可选地,所述子程序获取模块包括:
[0030]第一识别子模块,用于在待静态编译的子程序调用函数中识别到第一关键字,其中,所述第一关键字用于标识需即时编译的父程序调用的需静态编译的子程序;
[0031]子程序获取子模块,用于获取所述第一关键字对应的所述子程序。
[0032]可选地,所述信息确定模块包括:
[0033]编译子模块,用于对所述子程序进行静态编译,得到所述使用信息;
[0034]保存子模块,用于保存所述使用信息到缓存中。
[0035]可选地,所述保存子模块包括:
[0036]第二识别单元,用于在待静态编译的入栈函数或出栈函数中识别到第二关键字,其中,所述第二关键字用于标识所述使用信息;
[0037]传递单元,用于将所述第二关键字对应的所述使用信息传递给入栈函数或出栈函
数。
[0038]可选地,所述装置还包括:
[0039]检测模块,用于在所述获取需即时编译的父程序调用的需静态编译的子程序之前,检测静态编译器是否符合预设要求;
[0040]替换模块,用于若不符合所述预设要求,则将所述使用信息替换为预设使用信息,且将待静态编译的程序代码中的第一关键字或第二关键字置为空,其中,所述第一关键字用于标识需即时编译的父程序调用的需静态编译的子程序,所述第二关键字用于标识所述使用信息。
[0041]相应的,本专利技术还提供了一种电子设备,包括有存储器,以及一个或者一个以上的程序,其中一个或者一个以上程序存储于存储器中,且经配置以由一个或者一个以上处理器执行所述一个或者一个以上程序包含用于进行以下操作的指令:
[0042]在静态编译过程中,获取需即时编译的父程序调用的需静态编译的子程序;
[0043]在静态编译过程中,确定所述子程序使用寄存器的使用信息;...

【技术保护点】

【技术特征摘要】
1.一种指令生成方法,其特征在于,包括:在静态编译过程中,获取需即时编译的父程序调用的需静态编译的子程序;在静态编译过程中,确定所述子程序使用寄存器的使用信息;在即时编译过程中,根据所述使用信息,生成所述寄存器的编译后的保存指令或恢复指令。2.根据权利要求1所述的方法,其特征在于,所述获取需即时编译的父程序调用的需静态编译的子程序包括:在待静态编译的子程序调用函数中识别到第一关键字,其中,所述第一关键字用于标识需即时编译的父程序调用的需静态编译的子程序;获取所述第一关键字对应的所述子程序。3.根据权利要求1所述的方法,其特征在于,所述确定所述子程序使用寄存器的使用信息包括:对所述子程序进行静态编译,得到所述使用信息;保存所述使用信息到缓存中。4.根据权利要求3所述的方法,其特征在于,所述保存所述使用信息到缓存中包括:在待静态编译的入栈函数或出栈函数中识别到第二关键字,其中,所述第二关键字用于标识所述使用信息;将所述第二关键字对应的所述使用信息传递给入栈函数或出栈函数。5.根据权利要求1-4中任一项所述的方法,其特征在于,在所述获取需即时编译的父程序调用的需静态编译的子程序之前,所述方法还包括:检测静态编译器是否符合预设要求;若不符合所述预设要求,则将所述使用信息替换为预设使用信息,且将待静态编译的程序代码中的第一关键字或第二关键字置为空,其中,所述第一关键字用于标识需即时编译的父程序调用的需静态编译的子程序,所述第二关键字用于标识所述使用信息。6.一种指令生成装置,其特征在于,包括:子程序获取模块,用于在静态编译过程中,获取需即时编译的父程序调用的需静态编译的子程序;信息确定模块,用于在静态编译过程中,确定所述子程序使用寄存器的使用信息;指令生成模块,用于在即时编译过程中,根据所述使用信息,生成所述寄存器的编译后的保存指令或恢复指令。7.根据权利要求6所述的装置,其特征在于,所述子程序获取模...

【专利技术属性】
技术研发人员:敖琪王雪井田高翔
申请(专利权)人:龙芯中科技术股份有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1