CN115617347A - 一种代码处理方法、装置、设备及存储介质 - Google Patents
一种代码处理方法、装置、设备及存储介质 Download PDFInfo
- Publication number
- CN115617347A CN115617347A CN202211345783.8A CN202211345783A CN115617347A CN 115617347 A CN115617347 A CN 115617347A CN 202211345783 A CN202211345783 A CN 202211345783A CN 115617347 A CN115617347 A CN 115617347A
- Authority
- CN
- China
- Prior art keywords
- code
- function
- equivalent
- function code
- determining
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/43—Checking; Contextual analysis
- G06F8/436—Semantic checking
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computational Linguistics (AREA)
- Stored Programmes (AREA)
Abstract
本公开提供了一种代码处理方法、装置、设备及存储介质,可以获取待度量的第一源代码,对其进行语法分析生成第一抽象语法树,进而针对第一抽象语法树进行语义分析和编译生成第一中间代码,统计第一中间代码中所有函数的第一代码行数总量作为第一源代码的代码当量。本公开实施例能够针对待度量的源代码,生成其对应的中间代码,通过中间代码中所有函数的代码行数总量来得到代码当量,与抽象语法树相比,中间代码更加靠近编译最终得到的执行代码,从而本公开实施例可以减少语法语义方面的干扰,提高确定出的代码当量的准确度,提升确定出的代码当量与代码本身实现内容的相关度,同时可以兼顾代码度量的需要和中间代码的有效利用。
Description
技术领域
本公开涉及计算机技术领域,具体而言,涉及一种代码处理方法、装置、设备及存储介质。
背景技术
随着科技的进步和发展,对软件研发的要求也随之提高。在项目开发过程中,大多是多人协力,每个人各自负责一部分的编码任务,然后将每个人编写的内容汇总到一起。为了准确获知项目每个阶段的迭代情况,需要经常统计项目的开发进度,从而可以确定当前项目进程是否符合预期。
在项目开发过程中,为了评估项目的开发进度,需要对当前项目工程总量以及每次修改的代码量进行度量,由于不同人在不同阶段编写的代码不同,在衡量代码当量时的准确率低,速度慢,缺乏统一的转换衡量标准,影响对项目进程判断的准确度。
发明内容
本公开实施例至少提供一种代码处理方法、装置、设备及存储介质。
本公开实施例提供了一种代码处理方法,所述方法包括:
获取待度量的第一源代码;
对所述第一源代码进行语法分析生成第一抽象语法树,并针对所述第一抽象语法树进行语义分析和编译生成第一中间代码;
统计所述第一中间代码中所有函数的第一代码行数总量,将所述第一代码行数总量作为所述第一源代码的代码当量。
一种可选的实施方式中,所述统计所述第一中间代码中所有函数的第一代码行数总量,将所述第一代码行数总量作为所述第一源代码的代码当量,包括:
按照所述第一中间代码的执行逻辑,识别得到所述第一中间代码包括的多段第一函数代码;
确定每段第一函数代码的代码行数;
基于每段第一函数代码的代码行数,确定所述第一源代码的代码当量。
一种可选的实施方式中,所述方法还包括:
针对预设的多个第一代码关键词,确定每段所述第一函数代码对应的第一权重值,所述第一权重值表征所述第一函数代码中所述第一代码关键词对应的代码语法出现的频次;
确定每段第一函数代码能够被调用的第一次数;
所述基于每段第一函数代码的代码行数,确定所述第一源代码的代码当量,包括:
针对每段第一函数代码,计算所述第一函数代码的代码行数、对应的第一权重值、以及所述第一次数的乘积,得到所述第一函数代码的第一代码当量;
将多段所述第一函数代码中每段所述第一函数代码的第一代码当量之和,确定为所述第一源代码的代码当量。
一种可选的实施方式中,所述方法还包括:
在所述第一源代码被调整的情况下,获取调整后得到的第二源代码;
对所述第二源代码进行语法分析生成第二抽象语法树,并针对所述第二抽象语法树进行语义分析和编译生成第二中间代码;
获取所述第一源代码对应的所述第一中间代码;
基于所述第一中间代码和所述第二中间代码,确定此次代码调整的增量代码当量。
一种可选的实施方式中,所述基于所述第一中间代码和所述第二中间代码,确定此次代码调整的增量代码当量,包括:
按照所述第二中间代码的执行逻辑,识别得到所述第二中间代码包括的多段第二函数代码;
获取对所述第一中间代码识别得到的多段第三函数代码;
基于所述多段第三函数代码和所述多段第二函数代码,确定此次代码调整的增量代码当量。
一种可选的实施方式中,所述基于所述多段第三函数代码和所述多段第二函数代码,确定此次代码调整的增量代码当量,包括:
针对每段第三函数代码,从所述第三函数代码中提取出所述第三函数代码在各个预设维度下的第一函数信息;
针对每段第二函数代码,从所述第二函数代码中提取出所述第二函数代码在各个预设维度下的第二函数信息;
基于每段第三函数代码的各个第一函数信息和每段第二函数代码的各个第二函数信息,对每段所述第三函数代码和每段所述第二函数代码进行匹配,得到信息匹配结果,所述信息匹配结果包括所述第三函数代码与所述第二函数代码一致,以及所述第三函数代码与所述第二函数代码不一致;
根据信息匹配结果,确定此次代码调整的增量代码当量。
一种可选的实施方式中,所述基于每段第三函数代码的各个第一函数信息和每段第二函数代码的各个第二函数信息,对每段所述第三函数代码和每段所述第二函数代码进行匹配,得到信息匹配结果,包括:
针对每段所述第二函数代码,检测所述多段第三函数代码中是否存在第一目标函数代码,所述第一目标函数代码与所述第二函数代码在预设数量个所述预设维度下的函数信息一致;
若存在,确定所述第二函数代码与所述第一目标函数代码对应的第三函数代码的信息匹配结果为一致,反之则确定所述第二函数代码与多段所述第三函数代码的信息匹配结果为不一致;
针对每段所述第三函数代码,检测所述多段第二函数代码中是否存在第二目标函数代码,所述第二目标函数代码与所述第三函数代码在预设数量个所述预设维度下的函数信息一致;
若存在,确定所述第三函数代码与所述第二目标函数代码对应的第二函数代码的信息匹配结果为一致,反之则确定所述第三函数代码与多段所述第二函数代码的信息匹配结果为不一致。
一种可选的实施方式中,所述根据信息匹配结果,确定此次代码调整的增量代码当量,包括:
针对信息匹配结果为一致的第三函数代码和对应的第二函数代码,确定该第二函数代码相较于该第三函数代码调整的第一代码行数,所述调整包括增加、删除和修改中的一者或者多者;
将信息匹配结果为不一致的所述第二函数代码确定为相较于所述第一中间代码的新增函数代码,并确定所述新增函数代码的第二代码行数;
将信息匹配结果为不一致的所述第三函数代码确定为针对于所述第一中间代码的删除函数代码,并确定所述删除函数代码的第三代码行数;
统计各个所述第一代码行数、各个所述第二代码行数和各个所述第三代码行数的第二代码行数总量,将所述第二代码行数总量作为此次代码调整的增量代码当量。
一种可选的实施方式中,所述方法还包括:
针对预设的多个第二代码关键词,分别确定每段所述第二函数代码对应的第二权重值和每段所述第三函数代码对应的第三权重值,所述第二权重值表征所述第二函数代码中所述第二代码关键词对应的代码语法出现的频次,所述第三权重值表征所述第三函数代码中所述第二代码关键词对应的代码语法出现的频次;
确定每段第二函数代码能够被调用的第二次数;
确定每段第三函数代码能够被调用的第三次数;
所述统计各个所述第一代码行数、各个所述第二代码行数和各个所述第三代码行数的第二代码行数总量,将所述第二代码行数总量作为此次代码调整的增量代码当量,包括:
针对每个信息匹配结果为一致的第二函数代码,计算所述第二函数代码的第一代码行数、所述第二函数代码的第二权重值、以及所述第二函数代码对应的第二次数的乘积,得到所述第二函数代码的第二代码当量;
针对每个新增函数代码,计算所述新增函数代码的第二代码行数、所述新增函数代码的第二权重值、以及所述新增函数代码对应的第二次数的乘积,得到所述新增函数代码的第三代码当量;
针对每个删除函数代码,计算所述第三代码行数、所述第三权重值、以及所述第三次数的乘积,得到所述删除函数代码的第四代码当量;
统计各个所述第二代码当量、各个所述第三代码当量和各个所述第四代码当量的第二代码行数总量,将所述第二代码行数总量作为此次代码调整的增量代码当量。
本公开实施例还提供一种代码处理装置,所述装置包括:
代码获取模块,用于获取待度量的第一源代码;
代码编译模块,用于对所述第一源代码进行语法分析生成第一抽象语法树,并针对所述第一抽象语法树进行语义分析和编译生成第一中间代码;
第一当量确定模块,用于统计所述第一中间代码中所有函数的第一代码行数总量,将所述第一代码行数总量作为所述第一源代码的代码当量。
一种可选的实施方式中,所述第一当量确定模块具体用于:
按照所述第一中间代码的执行逻辑,识别得到所述第一中间代码包括的多段第一函数代码;
确定每段第一函数代码的代码行数;
基于每段第一函数代码的代码行数,确定所述第一源代码的代码当量。
一种可选的实施方式中,所述装置还包括信息确定模块,所述信息确定模块用于:
针对预设的多个第一代码关键词,确定每段所述第一函数代码对应的第一权重值,所述第一权重值表征所述第一函数代码中所述第一代码关键词对应的代码语法出现的频次;
确定每段第一函数代码能够被调用的第一次数;
所述第一当量确定模块在用于基于每段第一函数代码的代码行数,确定所述第一源代码的代码当量时,具体用于:
针对每段第一函数代码,计算所述第一函数代码的代码行数、对应的第一权重值、以及所述第一次数的乘积,得到所述第一函数代码的第一代码当量;
将多段所述第一函数代码中每段所述第一函数代码的第一代码当量之和,确定为所述第一源代码的代码当量。
一种可选的实施方式中,所述装置还包括第二当量确定模块,所述第二当量确定模块用于:
在所述第一源代码被调整的情况下,获取调整后得到的第二源代码;
对所述第二源代码进行语法分析生成第二抽象语法树,并针对所述第二抽象语法树进行语义分析和编译生成第二中间代码;
获取所述第一源代码对应的所述第一中间代码;
基于所述第一中间代码和所述第二中间代码,确定此次代码调整的增量代码当量。
一种可选的实施方式中,所述第二当量模块在用于基于所述第一中间代码和所述第二中间代码,确定此次代码调整的增量代码当量时,具体用于:
按照所述第二中间代码的执行逻辑,识别得到所述第二中间代码包括的多段第二函数代码;
获取对所述第一中间代码识别得到的多段第三函数代码;
基于所述多段第三函数代码和所述多段第二函数代码,确定此次代码调整的增量代码当量。
一种可选的实施方式中,所述第二当量模块在用于基于所述多段第三函数代码和所述多段第二函数代码,确定此次代码调整的增量代码当量时,具体用于:
针对每段第三函数代码,从所述第三函数代码中提取出所述第三函数代码在各个预设维度下的第一函数信息;
针对每段第二函数代码,从所述第二函数代码中提取出所述第二函数代码在各个预设维度下的第二函数信息;
基于每段第三函数代码的各个第一函数信息和每段第二函数代码的各个第二函数信息,对每段所述第三函数代码和每段所述第二函数代码进行匹配,得到信息匹配结果,所述信息匹配结果包括所述第三函数代码与所述第二函数代码一致,以及所述第三函数代码与所述第二函数代码不一致;
根据信息匹配结果,确定此次代码调整的增量代码当量。
一种可选的实施方式中,所述第二当量模块在用于基于每段第三函数代码的各个第一函数信息和每段第二函数代码的各个第二函数信息,对每段所述第三函数代码和每段所述第二函数代码进行匹配,得到信息匹配结果时,具体用于:
针对每段所述第二函数代码,检测所述多段第三函数代码中是否存在第一目标函数代码,所述第一目标函数代码与所述第二函数代码在预设数量个所述预设维度下的函数信息一致;
若存在,确定所述第二函数代码与所述第一目标函数代码对应的第三函数代码的信息匹配结果为一致,反之则确定所述第二函数代码与多段所述第三函数代码的信息匹配结果为不一致;
针对每段所述第三函数代码,检测所述多段第二函数代码中是否存在第二目标函数代码,所述第二目标函数代码与所述第三函数代码在预设数量个所述预设维度下的函数信息一致;
若存在,确定所述第三函数代码与所述第二目标函数代码对应的第二函数代码的信息匹配结果为一致,反之则确定所述第三函数代码与多段所述第二函数代码的信息匹配结果为不一致。
一种可选的实施方式中,所述第二当量模块在用于根据信息匹配结果,确定此次代码调整的增量代码当量时,具体用于:
针对信息匹配结果为一致的第三函数代码和对应的第二函数代码,确定该第二函数代码相较于该第三函数代码调整的第一代码行数,所述调整包括增加、删除和修改中的一者或者多者;
将信息匹配结果为不一致的所述第二函数代码确定为相较于所述第一中间代码的新增函数代码,并确定所述新增函数代码的第二代码行数;
将信息匹配结果为不一致的所述第三函数代码确定为针对于所述第一中间代码的删除函数代码,并确定所述删除函数代码的第三代码行数;
统计各个所述第一代码行数、各个所述第二代码行数和各个所述第三代码行数的第二代码行数总量,将所述第二代码行数总量作为此次代码调整的增量代码当量。
一种可选的实施方式中,所述信息确定模块具体用于:
针对预设的多个第二代码关键词,分别确定每段所述第二函数代码对应的第二权重值和每段所述第三函数代码对应的第三权重值,所述第二权重值表征所述第二函数代码中所述第二代码关键词对应的代码语法出现的频次,所述第三权重值表征所述第三函数代码中所述第二代码关键词对应的代码语法出现的频次;
确定每段第二函数代码能够被调用的第二次数;
确定每段第三函数代码能够被调用的第三次数;
所述第二当量确定模块在用于统计各个所述第一代码行数、各个所述第二代码行数和各个所述第三代码行数的第二代码行数总量,将所述第二代码行数总量作为此次代码调整的增量代码当量时,具体用于:
针对每个信息匹配结果为一致的第二函数代码,计算所述第二函数代码的第一代码行数、所述第二函数代码的第二权重值、以及所述第二函数代码对应的第二次数的乘积,得到所述第二函数代码的第二代码当量;
针对每个新增函数代码,计算所述新增函数代码的第二代码行数、所述新增函数代码的第二权重值、以及所述新增函数代码对应的第二次数的乘积,得到所述新增函数代码的第三代码当量;
针对每个删除函数代码,计算所述第三代码行数、所述第三权重值、以及所述第三次数的乘积,得到所述删除函数代码的第四代码当量;
统计各个所述第二代码当量、各个所述第三代码当量和各个所述第四代码当量的第二代码行数总量,将所述第二代码行数总量作为此次代码调整的增量代码当量。
本公开实施例还提供一种电子设备,包括:处理器、存储器和总线,所述存储器存储有所述处理器可执行的机器可读指令,当电子设备运行时,所述处理器与所述存储器之间通过总线通信,所述机器可读指令被所述处理器执行时执行上述代码处理方法的步骤。
本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述代码处理方法的步骤。
本公开实施例提供的代码处理方法,可以获取待度量的第一源代码,对其进行语法分析生成第一抽象语法树,进而针对第一抽象语法树进行语义分析和编译生成第一中间代码,统计第一中间代码中所有函数的第一代码行数总量作为第一源代码的代码当量。本公开实施例能够针对待度量的源代码,生成其对应的中间代码,通过中间代码中所有函数的代码行数总量来得到代码当量,与抽象语法树相比,中间代码更加靠近编译最终得到的执行代码,从而本公开实施例可以减少语法语义方面的干扰,提高确定出的代码当量的准确度,提升确定出的代码当量与代码本身实现内容的相关度,同时可以兼顾代码度量的需要和中间代码的有效利用。
进一步的,可以采用增量代码当量表示每次代码修改调整的工作量,从而可以基于增量代码当量衡量每次代码调整的工作量,方便通过同一代码标准来在不同批次的代码调整之间进行横向比对,有助于确定代码开发的工作效率,并及时对后续的代码开发工作进行改进。
为使本公开的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
附图说明
为了更清楚地说明本公开实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,此处的附图被并入说明书中并构成本说明书中的一部分,这些附图示出了符合本公开的实施例,并与说明书一起用于说明本公开的技术方案。应当理解,以下附图仅示出了本公开的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1示出了本公开实施例所提供的一种代码处理方法的流程图;
图2示出了本公开实施例所提供的确定代码当量的示意图;
图3示出了本公开实施例所提供的确定调用的次数的示意图;
图4示出了本公开实施例所提供的一种代码处理装置的示意图之一;
图5示出了本公开实施例所提供的一种代码处理装置的示意图之二;
图6示出了本公开实施例所提供的一种电子设备的结构示意图。
具体实施方式
为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
本文中术语“和/或”,仅仅是描述一种关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中术语“至少一种”表示多种中的任意一种或多种中的至少两种的任意组合,例如,包括A、B、C中的至少一种,可以表示包括从A、B和C构成的集合中选择的任意一个或多个元素。
经研究发现,在项目开发过程中,为了评估项目的开发进度,需要对当前项目工程总量以及每次修改的代码量进行度量,传统的方法是将源代码转换为抽象语法树,通过抽象语法树中各个节点之间的比对来确定代码当量,然而抽象语法树与编译最终得到的执行代码在表现形式上有很大区别,导致基于抽象语法树得到的代码当量与实际代码量存在偏差,进而影响对项目进程判断的准确度。
基于上述研究,本公开提供了一种代码处理方法,可以获取待度量的第一源代码,对其进行语法分析生成第一抽象语法树,进而针对第一抽象语法树进行语义分析和编译生成第一中间代码,统计第一中间代码中所有函数的第一代码行数总量作为第一源代码的代码当量。从而本公开实施例可以减少语法语义方面的干扰,提高确定出的代码当量的准确度。
为便于对本实施例进行理解,首先对本公开实施例所公开的一种代码处理方法进行详细介绍,本公开实施例所提供的代码处理方法的执行主体一般为具有一定计算能力的电子设备。本实施方式中,该电子设备可以为服务器。其中,服务器可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云存储、大数据和人工智能平台等基础云计算服务的云服务器。
其他实施方式中,该电子设备还可以为终端设备或者其他处理设备,该终端设备可以为移动设备、终端及计算设备等。其它处理设备可以是包括处理器和存储器的设备,在此不做限定。在一些可能的实现方式中,该代码处理方法可以通过处理器调用存储器中存储的计算机可读指令的方式来实现。
下面对本公开实施例提供的一种代码处理方法加以说明。
请参阅图1,图1为本公开实施例提供的一种代码处理方法的流程图。如图1中所示,本公开实施例提供的代码处理方法包括:
S101:获取待度量的第一源代码。
这里,在需要确定某工程的开发进度,以及衡量某文件的编写工作量等情况下,可以获取需要进行度量的第一源代码。
S102:对所述第一源代码进行语法分析生成第一抽象语法树,并针对所述第一抽象语法树进行语义分析和编译生成第一中间代码。
此步骤中,首先对第一源代码进行语法分析和词法分析,得到抽象语法树(Abstract Syntax Tree,AST),将该抽象语法树确定为所述第一源代码对应的第一抽象语法树,然后对所述第一抽象语法树进行语义分析和编译优化,得到中间代码,将该中间代码确定为所述第一源代码对应的第一中间代码。
这里,由于中间代码是经过语法分析、词法分析、语义分析及编译优化后的代码,与抽象语法树相比,中间代码更加靠近编译最终得到的执行代码,中间代码与抽象语法树相比,在表现形式上与执行代码更为贴合,通过中间代码来进行代码度量,可以减少由于个人编程习惯不同、编程中所使用的语法糖不同所导致的语法语义方面的干扰,并且可以提升确定出的代码当量与代码本身实现内容的相关度。
其中,中间代码表示在编译过程中经过了语义分析和编译优化后的代码,包括但不仅限于静态单赋值(Static Single Assignment,SSA)、逆波兰表示、三地址代码(ThreeAddress Code,TAC/3AC)等。
这里,可以使用SSA树的形式来表示所述第一中间代码,也可以使用控制流图(Control Flow Graph,CFG)的形式来表示所述第一中间代码,还可以使用其他形式表示所述第一中间代码,在此不做限定。
针对采用不同语言编写的源代码,例如c语言、java语言、go语言等,可以采用与其语言适配的方式,来对源代码进行编译。
示例性的,针对采用go语言编写的源代码,可以通过golang自带的工具包,例如“golang.org/x/tools/go/ssa”包,将源代码编译为中间代码。
S103:统计所述第一中间代码中所有函数的第一代码行数总量,将所述第一代码行数总量作为所述第一源代码的代码当量。
该步骤中,可以将所述第一中间代码包括的所有函数的第一代码行数总量,确定为所述第一源代码的代码当量。
在实际代码编写过程中,大多把经常使用的一段代码视作整体,并单独切分出来命名,这段单独命名的代码就称为函数,为了确定出代码当量,可以先确定出所述第一中间代码中包括的各个函数,这样,可以针对数据量大的中间代码而言,可以将其划分为多段数据量小的函数代码,有助于提高确定代码当量的效率。
具体地,可以按照所述第一中间代码的执行逻辑,识别得到所述第一中间代码包括的多段第一函数代码,并且确定每段第一函数代码的代码行数,进而基于每段第一函数代码的代码行数,确定所述第一源代码的代码当量。
这里,由于多段第一函数代码是从所述第一中间代码中识别得到的,因此每段所述第一函数代码的表现形式与所述第一中间代码的表现形式一致。
示例性的,所述第一中间代码是采用CFG的形式来表示,则所述第一函数代码同样采用CFG的形式来表示,每段所述第一函数代码可以对应采用一个CFG来呈现,CFG中包括多个数据块(block),每个数据块中写入有多行代码。
这里,可以同时参阅图2,图2为本公开实施例提供的确定代码当量的示意图。如图2中所示,对所述第一源代码编译得到第一中间代码,在编译过程中,可以识别出所述第一中间代码的代码入口,这里,所述代码入口表示所述第一中间代码的根节点,在所述根节点的基础上,可以按照所述第一中间代码的执行逻辑,识别得到所述第一中间代码包括的多段第一函数代码,进而确定每段第一函数代码的代码行数,基于每段第一函数代码的代码行数,确定所述第一源代码的代码当量。
示例性的,若识别得到所述第一中间代码包括3段第一函数代码,其中第一段第一函数代码的代码行数为10行,第二段第一函数代码的代码行数为15行,第三段第一函数代码的代码行数为20行,则所述第一源代码的代码当量为45。
为了降低个人编程习惯不同、编程中所使用的语法糖不同的影响,在确定所述代码当量时,可以在代码行数的基础上,引入每段函数代码能够被调用的次数,这样可以降低抽象函数的干扰,使得得到的所述代码当量更加贴合代码本身的实现内容和执行过程。
在代码编写的过程中,由于每条语句的性质不同、能够实现的功能不同,因此每条语句的复杂程度大多不同,可以理解,复杂度越高的代码其编写难度越高,但复杂度越高的代码其产生错误的可能性也越高,为了区分不同性质的语句,可以为函数代码中的每条语句分配不同的权重,有助于对代码当量进行更合理地评估,从而更合理地量化开发过程中的工作量。
相应地,在一种可能的实施方式中,可以针对预设的多个第一代码关键词,确定每段所述第一函数代码对应的第一权重值,这里,所述第一权重值表征所述第一函数代码中所述第一代码关键词对应的代码语法出现的频次,并且确定每段第一函数代码能够被调用的第一次数,进而针对每段第一函数代码,计算所述第一函数代码的代码行数、对应的第一权重值、以及所述第一次数的乘积,得到所述第一函数代码的第一代码当量,将多段所述第一函数代码中每段所述第一函数代码的第一代码当量之和,确定为所述第一源代码的代码当量。
这里,可以针对所述第一中间代码设置预设的多个第一代码关键词,这里,每个第一代码关键词对应一种代码语法,确定每个第一代码关键词分别在每段所述第一函数代码的每条语句中的出现频次,基于每个第一代码关键词分别在每段所述第一函数代码的每条语句中的出现频次,确定每段所述第一函数代码对应的第一权重值。
在实际应用中,第一代码关键词出现频次越多,说明其对应的代码语法较其他代码语法相比,被使用的较为频繁,相应的权重值越高。
可选地,还可以通过采用词频-逆向文件频率(Term Frequency-InverseDocument Frequency,TF-IDF)算法,基于每个第一代码关键词分别在每段所述第一函数代码的每条语句中的出现频次,得到每段所述第一函数代码对应的第一权重值。在此方式下,第一代码关键词出现频次越多,对应的权重值越低。
又可选地,还可以通过机器学习或者其他算法,来对每段第一函数代码赋予权重。
可选地,也可以预先为每段第一函数代码设置对应的第一权重值。
这里,每段第一函数代码能够被调用的第一次数包括该第一函数代码自己调用的次数以及被其他第一函数代码调用的次数。
示例性的,可以同时参阅图3,图3为本公开实施例提供的确定调用的次数的示意图。如图3中所示,针对某第一中间代码,其包括两个代码入口,分别为代码入口A和代码入口B,该第一中间代码包括四段第一函数代码,分别为函数A、函数B、函数C和函数D,可以看到,函数B分别被函数A和函数D调用,因此函数B对应的次数为2次,而函数A、函数C和函数D对应的次数都为1次。
在本实施方式中,针对每段第一函数代码,计算所述第一函数代码的代码行数、对应的第一权重值、以及所述第一次数的乘积,得到所述第一函数代码的第一代码当量,将多段所述第一函数代码中每段所述第一函数代码的第一代码当量之和,确定为所述第一源代码的代码当量。在其他实施方式中,也可以计算所述第一函数代码的代码行数以及对应的第一权重值的乘积,得到所述第一函数代码的第一代码当量,再将多段所述第一函数代码中每段所述第一函数代码的第一代码当量之和,确定为所述第一源代码的代码当量。
在另一些实施方式中,还可以计算所述第一函数代码的代码行数以及所述第一次数的乘积,得到所述第一函数代码的第一代码当量,进而将多段所述第一函数代码中每段所述第一函数代码的第一代码当量之和,确定为所述第一源代码的代码当量。
在代码开发过程中,会经常对代码进行修改调整,为此,在需要衡量代码调整对应的工作量的情况下,可以基于中间代码来确定代码调整的代码增量。
相应地,在一种可能的实施方式中,在所述第一源代码被调整的情况下,获取调整后得到的第二源代码,对所述第二源代码进行语法分析生成第二抽象语法树,并针对所述第二抽象语法树进行语义分析和编译生成第二中间代码,并且获取所述第一源代码对应的所述第一中间代码,进而基于所述第一中间代码和所述第二中间代码,确定此次代码调整的增量代码当量。
这里,第一源代码可以是代码数据库中存储的源代码,在检测到用户向所述代码数据库提交针对所述第一源代码的修改文件的情况下,可以确定所述第一源代码被调整,可以从所述代码数据库中获取到基于所述修改文件对所述第一源代码调整后得到的第二源代码。
可选地,还可以是在检测到用户在所述代码文件数据库中针对所述第一源代码施加代码修改操作的情况下,可以确定所述第一源代码被调整,可以从所述代码数据库中获取到对所述第一源代码施加代码修改操作后得到的第二源代码。
可以理解,针对此次代码调整,所述第一源代码为调整前的源代码,所述第二源代码为调整后的源代码。
在实际应用中,根据代码度量的需要不同,不但可以度量所述第一源代码的代码当量,也可以度量第二源代码的代码当量。
此步骤中,在确定所述第一源代码和所述第二源代码后,可以生成所述第二源代码对应的第二中间代码,这里生成所述第二中间代码的过程与上文生成所述第一中间代码的过程相同,在此不再赘述。
可选地,为了便于后续对所述第一中间代码和所述第二中间代码进行比对,可以采用同样的形式来表示所述第一中间代码和所述第二中间代码。
其中,所述增量代码当量用于表示所述第二源代码相较于所述第一源代码的修改代码量。
在实际代码编写过程中,大多把经常使用的一段代码视作整体,并单独切分出来命名,这段单独命名的代码就称为函数,为了确定出增量代码当量,可以分别确定出所述第一中间代码和所述第二中间代码中包括的函数代码,这样,可以针对数据量大的中间代码而言,可以将其划分为多段数据量小的函数代码,有助于方便比较所述第一中间代码和所述第二中间代码之间的修改情况。
具体地,在一种可能的实施方式中,可以按照所述第二中间代码的执行逻辑,识别得到所述第二中间代码包括的多段第二函数代码,并且获取对所述第一中间代码识别得到的多段第三函数代码,进而基于所述多段第三函数代码和所述多段第二函数代码,确定此次代码调整的增量代码当量。
其中,所述多段第三函数代码与上文所述多段第一函数代码为相同的函数代码,都是从所述第一中间代码中识别得到的。
这里,由于函数代码是从中间代码中识别得到的,因此函数代码的表现形式与对应的中间代码的表现形式一致。
示例性的,中间代码是采用CFG的形式来表示,则函数代码同样采用CFG的形式来表示,每段函数代码可以对应采用一个CFG来呈现,CFG中包括多个数据块(block),每个数据块中写入有多行代码。
在确定所述多段第三函数代码和所述多段第二函数代码后,为了提升所述增量代码当量的准确度,需要确定每段第三函数代码和每段第二函数代码是否是一致的函数代码,为了辅助判断函数代码的一致情况,可以提取代码函数的函数信息,通过函数信息之间的比对,来确定每段第三函数代码和每段第二函数代码是否是一致的函数代码。
相应地,在一种可能的实施方式中,所述基于所述多段第三函数代码和所述多段第二函数代码,确定此次代码调整的增量代码当量,包括:
针对每段第三函数代码,从所述第三函数代码中提取出所述第三函数代码在各个预设维度下的第一函数信息;
针对每段第二函数代码,从所述第二函数代码中提取出所述第二函数代码在各个预设维度下的第二函数信息;
基于每段第三函数代码的各个第一函数信息和每段第二函数代码的各个第二函数信息,对每段所述第三函数代码和每段所述第二函数代码进行匹配,得到信息匹配结果,所述信息匹配结果包括所述第三函数代码与所述第二函数代码一致,以及所述第三函数代码与所述第二函数代码不一致;
根据信息匹配结果,确定此次代码调整的增量代码当量。
上述步骤中,针对函数代码,可以预先设置多个所述预设维度,每个所述预设维度可以用于表示代码函数在某个方面的属性。例如,所述多个预设维度包括但不仅限于函数的变量名、函数的参数、函数的行、函数所在的包、函数能够实现的功能等。从而从每段所述第三函数代码中提取出其在各个预设维度下的第一函数信息,并且从每段所述第二函数代码中提取出其在各个预设维度下的第二函数信息,然后基于每段第三函数代码的各个第一函数信息和每段第二函数代码的各个第二函数信息,对每段所述第三函数代码和每段所述第二函数代码进行匹配,得到信息匹配结果。这里,所述信息匹配结果包括所述第三函数代码与所述第二函数代码一致,以及所述第三函数代码与所述第二函数代码不一致,在得到所述信息匹配结果后,可以根据所述信息匹配结果,确定此次代码调整的增量代码当量。
具体地,在一种可能的实施方式中,针对每段所述第二函数代码,检测所述多段第三函数代码中是否存在第一目标函数代码。这里,所述第一目标函数代码与所述第二函数代码在预设数量个所述预设维度下的函数信息一致。
其中,所述预设数量可以根据所述预设维度的数量而定。示例性的,在所述多个预设维度包括函数的变量名、函数的参数、函数的行、函数所在的包、函数能够实现的功能的情况下,此时预设维度的数量为5,因此可以将所述预设数量设置为大于等于3,可以理解,在所述多段第三函数代码中存在某一所述第三函数代码具有3个及以上的第一函数信息与所述第二函数代码的第二函数信息一致,将该第三函数代码确定为第一目标函数代码。
若存在,确定所述第二函数代码与所述第一目标函数代码对应的第三函数代码的信息匹配结果为一致,反之则确定所述第二函数代码与多段所述第三函数代码的信息匹配结果为不一致。
同样地,针对每段所述第三函数代码,检测所述多段第二函数代码中是否存在第二目标函数代码。这里,所述第二目标函数代码与所述第三函数代码在预设数量个所述预设维度下的函数信息一致。
若存在,确定所述第三函数代码与所述第二目标函数代码对应的第二函数代码的信息匹配结果为一致,反之则确定所述第三函数代码与多段所述第二函数代码的信息匹配结果为不一致。
针对不同的信息匹配结果,可以采用对应的方式来确定在该种信息匹配结果下的代码修改情况。
相应地,在一种可能的实施方式中,所述根据信息匹配结果,确定此次代码调整的增量代码当量,包括:
针对信息匹配结果为一致的第三函数代码和对应的第二函数代码,确定该第二函数代码相较于该第三函数代码调整的第一代码行数,所述调整包括增加、删除和修改中的一者或者多者;
将信息匹配结果为不一致的所述第二函数代码确定为相较于所述第一中间代码的新增函数代码,并确定所述新增函数代码的第二代码行数;
将信息匹配结果为不一致的所述第三函数代码确定为针对于所述第一中间代码的删除函数代码,并确定所述删除函数代码的第三代码行数;
统计各个所述第一代码行数、各个所述第二代码行数和各个所述第三代码行数的第二代码行数总量,将所述第二代码行数总量作为此次代码调整的增量代码当量。
上述步骤中,若所述第三函数代码和对应的第二函数代码的信息匹配结果为一致,可以认为这两个函数代码是相同或相似的函数代码,此时可以确定该第二函数代码相较于该第三函数代码调整的第一代码行数,这里,所述调整包括增加、删除和修改中的一者或者多者。若确定所述第二函数代码的信息匹配结果为不一致,可以认为多段第三函数代码中不存在与该第二函数代码相同或相似的代码,进而可以将该第二函数代码确定为相较于所述第一中间代码的新增函数代码,此时可以确定所述新增函数代码的第二代码行数。若确定所述第三函数代码的信息匹配结果为不一致,可以认为多段第二函数代码中不存在与该第三函数代码相同或相似的代码,进而可以将该第三函数代码确定为针对于所述第一中间代码的删除函数代码,此时可以确定所述删除函数代码的第三代码行数,将各个所述第一代码行数、各个所述第二代码行数和各个所述第三代码行数的第二代码行数总量,确定为此次代码调整的增量代码当量。
示例性的,若所述第一中间代码包括两段第三函数代码,分别是第三函数代码a和第三函数代码b,所述第二中间代码包括两段第二函数代码,分别是第二函数代码c和第二函数代码d,其中,第三函数代码a和第二函数代码c的信息匹配结果为一致,第三函数代码b分别与第二函数代码c和第二函数代码d的信息匹配结果都为不一致,第二函数代码d分别与第三函数代码a和第三函数代码b的信息匹配结果都为不一致,从而可以确定第二函数代码c相较于第三函数代码a调整的第一代码行数为10行,将第二函数代码d确定为相较于所述第一中间代码的新增函数代码,并确定第二函数代码d的第二代码行数为5行,将第三函数代码b确定为针对于所述第一中间代码的删除函数代码,并确定第三函数代码b的第三代码行数为3行,进而可以统计各个所述第一代码行数、各个所述第二代码行数和各个所述第三代码行数的第二代码行数总量为18,将所述第二代码行数总量作为此次代码调整的增量代码当量。
进一步的,可以采用增量代码当量表示每次修改调整的工作量,从而可以基于增量代码当量衡量每个代码开发者的工作量,方便通过同一代码标准来在不同代码开发者之间进行横向比对,有助于确定每个代码开发者的工作效率,并及时对后续的代码开发工作进行改进。
基于上述内容可知,针对此次代码调整,所述第一源代码为调整前的源代码,所述第二源代码为调整后的源代码,因此目前最新的源代码即为所述第二源代码,此时可以评估所述第二源代码的代码当量,从而可以确定所述第二源代码所对应的项目目前的工作总量。
基于上述内容可知,在确定代码当量时,可以引入每段所述第一函数代码对应的第一权重值以及每段第一函数代码能够被调用的第一次数,同样地,在确定所述增量代码当量时,也可以引入每段所述第二函数代码和每段所述第三函数代码分别对应的权重值以及能够被调用的次数。
因此,在一种可能的实施方式中,可以针对预设的多个第二代码关键词,分别确定每段所述第二函数代码对应的第二权重值和每段所述第三函数代码对应的第三权重值,这里,所述第二权重值表征所述第二函数代码中所述第二代码关键词对应的代码语法出现的频次,所述第三权重值表征所述第三函数代码中所述第二代码关键词对应的代码语法出现的频次,并且确定每段第二函数代码能够被调用的第二次数以及每段第三函数代码能够被调用的第三次数,进而针对每个信息匹配结果为一致的第二函数代码,计算所述第二函数代码的第一代码行数、所述第二函数代码的第二权重值、以及所述第二函数代码对应的第二次数的乘积,得到所述第二函数代码的第二代码当量,针对每个新增函数代码,计算所述新增函数代码的第二代码行数、所述新增函数代码的第二权重值、以及所述新增函数代码对应的第二次数的乘积,得到所述新增函数代码的第三代码当量,针对每个删除函数代码,计算所述第三代码行数、所述第三权重值、以及所述第三次数的乘积,得到所述删除函数代码的第四代码当量,统计各个所述第二代码当量、各个所述第三代码当量和各个所述第四代码当量的第二代码行数总量,将所述第二代码行数总量作为此次代码调整的增量代码当量。
这里,可以针对所述第一中间代码和所述第二中间代码设置预设的多个第二代码关键词,这里,每个第二代码关键词对应一种代码语法,确定每个第二代码关键词分别在每段所述第二函数代码的每条语句中的出现频次以及在每段所述第三函数代码的每条语句中的出现频次,基于每个第二代码关键词分别在每段所述第二函数代码的每条语句中的出现频次,确定每段所述第二函数代码对应的第二权重值,基于每个第二代码关键词分别在每段所述第三函数代码的每条语句中的出现频次,确定每段所述第三函数代码对应的第三权重值。
其中,所述第二代码关键词可以与所述第一代码关键词相同,也可以与所述第一代码关键词不同,在此不做任何限定。
在实际应用中,第二代码关键词出现频次越多,说明其对应的代码语法较其他代码语法相比,被使用的较为频繁,相应的权重值越高。
可选地,还可以通过采用词频-逆向文件频率(Term Frequency-InverseDocument Frequency,TF-IDF)算法,基于每个第二代码关键词分别在每段所述第二函数代码的每条语句中以及在每段所述第三函数代码的每条语句中的出现频次,得到每段所述第二函数代码对应的第二权重值和每段所述第三函数代码对应的第三权重值。在此方式下,第二代码关键词出现频次越多,对应的权重值越低。
又可选地,还可以通过机器学习或者其他算法,来分别对每段所述第二函数代码和每段所述第三函数代码赋予权重。
可选地,也可以预先为每段所述第二函数代码设置对应的第二权重值,并预先为每段所述第三函数代码设置对应的第三权重值。
这里,每段第二函数代码能够被调用的第二次数包括该第二函数代码自己调用的次数以及被其他第二函数代码调用的次数。同样地,每段第三函数代码能够被调用的第三次数包括该第三函数代码自己调用的次数以及被其他第三函数代码调用的次数。
在本实施方式中,针对每个信息匹配结果为一致的第二函数代码,计算所述第二函数代码的第一代码行数、所述第二函数代码的第二权重值、以及所述第二函数代码对应的第二次数的乘积,得到所述第二函数代码的第二代码当量,针对每个新增函数代码,计算所述新增函数代码的第二代码行数、所述新增函数代码的第二权重值、以及所述新增函数代码对应的第二次数的乘积,得到所述新增函数代码的第三代码当量,针对每个删除函数代码,计算所述第三代码行数、所述第三权重值、以及所述第三次数的乘积,得到所述删除函数代码的第四代码当量,统计各个所述第二代码当量、各个所述第三代码当量和各个所述第四代码当量的第二代码行数总量,将所述第二代码行数总量作为此次代码调整的增量代码当量。在其他实施方式中,也可以针对每个信息匹配结果为一致的第二函数代码,计算所述第二函数代码的第一代码行数以及所述第二函数代码的第二权重值的乘积,得到所述第二函数代码的第二代码当量,针对每个新增函数代码,计算所述新增函数代码的第二代码行数以及所述新增函数代码的第二权重值的乘积,得到所述新增函数代码的第三代码当量,针对每个删除函数代码,计算所述第三代码行数以及所述第三权重值的乘积,得到所述删除函数代码的第四代码当量,再统计各个所述第二代码当量、各个所述第三代码当量和各个所述第四代码当量的第二代码行数总量,将所述第二代码行数总量作为此次代码调整的增量代码当量。
在另一些实施方式中,还可以针对每个信息匹配结果为一致的第二函数代码,计算所述第二函数代码的第一代码行数以及所述第二函数代码对应的第二次数的乘积,得到所述第二函数代码的第二代码当量,针对每个新增函数代码,计算所述新增函数代码的第二代码行数以及所述新增函数代码对应的第二次数的乘积,得到所述新增函数代码的第三代码当量,针对每个删除函数代码,计算所述第三代码行数以及所述第三次数的乘积,得到所述删除函数代码的第四代码当量,进而统计各个所述第二代码当量、各个所述第三代码当量和各个所述第四代码当量的第二代码行数总量,将所述第二代码行数总量作为此次代码调整的增量代码当量。
本公开实施例提供的代码处理方法,可以获取待度量的第一源代码,对其进行语法分析生成第一抽象语法树,进而针对第一抽象语法树进行语义分析和编译生成第一中间代码,统计第一中间代码中所有函数的第一代码行数总量作为第一源代码的代码当量。本公开实施例能够针对待度量的源代码,生成其对应的中间代码,通过中间代码中所有函数的代码行数总量来得到代码当量,与抽象语法树相比,中间代码更加靠近编译最终得到的执行代码,从而本公开实施例可以减少语法语义方面的干扰,提高确定出的代码当量的准确度,提升确定出的代码当量与代码本身实现内容的相关度,同时可以兼顾代码度量的需要和中间代码的有效利用。
进一步的,可以采用增量代码当量表示每次代码修改调整的工作量,从而可以基于增量代码当量衡量每次代码调整的工作量,方便通过同一代码标准来在不同批次的代码调整之间进行横向比对,有助于确定代码开发的工作效率,并及时对后续的代码开发工作进行改进。可以采用代码当量表示代码工程当前的工作量,从而可以基于代码当量衡量软件开发的编码进度,方便通过同一代码标准来在不同代码文件以及代码数据库之间进行横向比对。
更进一步的,可以将增量代码当量和代码当量结合使用,进而可以辅助进行代码漏洞率、代码提交率的确定,有助于对不同类型、不同阶段的项目开发进行质量评估。
本领域技术人员可以理解,在具体实施方式的上述方法中,各步骤的撰写顺序并不意味着严格的执行顺序而对实施过程构成任何限定,各步骤的具体执行顺序应当以其功能和可能的内在逻辑确定。
基于同一发明构思,本公开实施例中还提供了与代码处理方法对应的代码处理装置,由于本公开实施例中的装置解决问题的原理与本公开实施例上述代码处理方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。
请参阅图4和图5,图4为本公开实施例提供的一种代码处理装置的示意图之一,图5为本公开实施例提供的一种代码处理装置的示意图之二。
如图4中所示,本公开实施例提供的代码处理装置400包括:
代码获取模块410,用于获取待度量的第一源代码;
代码编译模块420,用于对所述第一源代码进行语法分析生成第一抽象语法树,并针对所述第一抽象语法树进行语义分析和编译生成第一中间代码;
第一当量确定模块430,用于统计所述第一中间代码中所有函数的第一代码行数总量,将所述第一代码行数总量作为所述第一源代码的代码当量。
一种可选的实施方式中,所述第一当量确定模块430具体用于:
按照所述第一中间代码的执行逻辑,识别得到所述第一中间代码包括的多段第一函数代码;
确定每段第一函数代码的代码行数;
基于每段第一函数代码的代码行数,确定所述第一源代码的代码当量。
一种可选的实施方式中,如图5中所示,所述装置还包括信息确定模块440,所述信息确定模块440用于:
针对预设的多个第一代码关键词,确定每段所述第一函数代码对应的第一权重值,所述第一权重值表征所述第一函数代码中所述第一代码关键词对应的代码语法出现的频次;
确定每段第一函数代码能够被调用的第一次数;
所述第一当量确定模块430在用于基于每段第一函数代码的代码行数,确定所述第一源代码的代码当量时,具体用于:
针对每段第一函数代码,计算所述第一函数代码的代码行数、对应的第一权重值、以及所述第一次数的乘积,得到所述第一函数代码的第一代码当量;
将多段所述第一函数代码中每段所述第一函数代码的第一代码当量之和,确定为所述第一源代码的代码当量。
一种可选的实施方式中,如图5中所示,所述装置还包括第二当量确定模块450,所述第二当量确定模块450用于:
在所述第一源代码被调整的情况下,获取调整后得到的第二源代码;
对所述第二源代码进行语法分析生成第二抽象语法树,并针对所述第二抽象语法树进行语义分析和编译生成第二中间代码;
获取所述第一源代码对应的所述第一中间代码;
基于所述第一中间代码和所述第二中间代码,确定此次代码调整的增量代码当量。
一种可选的实施方式中,所述第二当量模块450在用于基于所述第一中间代码和所述第二中间代码,确定此次代码调整的增量代码当量时,具体用于:
按照所述第二中间代码的执行逻辑,识别得到所述第二中间代码包括的多段第二函数代码;
获取对所述第一中间代码识别得到的多段第三函数代码;
基于所述多段第三函数代码和所述多段第二函数代码,确定此次代码调整的增量代码当量。
一种可选的实施方式中,所述第二当量模块450在用于基于所述多段第三函数代码和所述多段第二函数代码,确定此次代码调整的增量代码当量时,具体用于:
针对每段第三函数代码,从所述第三函数代码中提取出所述第三函数代码在各个预设维度下的第一函数信息;
针对每段第二函数代码,从所述第二函数代码中提取出所述第二函数代码在各个预设维度下的第二函数信息;
基于每段第三函数代码的各个第一函数信息和每段第二函数代码的各个第二函数信息,对每段所述第三函数代码和每段所述第二函数代码进行匹配,得到信息匹配结果,所述信息匹配结果包括所述第三函数代码与所述第二函数代码一致,以及所述第三函数代码与所述第二函数代码不一致;
根据信息匹配结果,确定此次代码调整的增量代码当量。
一种可选的实施方式中,所述第二当量模块450在用于基于每段第三函数代码的各个第一函数信息和每段第二函数代码的各个第二函数信息,对每段所述第三函数代码和每段所述第二函数代码进行匹配,得到信息匹配结果时,具体用于:
针对每段所述第二函数代码,检测所述多段第三函数代码中是否存在第一目标函数代码,所述第一目标函数代码与所述第二函数代码在预设数量个所述预设维度下的函数信息一致;
若存在,确定所述第二函数代码与所述第一目标函数代码对应的第三函数代码的信息匹配结果为一致,反之则确定所述第二函数代码与多段所述第三函数代码的信息匹配结果为不一致;
针对每段所述第三函数代码,检测所述多段第二函数代码中是否存在第二目标函数代码,所述第二目标函数代码与所述第三函数代码在预设数量个所述预设维度下的函数信息一致;
若存在,确定所述第三函数代码与所述第二目标函数代码对应的第二函数代码的信息匹配结果为一致,反之则确定所述第三函数代码与多段所述第二函数代码的信息匹配结果为不一致。
一种可选的实施方式中,所述第二当量模块450在用于根据信息匹配结果,确定此次代码调整的增量代码当量时,具体用于:
针对信息匹配结果为一致的第三函数代码和对应的第二函数代码,确定该第二函数代码相较于该第三函数代码调整的第一代码行数,所述调整包括增加、删除和修改中的一者或者多者;
将信息匹配结果为不一致的所述第二函数代码确定为相较于所述第一中间代码的新增函数代码,并确定所述新增函数代码的第二代码行数;
将信息匹配结果为不一致的所述第三函数代码确定为针对于所述第一中间代码的删除函数代码,并确定所述删除函数代码的第三代码行数;
统计各个所述第一代码行数、各个所述第二代码行数和各个所述第三代码行数的第二代码行数总量,将所述第二代码行数总量作为此次代码调整的增量代码当量。
一种可选的实施方式中,所述信息确定模块440具体用于:
针对预设的多个第二代码关键词,分别确定每段所述第二函数代码对应的第二权重值和每段所述第三函数代码对应的第三权重值,所述第二权重值表征所述第二函数代码中所述第二代码关键词对应的代码语法出现的频次,所述第三权重值表征所述第三函数代码中所述第二代码关键词对应的代码语法出现的频次;
确定每段第二函数代码能够被调用的第二次数;
确定每段第三函数代码能够被调用的第三次数;
所述第二当量确定模块450在用于统计各个所述第一代码行数、各个所述第二代码行数和各个所述第三代码行数的第二代码行数总量,将所述第二代码行数总量作为此次代码调整的增量代码当量时,具体用于:
针对每个信息匹配结果为一致的第二函数代码,计算所述第二函数代码的第一代码行数、所述第二函数代码的第二权重值、以及所述第二函数代码对应的第二次数的乘积,得到所述第二函数代码的第二代码当量;
针对每个新增函数代码,计算所述新增函数代码的第二代码行数、所述新增函数代码的第二权重值、以及所述新增函数代码对应的第二次数的乘积,得到所述新增函数代码的第三代码当量;
针对每个删除函数代码,计算所述第三代码行数、所述第三权重值、以及所述第三次数的乘积,得到所述删除函数代码的第四代码当量;
统计各个所述第二代码当量、各个所述第三代码当量和各个所述第四代码当量的第二代码行数总量,将所述第二代码行数总量作为此次代码调整的增量代码当量。
本公开实施例提供的代码处理装置,可以获取待度量的第一源代码,对其进行语法分析生成第一抽象语法树,进而针对第一抽象语法树进行语义分析和编译生成第一中间代码,统计第一中间代码中所有函数的第一代码行数总量作为第一源代码的代码当量。本公开实施例能够针对待度量的源代码,生成其对应的中间代码,通过中间代码中所有函数的代码行数总量来得到代码当量,与抽象语法树相比,中间代码更加靠近编译最终得到的执行代码,从而本公开实施例可以减少语法语义方面的干扰,提高确定出的代码当量的准确度,提升确定出的代码当量与代码本身实现内容的相关度,同时可以兼顾代码度量的需要和中间代码的有效利用。
进一步的,可以采用增量代码当量表示每次代码修改调整的工作量,从而可以基于增量代码当量衡量每次代码调整的工作量,方便通过同一代码标准来在不同批次的代码调整之间进行横向比对,有助于确定代码开发的工作效率,并及时对后续的代码开发工作进行改进。可以采用代码当量表示代码工程当前的工作量,从而可以基于代码当量衡量软件开发的编码进度,方便通过同一代码标准来在不同代码文件以及代码数据库之间进行横向比对。
更进一步的,可以将增量代码当量和代码当量结合使用,进而可以辅助进行代码漏洞率、代码提交率的确定,有助于对不同类型、不同阶段的项目开发进行质量评估。
在一些实施例中,本公开实施例提供的装置具有的功能或包含的模块可以用于执行上文方法实施例描述的方法,其具体实现可以参照上文方法实施例的描述,为了简洁,这里不再赘述。
对应于图1中的代码处理方法,本公开实施例还提供了一种电子设备600,如图6所示,为本公开实施例提供的电子设备600的结构示意图,包括:
处理器610、存储器620、和总线630;存储器620用于存储执行指令,包括内存621和外部存储器622;这里的内存621也称内存储器,用于暂时存放处理器610中的运算数据,以及与硬盘等外部存储器622交换的数据,处理器610通过内存621与外部存储器622进行数据交换,当所述电子设备600运行时,所述处理器610与所述存储器620之间通过总线630通信,使得所述处理器610可以执行上述的代码处理方法的步骤。
可以理解的是,本申请实施例示意的结构并不构成对电子设备600的具体限定。在本申请另一些实施例中,电子设备600可以包括比图示更多或更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。图示的部件可以以硬件,软件或软件和硬件的组合实现。
本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法实施例中所述的代码处理方法的步骤。其中,该存储介质可以是易失性或非易失的计算机可读取存储介质。
本公开实施例还提供一种计算机程序产品,该计算机程序产品包括有计算机指令,所述计算机指令被处理器执行时可以执行上述方法实施例中所述的代码处理方法的步骤,具体可参见上述方法实施例,在此不再赘述。
其中,上述计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(Software Development Kit,SDK)等等。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的设备和装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。在本公开所提供的几个实施例中,应该理解到,所揭露的设备、装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-OnlyMemory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上所述实施例,仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应所述以权利要求的保护范围为准。
Claims (12)
1.一种代码处理方法,其特征在于,所述方法包括:
获取待度量的第一源代码;
对所述第一源代码进行语法分析生成第一抽象语法树,并针对所述第一抽象语法树进行语义分析和编译生成第一中间代码;
统计所述第一中间代码中所有函数的第一代码行数总量,将所述第一代码行数总量作为所述第一源代码的代码当量。
2.根据权利要求1所述的方法,其特征在于,所述统计所述第一中间代码中所有函数的第一代码行数总量,将所述第一代码行数总量作为所述第一源代码的代码当量,包括:
按照所述第一中间代码的执行逻辑,识别得到所述第一中间代码包括的多段第一函数代码;
确定每段第一函数代码的代码行数;
基于每段第一函数代码的代码行数,确定所述第一源代码的代码当量。
3.根据权利要求2所述的方法,其特征在于,所述方法还包括:
针对预设的多个第一代码关键词,确定每段所述第一函数代码对应的第一权重值,所述第一权重值表征所述第一函数代码中所述第一代码关键词对应的代码语法出现的频次;
确定每段第一函数代码能够被调用的第一次数;
所述基于每段第一函数代码的代码行数,确定所述第一源代码的代码当量,包括:
针对每段第一函数代码,计算所述第一函数代码的代码行数、对应的第一权重值、以及所述第一次数的乘积,得到所述第一函数代码的第一代码当量;
将多段所述第一函数代码中每段所述第一函数代码的第一代码当量之和,确定为所述第一源代码的代码当量。
4.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在所述第一源代码被调整的情况下,获取调整后得到的第二源代码;
对所述第二源代码进行语法分析生成第二抽象语法树,并针对所述第二抽象语法树进行语义分析和编译生成第二中间代码;
获取所述第一源代码对应的所述第一中间代码;
基于所述第一中间代码和所述第二中间代码,确定此次代码调整的增量代码当量。
5.根据权利要求4所述的方法,其特征在于,所述基于所述第一中间代码和所述第二中间代码,确定此次代码调整的增量代码当量,包括:
按照所述第二中间代码的执行逻辑,识别得到所述第二中间代码包括的多段第二函数代码;
获取对所述第一中间代码识别得到的多段第三函数代码;
基于所述多段第三函数代码和所述多段第二函数代码,确定此次代码调整的增量代码当量。
6.根据权利要求5所述的方法,其特征在于,所述基于所述多段第三函数代码和所述多段第二函数代码,确定此次代码调整的增量代码当量,包括:
针对每段第三函数代码,从所述第三函数代码中提取出所述第三函数代码在各个预设维度下的第一函数信息;
针对每段第二函数代码,从所述第二函数代码中提取出所述第二函数代码在各个预设维度下的第二函数信息;
基于每段第三函数代码的各个第一函数信息和每段第二函数代码的各个第二函数信息,对每段所述第三函数代码和每段所述第二函数代码进行匹配,得到信息匹配结果,所述信息匹配结果包括所述第三函数代码与所述第二函数代码一致,以及所述第三函数代码与所述第二函数代码不一致;
根据信息匹配结果,确定此次代码调整的增量代码当量。
7.根据权利要求6所述的方法,其特征在于,所述基于每段第三函数代码的各个第一函数信息和每段第二函数代码的各个第二函数信息,对每段所述第三函数代码和每段所述第二函数代码进行匹配,得到信息匹配结果,包括:
针对每段所述第二函数代码,检测所述多段第三函数代码中是否存在第一目标函数代码,所述第一目标函数代码与所述第二函数代码在预设数量个所述预设维度下的函数信息一致;
若存在,确定所述第二函数代码与所述第一目标函数代码对应的第三函数代码的信息匹配结果为一致,反之则确定所述第二函数代码与多段所述第三函数代码的信息匹配结果为不一致;
针对每段所述第三函数代码,检测所述多段第二函数代码中是否存在第二目标函数代码,所述第二目标函数代码与所述第三函数代码在预设数量个所述预设维度下的函数信息一致;
若存在,确定所述第三函数代码与所述第二目标函数代码对应的第二函数代码的信息匹配结果为一致,反之则确定所述第三函数代码与多段所述第二函数代码的信息匹配结果为不一致。
8.根据权利要求6所述的方法,其特征在于,所述根据信息匹配结果,确定此次代码调整的增量代码当量,包括:
针对信息匹配结果为一致的第三函数代码和对应的第二函数代码,确定该第二函数代码相较于该第三函数代码调整的第一代码行数,所述调整包括增加、删除和修改中的一者或者多者;
将信息匹配结果为不一致的所述第二函数代码确定为相较于所述第一中间代码的新增函数代码,并确定所述新增函数代码的第二代码行数;
将信息匹配结果为不一致的所述第三函数代码确定为针对于所述第一中间代码的删除函数代码,并确定所述删除函数代码的第三代码行数;
统计各个所述第一代码行数、各个所述第二代码行数和各个所述第三代码行数的第二代码行数总量,将所述第二代码行数总量作为此次代码调整的增量代码当量。
9.根据权利要求8所述的方法,其特征在于,所述方法还包括:
针对预设的多个第二代码关键词,分别确定每段所述第二函数代码对应的第二权重值和每段所述第三函数代码对应的第三权重值,所述第二权重值表征所述第二函数代码中所述第二代码关键词对应的代码语法出现的频次,所述第三权重值表征所述第三函数代码中所述第二代码关键词对应的代码语法出现的频次;
确定每段第二函数代码能够被调用的第二次数;
确定每段第三函数代码能够被调用的第三次数;
所述统计各个所述第一代码行数、各个所述第二代码行数和各个所述第三代码行数的第二代码行数总量,将所述第二代码行数总量作为此次代码调整的增量代码当量,包括:
针对每个信息匹配结果为一致的第二函数代码,计算所述第二函数代码的第一代码行数、所述第二函数代码的第二权重值、以及所述第二函数代码对应的第二次数的乘积,得到所述第二函数代码的第二代码当量;
针对每个新增函数代码,计算所述新增函数代码的第二代码行数、所述新增函数代码的第二权重值、以及所述新增函数代码对应的第二次数的乘积,得到所述新增函数代码的第三代码当量;
针对每个删除函数代码,计算所述第三代码行数、所述第三权重值、以及所述第三次数的乘积,得到所述删除函数代码的第四代码当量;
统计各个所述第二代码当量、各个所述第三代码当量和各个所述第四代码当量的第二代码行数总量,将所述第二代码行数总量作为此次代码调整的增量代码当量。
10.一种代码处理装置,其特征在于,所述装置包括:
代码获取模块,用于获取待度量的第一源代码;
代码编译模块,用于对所述第一源代码进行语法分析生成第一抽象语法树,并针对所述第一抽象语法树进行语义分析和编译生成第一中间代码;
第一当量确定模块,用于统计所述第一中间代码中所有函数的第一代码行数总量,将所述第一代码行数总量作为所述第一源代码的代码当量。
11.一种电子设备,其特征在于,包括:处理器、存储器和总线,所述存储器存储有所述处理器可执行的机器可读指令,当电子设备运行时,所述处理器与所述存储器之间通过总线通信,所述机器可读指令被所述处理器执行时执行如权利要求1至9任一项所述的代码处理方法的步骤。
12.一种计算机可读存储介质,其特征在于,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行如权利要求1至9任一项所述的代码处理方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211345783.8A CN115617347A (zh) | 2022-10-31 | 2022-10-31 | 一种代码处理方法、装置、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211345783.8A CN115617347A (zh) | 2022-10-31 | 2022-10-31 | 一种代码处理方法、装置、设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115617347A true CN115617347A (zh) | 2023-01-17 |
Family
ID=84876935
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211345783.8A Pending CN115617347A (zh) | 2022-10-31 | 2022-10-31 | 一种代码处理方法、装置、设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115617347A (zh) |
-
2022
- 2022-10-31 CN CN202211345783.8A patent/CN115617347A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10949609B2 (en) | Application of a spreadsheet formula algorithm against a dataset such as a large external data source | |
CN104838377B (zh) | 利用映射缩减集成事件处理 | |
CN111722839B (zh) | 一种代码生成方法、装置、电子设备及存储介质 | |
CN113641701B (zh) | 一种数据查询方法、系统、异构加速平台及存储介质 | |
Achlioptas et al. | Fast sampling of perfectly uniform satisfying assignments | |
CN110795455A (zh) | 依赖关系解析方法、电子装置、计算机设备及可读存储介质 | |
CN108984155B (zh) | 数据处理流程设定方法和装置 | |
US9552348B2 (en) | System and method for operating a computer application with spreadsheet functionality | |
Biswas et al. | Boa meets python: A boa dataset of data science software in python language | |
CN110543356A (zh) | 异常任务检测方法、装置、设备及计算机存储介质 | |
CN111949540A (zh) | 一种代码变更风险估算审核方法及装置 | |
Yonai et al. | Mercem: Method name recommendation based on call graph embedding | |
CN110263121B (zh) | 表格数据处理方法、装置、电子装置及计算机可读存储介质 | |
US10169324B2 (en) | Universal lexical analyzers | |
CN110704472A (zh) | 数据查询统计方法及装置 | |
CN116483850A (zh) | 数据处理方法、装置、设备以及介质 | |
CN117055851A (zh) | 一种软件架构恢复方法、装置、电子设备及存储介质 | |
CN115617347A (zh) | 一种代码处理方法、装置、设备及存储介质 | |
CN112069052A (zh) | 一种异常对象检测方法、装置、设备及存储介质 | |
CN115048673A (zh) | 一种日志掩码方法及装置 | |
Nguyen et al. | Using topic model to suggest fine-grained source code changes | |
CN114090721B (zh) | 基于自然语言数据进行查询、数据更新的方法及装置 | |
CN111240652A (zh) | 数据处理方法及装置、计算机存储介质、电子设备 | |
CN113342862B (zh) | 查询推荐方法、装置、电子设备及可读存储介质 | |
Liu et al. | PTDETECTOR: An Automated JavaScript Front-end Library Detector |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |