一种函数调用方法、计算设备及存储介质技术

技术编号:32785937 阅读:10 留言:0更新日期:2022-03-23 19:45
本发明专利技术公开了一种函数调用方法、计算设备及存储介质,该方法包括:对待运行程序中各待调用函数进行识别,以生成函数签名序号表;修改各待调用函数的调用指令;基于所述函数签名序号表,生成静态函数文件并进行编译;运行所述待运行程序,若运行期间发生函数调用,则根据所述函数签名序号表,按照修改后的调用指令调用对应函数。根据本发明专利技术的技术方案,通过自动构建、静态函数调用完成不同架构和平台之间的调用约定转换,实现了效率高、开销小的函数调用。调用。调用。

【技术实现步骤摘要】
一种函数调用方法、计算设备及存储介质


[0001]本专利技术涉及计算机
,特别涉及一种函数调用方法、计算设备及存储介质。

技术介绍

[0002]当前主流的跨平台跨架构的函数调用方案,是使用dyncall(一个动态调用库)的动态调用方式实现的。具体来说,在调用前手动填入具体的函数签名,并通过对函数签名识别处理,手动推动待处理参数到内部虚拟栈来实现ABI(Application Binary Interface,应用程序二进制接口)转换,进而在运行时解析相应的参数及类型信息,并按照机器架构的函数调用约定传入,执行完函数后再根据函数签名获取返回值并返回。
[0003]上述方案存在三个较大的缺陷:(1)在编译前的阶段,有大量工作需要手工整理及包装,无法自动识别函数签名,当程序的代码量较大且函数的数量较多时,人工录入和整理的工作量非常巨大,难以保证大规模操作时的准确性;(2)函数签名的解析过程繁琐、低效,在运行函数之前会由调用器对函数签名进行解析并且按照顺序传入参数,即程序每发生一次函数调用就会产生一次解析和传参的过程,在运行如游戏这一类对性能要求比较高的大规模程序时,性能下降相当明显,造成程序运行速度慢、卡顿等极其影响用户体验的现象频出;(3)在构建调用堆栈时,还会产生一些额外的开销,对存储器比较紧缺的嵌入式设备而言,很容易出现因内存开销不足而导致程序崩溃等致命问题。
[0004]因此,需要一种新的函数调用方法来优化上述处理过程。

技术实现思路

[0005]为此,本专利技术提供一种函数调用方案,以力图解决或者至少缓解上面存在的问题。
[0006]根据本专利技术的一个方面,提供一种函数调用方法,包括如下步骤:首先,对待运行程序中各待调用函数进行识别,以生成函数签名序号表;修改各待调用函数的调用指令;基于函数签名序号表,生成静态函数文件并进行编译;运行待运行程序,若运行期间发生函数调用,则根据函数签名序号表,按照修改后的调用指令调用对应函数。
[0007]可选地,在根据本专利技术的函数调用方法中,对待运行程序中各待调用函数进行识别,以生成函数签名序号表的步骤,包括:扫描待运行程序中各待调用函数,识别各待调用函数的函数签名;对识别出的函数签名进行去重整理,以生成函数签名序号表。
[0008]可选地,在根据本专利技术的函数调用方法中,函数签名序号表包括多个函数签名序号,每个函数签名序号关联有一个不同的函数签名,函数签名包括函数调用约定、调用入参数量、参数类型以及返回值信息。
[0009]可选地,在根据本专利技术的函数调用方法中,修改各待调用函数的调用指令的步骤,包括:将各待调用函数的调用指令在中间表示层修改为函数包装器的调用指令,并附加用于索引函数签名的参数。
[0010]可选地,在根据本专利技术的函数调用方法中,基于函数签名序号表,生成静态函数文件并进行编译的步骤,包括:基于函数签名序号表中与各函数签名序号对应的函数签名,生
成对应的静态函数处理过程;构建静态函数表及运行依赖环境,结合静态函数处理过程,生成静态函数文件,并编译静态函数文件。
[0011]可选地,在根据本专利技术的函数调用方法中,在基于函数签名序号表,生成静态函数文件并进行编译的步骤之后,还包括:若静态函数文件以静态库方式使用,则对静态函数文件进行链接处理。
[0012]可选地,在根据本专利技术的函数调用方法中,根据函数签名序号表,按照修改后的调用指令调用对应函数的步骤,包括:通过函数签名序号表,获取被调用函数的函数签名;根据当前架构和平台类型,基于被调用函数的函数签名进行参数信息收集并重组;利用重组后的参数信息,按照修改后的调用指令对被调用函数进行调用。
[0013]可选地,在根据本专利技术的函数调用方法中,通过函数签名序号表,获取被调用函数的函数签名的步骤,包括:从函数签名序号表中,查找被调用函数的函数签名序号;通过被调用函数的函数签名序号,获取被调用函数的函数签名。
[0014]可选地,在根据本专利技术的函数调用方法中,利用重组后的参数信息,按照修改后的调用指令对被调用函数进行调用的步骤,包括:若被调用函数为静态函数,则将重组后的参数信息作为参数传递,按照修改后的调用指令对被调用函数进行调用。
[0015]可选地,在根据本专利技术的函数调用方法中,利用重组后的参数信息,按照修改后的调用指令对被调用函数进行调用的步骤,包括:若被调用函数为动态函数,则确定被调用函数的函数签名中是否存在格式化字符串;在确定存在格式化字符串时,对格式化字符串进行解析以获取参数信息,根据获取到的参数信息动态生成与当前架构和平台对应的机器码,按照修改后的调用指令对机器码进行调用。
[0016]根据本专利技术的又一个方面,提供了一种计算设备,包括:至少一个处理器;以及存储器,存储有程序指令,其中,程序指令被配置为适于由至少一个处理器执行,程序指令包括用于执行如上所述的函数调用方法的指令。
[0017]根据本专利技术的又一个方面,提供了一种存储有程序指令的可读存储介质,当程序指令被计算设备读取并执行时,使得计算设备执行如上所述的函数调用方法。
[0018]根据本专利技术的函数调用方案,在编译期间,对待运行程序中各待调用函数进行识别,以生成函数签名序号表,修改各待调用函数的调用指令,基于函数签名序号表,生成静态函数文件并进行编译,通过自动构建函数签名避免人工参与大规模的手工整理和包装,节省人力的同时降低了出错率,编译过程更加简便和智能。在运行期间,若发生函数调用,则根据函数签名序号表,按照修改后的调用指令调用对应函数,根据当前平台和架构的不同,调用方法分别实现,通过静态函数调用避免在运行时有大量的函数签名解析和调用构建时产生额外的内存开销,使得运行效率更高、程序更流畅。
[0019]此外,调用处理中为静态函数和动态函数提供了不同的调用方案,可以有效地提高对不同参数处理的效率,且以上方案具有高可扩展性,不局限于主流架构,能够通过增加架构相关代码来任意扩展,灵活性较高。
附图说明
[0020]为了实现上述以及相关目的,本文结合下面的描述和附图来描述某些说明性方面,这些方面指示了可以实践本文所公开的原理的各种方式,并且所有方面及其等效方面
旨在落入所要求保护的主题的范围内。通过结合附图阅读下面的详细描述,本公开的上述以及其它目的、特征和优势将变得更加明显。遍及本公开,相同的附图标记通常指代相同的部件或元素。
[0021]图1示出了根据本专利技术一个实施例的计算设备100的结构框图;
[0022]图2示出了根据本专利技术一个实施例的实现函数调用的架构示意图;以及
[0023]图3示出了根据本专利技术一个实施例的函数调用方法300的流程图。
具体实施方式
[0024]下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种函数调用方法,包括:对待运行程序中各待调用函数进行识别,以生成函数签名序号表;修改所述各待调用函数的调用指令;基于所述函数签名序号表,生成静态函数文件并进行编译;运行所述待运行程序,若运行期间发生函数调用,则根据所述函数签名序号表,按照修改后的调用指令调用对应函数。2.如权利要求1所述的方法,其中,所述对待运行程序中各待调用函数进行识别,以生成函数签名序号表的步骤,包括:扫描待运行程序中各待调用函数,识别所述各待调用函数的函数签名;对识别出的函数签名进行去重整理,以生成函数签名序号表。3.如权利要求1或2所述的方法,其中,所述函数签名序号表包括多个函数签名序号,每个函数签名序号关联有一个不同的函数签名,所述函数签名包括函数调用约定、调用入参数量、参数类型以及返回值信息。4.如权利要求1

3中任一项所述的方法,其中,所述修改所述各待调用函数的调用指令的步骤,包括:将所述各待调用函数的调用指令在中间表示层修改为函数包装器的调用指令,并附加用于索引函数签名的参数。5.如权利要求3所述的方法,其中,所述基于所述函数签名序号表,生成静态函数文件并进行编译的步骤,包括:基于所述函数签名序号表中与各函数签名序号对应的函数签名,生成对应的静态函数处理过程;构建静态函数表及运行依赖环境,结合所述静态函数处理过程,生成静态函数文件,并编译所述静态函数文件。6.如权利要求1

5中任一项所述的方法,在所述基于所述函数签名序号表,生成静态函数文件并进行编译的步骤之后,还包括:若所述静态函数文件以静态库方式使用,则对所述静态函数文件进行链接处理。7.如权利要求1

6中任一项所述的方法,其中,所述根据所述函数签名序号表,按照修...

【专利技术属性】
技术研发人员:杨扬杨堃姚永杰
申请(专利权)人:统信软件技术有限公司
类型:发明
国别省市:

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

1