技术新讯 > 计算推算,计数设备的制造及其应用技术 > 一种软件项目的函数级增量编译方法及系统  >  正文

一种软件项目的函数级增量编译方法及系统

  • 国知局
  • 2025-01-10 13:16:37

本发明涉及软件,具体涉及一种软件项目的函数级增量编译方法及系统。

背景技术:

1、在c/c++项目的开发周期中,开发人员需要反复修改和编译项目的源文件。即使仅有一小部分代码被更改,现有的c/c++编译器仍然需要花费大量时间来重新编译整个源文件,从而导致大量的冗余编译。解决冗余编译问题的关键在于重用之前生成的编译结果。然而,现有的方法只能在文件级别重用之前的编译结果,导致重新编译的时间成本较高。

2、图1展示了现有c/c++编译器在面对细微代码更改时的工作方式。源文件包含1000个函数,而更改仅修改了其中的一个函数,即在第9行添加print语句。不幸的是,现有的编译器需要重新编译这个文件中的所有函数,导致99.9%(999/1,000)的函数被冗余编译。当冗余编译传播到其他源文件时,这种低效率会进一步恶化,从而降低整体性能。在给定的示例中,每个函数实例化一个具有不同类型的模板类vector。这样的实例化大大增加了重新编译的代码大小,从而导致高时间成本。

3、解决上述提到的冗余编译问题是一项非常困难的任务。现有的方法都不能有效地处理图1所示场景中的增量编译场景,主要原因是它们仅限于在文件级别复用先前的编译结果。其中一类方法侧重于对语义保持不变的源文件复用旧的二进制文件。这包括ccache(ccache.ccache.https://ccache.dev/,2024.[online;accessed july-2024].)、chash(christian dietrich,valentin rothberg,ludwig füracker,andreas ziegler,anddaniel lohmann.chash:detection of redundant compilations via ast hashing.in2017usenix annual technical conference,pages527–538,2017.https://www.usenix.org/conference/atc17/technical-essions/presentation/dietrich.)和abc(ying zhang,yanyan jiang,chang xu,xiaoxing ma,and ping y u.abc:acceleratedbuilding of c/c++projects.in 2015asia-pacific softwareengineering conference(apsec),pages182–189,2015.https://doi.org/10.1109/apsec.2015.27.)等技术,它们在仅在确定源文件语义等价性的方法上有所不同。这些方法的范围从比较md5哈希到比较抽象语法树(ast)哈希,再到分析修改后的代码是否被源文件实际使用。然而,源文件中的语义更改(如图1所示)使得这些方法在复用最后的编译结果时无效。另一类方法包括将头文件(llvm.precompiled header.https://clang.llvm.org/docs/pchinternals.html,2024.[online;accessed july-2024].)或模块(cpp reference.modules.https://en.cppreference.com/w/cpp/language/modules,2024.[online;accessed july-2024].)预编译为asts,以便在后续编译中复用。虽然这种方法可以减轻头文件(如图1所示示例中的iostream和vector)的冗余编译,但它仍然需要重新编译源文件。此外,头文件或模块中的微小代码更改也可能会破坏这类方法的有效性。

技术实现思路

1、本发明的目的在于针对现有技术中的缺陷和不足,提出一种软件项目的函数级增量编译方法及系统,能够在函数级别重用之前的编译结果,仅需要重新编译语义发生变化的函数,缓解冗余编译问题。

2、本发明的技术方案如下。

3、一方面,一种软件项目的函数级增量编译方法,包括:

4、符号变更分析步骤,识别出具有文本变化的函数,并通过词法分析提取变更代码中使用的符号;

5、编译依赖传播步骤,基于变更函数和变更代码中使用的符号,在旧源代码的编译依赖图cdg上执行编译依赖传播,以识别语义上发生变化的函数;

6、选择性编译步骤,删减语义上未发生变化的函数的主体,仅生成部分源代码,然后编译以生成部分二进制文件;

7、二进制依赖传播步骤,从旧的二进制文件中提取符号之间的依赖关系以生成二进制依赖图bdg,来识别需要复用的派生二进制代码;接着,对于主体被删减的函数,在二进制依赖图bdg上执行二进制依赖传播,以确定需要复用的符号和部分数据段;

8、二进制复用步骤,将旧的二进制文件中需要复用的符号和部分数据段合并到部分二进制文件中,组成完整的二进制文件。

9、优选的,所述符号变更分析步骤,具体包括:

10、对源代码进行预处理,并识别新旧预处理代码之间的文本差异;如果函数体的文本发生变化,则判断该函数的语义已经改变;

11、进行词法分析以提取文本变化代码中的标识符,并假设与这些标识符同名的符号将被变更代码使用。

12、优选的,所述编译依赖图cdg包括节点和边;其中,节点代表源代码中的符号;边用来描述符号之间的依赖关系,包括已解析的符号依赖、未解析的符号依赖和隐式符号依赖。

13、优选的,所述编译依赖传播,具体包括:

14、从文本变化的函数和变更代码使用的符号开始,递归遍历cdg上的已解析符号依赖、未解析符号依赖和隐式符号依赖;

15、传播结束后,如果函数满足以下两个条件之一,则认为该函数的语义未变;所述两个条件包括:

16、在传播过程中没有访问过该函数;

17、传播过程中访问了该函数,但该函数的文本未发生变化,且该函数不是模板函数,并且该函数的二进制代码存在于先前的二进制文件中。

18、优选的,所述选择性编译步骤,还包括:在编译过程中,利用语义分析消除词法消除错误的依赖关系。

19、优选的,所述二进制依赖图bdg报节点和边;其中,节点代表二进制符号和节;边用于描述二进制符号和段之间的依赖关系,包括符号重定位依赖和二进制节依赖。

20、优选的,所述二进制依赖传播步骤采用广度优先搜索;从语义未变的函数开始,在bdg上递归遍历符号重定位依赖和节依赖;遍历到的符号或节如果在精简的二进制代码中不存在,将会被复用。

21、优选的,所述二进制复用步骤中,二进制复用包括实名符号复用和匿名符号复用;

22、所述实名符号的符号名称作为唯一标识符,使得能够在旧二进制文件的和部分二进制文件之间匹配命名符号;此外,从命名符号派生的节也有唯一标识符;如果在部分二进制文件中不存在需要复用的命名符号或节,则创建这些符号和节,更新符号表和节头表,并将符号名称添加到字符串表中;如果这些符号和节已经存在于部分二进制文件中,则调整相应的符号和节索引以指向现有的符号和节;

23、对于只读数据,编译器会生成一个随机命名的只读数据节以及一个匿名符号;在二进制中,匿名符号通过节偏移量或使用随机符号名称来识别;对于需要复用的匿名符号,在部分二进制文件中直接创建一个新的匿名符号和一个新的只读数据节,匿名符号存储的二进制数据将在需要时被复用到新的只读数据节中。

24、另一方面,一种软件项目的函数级增量编译系统,包括:

25、符号变更分析模块,用于识别出具有文本变化的函数,并通过词法分析提取变更代码中使用的符号;

26、编译依赖传播模块,用于基于变更函数和变更代码中使用的符号,在旧源代码的编译依赖图cdg上执行编译依赖传播,以识别语义上发生变化的函数;

27、选择性编译模块,用于删减语义上未发生变化的函数的主体,仅生成部分源代码,然后编译以生成部分二进制文件;

28、二进制依赖传播模块,用于从旧的二进制文件中提取符号之间的依赖关系以生成二进制依赖图bdg,来识别需要复用的派生符号和部分数据段;接着,对于主体被删减的函数,在二进制依赖图bdg上执行二进制依赖传播,以确定需要复用的符号和部分数据段;

29、二进制复用模块,用于将旧的二进制文件中需要复用的符号和部分数据段合并到部分二进制文件中,组成新的且完整的二进制文件。

30、相比于现有技术,本发明具有以下有益效果:

31、(1)本发明能够在函数级别重用之前的编译结果,仅需要重新编译语义发生变化的函数,能够缓解冗余编译问题;

32、(2)本发明在源代码和二进制代码级别引入了编译依赖图(cdg)和二进制依赖图(bdg)两种符号依赖表示,cdg和bdg有助于更好地识别语义变化的函数,并顺利复用语义保持不变的函数相关的二进制代码,确保函数级增量编译的正确性;其中,依赖图(cdg)在源代码级别捕获符号之间的依赖关系,通过利用cdg,可以很好地识别函数,其主体保持不变,但其语义发生了变化;二进制依赖图(bdg)在二进制代码级别捕获符号依赖关系,使用bdg,可以从旧的二进制文件中提取语义未改变的函数和其他依赖符号(例如,派生的只读数据,模板实例化等)的二进制代码。

本文地址:https://www.jishuxx.com/zhuanli/20250110/352088.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 YYfuon@163.com 举报,一经查实,本站将立刻删除。