CN110515823B - 程序代码复杂度评估方法和装置 - Google Patents
程序代码复杂度评估方法和装置 Download PDFInfo
- Publication number
- CN110515823B CN110515823B CN201810490655.XA CN201810490655A CN110515823B CN 110515823 B CN110515823 B CN 110515823B CN 201810490655 A CN201810490655 A CN 201810490655A CN 110515823 B CN110515823 B CN 110515823B
- Authority
- CN
- China
- Prior art keywords
- nodes
- complexity
- node
- parent
- code
- 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.)
- Active
Links
- 238000011156 evaluation Methods 0.000 title claims description 16
- 238000000034 method Methods 0.000 claims abstract description 46
- 230000006870 function Effects 0.000 claims description 42
- 238000002372 labelling Methods 0.000 claims description 37
- 230000011218 segmentation Effects 0.000 claims description 37
- 238000004590 computer program Methods 0.000 claims description 10
- 230000009467 reduction Effects 0.000 claims description 10
- 238000004364 calculation method Methods 0.000 abstract description 14
- 238000010586 diagram Methods 0.000 description 9
- 238000012545 processing Methods 0.000 description 8
- 230000008569 process Effects 0.000 description 6
- 230000003287 optical effect Effects 0.000 description 5
- 238000004458 analytical method Methods 0.000 description 4
- 238000004043 dyeing Methods 0.000 description 2
- 239000000463 material Substances 0.000 description 2
- 230000002093 peripheral effect Effects 0.000 description 2
- 230000004075 alteration Effects 0.000 description 1
- 238000003491 array Methods 0.000 description 1
- 238000013473 artificial intelligence Methods 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 230000007423 decrease Effects 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 239000013307 optical fiber Substances 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
- G06F11/3616—Software analysis for verifying properties of programs using software metrics
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明提出一种程序代码复杂度评估方法和装置,其中,方法包括:根据程序代码,生成对应的语法树;将语法树的根节点作为首个代码层级,并从根节点开始,根据各节点之间的父子关系,对各节点顺序标注对应的代码层级;从语法树中代码层数最高的叶子节点开始,查询具有父子关系的节点,并对查询到的节点继续查询具有父子关系的节点,直至查询到节点为根节点后停止查询,并对查询到的各节点标注复杂度;根据根节点标注的复杂度,确定程序代码的复杂度最大值。该方法通过依据父子关系正向顺序标注各节点代码层级后,反向标注复杂度,从而确定复杂度最大值,解决了现有技术中在代码分支较多且嵌套层数不等的情况下,复杂度计算效率较低的技术问题。
Description
技术领域
本发明涉及计算机软件技术领域,尤其涉及一种程序代码复杂度评估方法和装置。
背景技术
程序代码的复杂度是评估一个代码质量的重要标准之一,较低的复杂度既能减少维护成本,又能避免一些不可控问题的出现。因此,在评估代码质量时,计算程序代码复杂度是及其重要的。
现有技术中通常采用复杂度最大值体现程序代码的最大嵌套层数,在确定复杂度最大值时,一种方法是采用递归计算的方法计算代码块最大嵌套层数;另一种方法是通过匹配代码中大括号“{”,“}”来区分嵌套层数,进而统计得到最大嵌套层数。但是现有技术中,在程序代码存在多个分支并且分支嵌套层数不等的情况时,无论是通过递归计算的方法,还是通过匹配程序代码中大括号“{”,“}”来区分嵌套层数的方法,计算过程均较为复杂需要对各个分支分别处理,计算效率较低。
发明内容
本发明旨在至少在一定程度上解决相关技术中的技术问题之一。
为此,本发明的第一个目的在于提出一种程序代码复杂度评估方法,以实现通过依据父子关系正向顺序标注各节点代码层级后,反向标注复杂度,从而确定复杂度最大值,解决了现有技术中在代码分支较多且嵌套层数不等的情况下,复杂度计算效率低的技术问题。
本发明的第二个目的在于提出一种程序代码复杂度评估装置。
本发明的第三个目的在于提出一种计算机设备。
本发明的第四个目的在于提出一种非临时性计算机可读存储介质。
本发明的第五个目的在于提出一种计算机程序产品。
为达上述目的,本发明第一方面实施例提出了一种程序代码复杂度评估方法,包括:
根据程序代码,生成对应的语法树,其中,所述语法树中各节点对应所述程序代码中的函数或分词语句,各节点之间的父子关系是根据对应函数或分词语句之间的嵌套关系确定的;
将所述语法树的根节点作为首个代码层级,并从所述根节点开始,根据各节点之间的父子关系,对各节点顺序标注对应的代码层级;
从所述语法树中代码层数最高的叶子节点开始,查询具有所述父子关系的节点,并对查询到的节点继续查询具有父子关系的节点,直至查询到节点为所述根节点后停止查询,并对查询到的各节点标注复杂度;其中,各节点标注的复杂度随标注的代码层数减小而增大;
根据所述根节点标注的复杂度,确定所述程序代码的复杂度最大值。
本发明实施例的程序代码复杂度评估方法,通过根据程序代码,生成对应的语法树,其中,所述语法树中各节点对应所述程序代码中的函数或分词语句,各节点之间的父子关系是根据对应函数或分词语句之间的嵌套关系确定的;将语法树的根节点作为首个代码层级,并从根节点开始,根据各节点之间的父子关系,对各节点顺序标注对应的代码层级;从语法树中代码层数最高的叶子节点开始,查询具有父子关系的节点,并对查询到的节点继续查询具有父子关系的节点,直至查询到节点为根节点后停止查询,并对查询到的各节点标注复杂度;其中,各节点标注的复杂度随标注的代码层数减小而增大;根据根节点标注的复杂度,确定程序代码的复杂度最大值。该方法通过依据父子关系正向顺序标注各节点代码层级后,反向标注复杂度,从而确定复杂度最大值,解决了现有技术中在代码分支较多且嵌套层数不等的情况下,复杂度计算效率低的技术问题。
为达上述目的,本发明第二方面实施例提出了一种程序代码复杂度评估装置,包括:
生成模块,用于根据程序代码,生成对应的语法树,其中,所述语法树中各节点对应所述程序代码中的函数或分词语句,各节点之间的父子关系是根据对应函数或分词语句之间的嵌套关系确定的;
层级标注模块,用于将所述语法树的根节点作为首个代码层级,并从所述根节点开始,根据各节点之间的父子关系,对各节点顺序标注对应的代码层级;
复杂度标注模块,用于从所述语法树中代码层数最高的叶子节点开始,查询具有所述父子关系的节点,并对查询到的节点继续查询具有父子关系的节点,直至查询到节点为所述根节点后停止查询,并对查询到的各节点标注复杂度;其中,各节点标注的复杂度随标注的代码层数减小而增大;
确定模块,用于根据所述根节点标注的复杂度,确定所述程序代码的复杂度最大值。
所述装置,还包括:
轮询模块,用于依据标注的代码层数从大到小的顺序,对所述语法树中其他叶子节点进行轮询;对每一个轮询到的叶子节点,查询具有所述父子关系的节点,并对查询到的节点继续查询具有父子关系的节点,直至查询到节点已标注复杂度后停止查询,并对查询到的各节点标注复杂度。
统计模块,用于针对各复杂度分别统计标注为对应复杂度的节点个数;或者,针对各复杂度分别统计标注为对应复杂度的节点在所述语法树中的占比。
本发明实施例的程序代码复杂度评估装置,通过根据程序代码,生成对应的语法树,其中,所述语法树中各节点对应所述程序代码中的函数或分词语句,各节点之间的父子关系是根据对应函数或分词语句之间的嵌套关系确定的;将语法树的根节点作为首个代码层级,并从根节点开始,根据各节点之间的父子关系,对各节点顺序标注对应的代码层级;从语法树中代码层数最高的叶子节点开始,查询具有父子关系的节点,并对查询到的节点继续查询具有父子关系的节点,直至查询到节点为根节点后停止查询,并对查询到的各节点标注复杂度;其中,各节点标注的复杂度随标注的代码层数减小而增大;根据根节点标注的复杂度,确定程序代码的复杂度最大值。该方法通过依据父子关系正向顺序标注各节点代码层级后,反向标注复杂度,从而确定复杂度最大值,解决了现有技术中在代码分支较多且嵌套层数不等的情况下,复杂度计算效率低的技术问题。
为了实现上述目的,本发明第三方面实施例提出了一种计算机设备,包括:处理器;用于存储所述处理器可执行指令的存储器;其中,所述处理器通过读取存储器中存储的可执行程序代码来运行与可执行程序代码对应的程序,用于执行第一方面实施例所述的程序代码复杂度评估方法。
为了实现上述目的,本发明第四方面实施例提出了一种非临时性计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如本发明第一方面实施例所述的程序代码复杂度评估方法。
为了实现上述目的,本发明第五方面实施例提出了一种计算机程序产品,当所述计算机程序产品中的指令处理器执行时实现如本发明第一方面实施例所述的程序代码复杂度评估方法。
本发明附加的方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
本发明上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中:
图1为本发明实施例所提供的一种程序代码复杂度评估方法的流程示意图;
图2为本发明实施例所提供的另一种程序代码复杂度评估方法的流程示意图;
图3为程序代码复杂度计算过程图;
图4为本发明实施例所提供的一种程序代码复杂度评估装置的结构示意图;
图5为本发明实施例所提供的另一种程序代码复杂度评估装置的结构示意图;以及
图6示出了适于用来实现本申请实施方式的示例性计算机设备的框图。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,旨在用于解释本发明,而不能理解为对本发明的限制。
下面参考附图描述本发明实施例的程序代码复杂度评估方法和装置。
图1为本发明实施例所提供的一种程序代码复杂度评估方法的流程示意图。
如图1所示,该程序代码复杂度评估方法包括以下步骤:
步骤101,根据程序代码,生成对应的语法树,其中,语法树中各节点对应程序代码中的函数或分词语句,各节点之间的父子关系是根据对应函数或分词语句之间的嵌套关系确定的。
需要说明的是,语法树,也称为抽象语法树,是源代码的抽象语法结构的树状表现形式,这里特指编程语言的程序源代码。树上的每个节点都表示源代码中的一种结构,之所以说是抽象的,是因为语法树并不会表示出真实语法出现的每一个细节,语法树的结构类似于树结构,它的每一个节点都与语法结构相对应。但由于不依赖于细节,语法树不会显示源程序语法的所有细节,比如说,嵌套括号和关键字被隐含在树的结构中,并没有以节点的形式呈现。
语法树的另一个特点是结构并不依赖于具体文本,这样可以为后阶段的处理提供统一接口,即使前端采用了不同文法,也无需改变后阶段的处理,只需要更改前端代码,从而降低了工作量。
具体地,对程序代码进行分词,得到程序代码中的函数和分词语句,其中,程序代码中的函数和分词语句对应于语法树的各节点。再根据函数和分词语句之间的嵌套关系,生成对应的语法树,以进行下一步分析。其中,函数或分词语句之间的嵌套关系决定语法树各节点之间的父子关系。
步骤102,将语法树的根节点作为首个代码层级,并从根节点开始,根据各节点之间的父子关系,对各节点顺序标注对应的代码层级。
本实施例中,代码层级是指程序源代码中嵌套的层数。
具体地,根据语法树各节点的父子关系,标注对应的代码层级,首先将语法树的根节点作为首个代码层级,标注为第一层,接着从根节点开始,根据各节点之间的父子关系,逐层对各节点顺序标注对应的代码层级。
步骤103,从语法树中代码层数最高的叶子节点开始,查询具有父子关系的节点,并对查询到的节点继续查询具有父子关系的节点,直至查询到节点为所述根节点后停止查询,并对查询到的各节点标注复杂度;其中,各节点标注的复杂度随标注的代码层数减小而增大。
本实施例中,叶子节点是语法树中最底端节点,没有子节点。首先,从生成的语法树中代码层数最高的叶子节点开始,通过查询语句,查询具有父子关系的节点,对查询到的节点继续通过查询语句查询具有父子关系的节点,直到查询到的节点为根节点的时候,停止查询,并对查询到的各节点标注复杂度。其中,各节点标注的复杂度随标注的代码层数减小而增大,例如,根节点标注的复杂度大于叶子节点标注的复杂度。
进一步地,依据对各节点顺序标注的代码层数从大到小的顺序,对语法树中除层数最高的叶子节点以外的其他叶子节点进行轮询。具体地,对每一个轮询到的叶子节点,通过查询语句,查询具有父子关系的节点,并对查询到的节点继续查询具有父子关系的节点,直至查询到节点已标注复杂度后停止查询,并对查询到的各节点标注复杂度。
作为一种可能的方式,可针对每一个轮询到的叶子节点,查询到的各节点标注的复杂度,分别统计标注为对应复杂度的节点个数。作为另一种可能的方式,可针对每一个轮询到的叶子节点,查询到的各节点标注的复杂度,分别统计标注为对应复杂度的节点在语法树中的占比。其目的是便于单独提取各节点所在层级以及复杂度信息,方便最终计算程序代码的复杂度。
进一步地说明,通过对语法树中各叶子节点进行轮询,并对查询到的各节点标注复杂度后,根据各节点标注的复杂度和标注的代码层级,确定该程序代码的复杂度。
步骤104,根据根节点标注的复杂度,确定程序代码的复杂度最大值。
具体地,通过对语法树中各叶子节点进行轮询,并对查询到的各节点标注复杂度后,根据各节点标注的复杂度和标注的代码层级,以及根节点标注的复杂度,确定程序代码的复杂度的最大值。
本发明实施例的程序代码复杂度评估方法,通过根据程序代码,生成对应的语法树,其中,所述语法树中各节点对应所述程序代码中的函数或分词语句,各节点之间的父子关系是根据对应函数或分词语句之间的嵌套关系确定的;将语法树的根节点作为首个代码层级,并从根节点开始,根据各节点之间的父子关系,对各节点顺序标注对应的代码层级;从语法树中代码层数最高的叶子节点开始,查询具有父子关系的节点,并对查询到的节点继续查询具有父子关系的节点,直至查询到节点为根节点后停止查询,并对查询到的各节点标注复杂度;其中,各节点标注的复杂度随标注的代码层数减小而增大;根据根节点标注的复杂度,确定程序代码的复杂度最大值。该方法通过依据父子关系正向顺序标注各节点代码层级后,反向标注复杂度,从而确定复杂度最大值,解决了现有技术中在代码分支较多且嵌套层数不等的情况下,复杂度计算效率低的技术问题。
为了清楚说明上一实施例,本实施例通过举例的方式,更清楚的解释程序代码复杂度评估方法,图2为本实施例提供的另一种程序代码复杂度评估方法。
如图2所示,该程序代码复杂度评估方法可以包括以下步骤:
步骤201,根据程序代码,生成对应的语法树。
具体地,程序代码经过token化进行分词,得到程序代码中的函数和分词语句,其中,程序代码中的函数和分词语句对应于语法树的各节点。再根据函数和分词语句之间的嵌套关系,生成对应的语法树,以进行下一步分析。
下面通过举例说明程序代码转换为语法树节点的具体过程,例如,下面一段程序代码,经过token化进行分词,以代码块为单位,转换为语法树结构节点,具体节点分别为:main,if,else,while,if。其中,token就是把程序的语句进行类似分词得到的单词,它是下步语法分析的输入。例如,C语言中,单词可以分为保留字,就是int,while等。标识符,例如int m;m就是标识符。数字,以及+,-,.,*等字符,其中也包括++,--,!=等。
程序代码示例如下:
步骤202,初始化各节点,并对各节点顺序标记对应的代码层数。
具体地,首先初始化语法树的各节点及其复杂度,如,level=-1、complexity=-1。再根据语法树各节点的父子关系,标注对应的代码层级,将语法树的根节点作为首个代码层级,标注为第一层,接着从根节点开始,根据各节点之间的父子关系,逐层对各节点顺序标注对应的代码层级。
作为一种示例,如图3所示的代码复杂度计算过程图,图3中最下面一行标注的为上述程序代码生成对应的语法树后,各节点对应的代码层级。其中,节点main,if,else,while,if对应的代码层级分别为0、1、1、2、3。
步骤203,从语法树中代码层数最高的叶子节点开始,对各节点进行染色,做标记,并确定各节点的复杂度。具体地,如图3中右图所示,从右到左对各节点染色并做标记,具体可以通过复杂度进行标记,或者采用其他方式进行标记,本实施例中对此不作限定。
进一步地说明,首先查询到语法树中代码层数最高的叶子节点,本示例中,定位到代码层数为3的if节点,如果该节点没有被染色,则标注节点的复杂度complexity为0。继续查询该节点的父节点while,如果该节点的父节点没有被染色,则标注节点的复杂度complexity为1。继续查询该节点的父节点if,如果该节点的父节点没有被染色,则标注节点的复杂度complexity为2。对查询到的节点继续向前查询具有父子关系的节点,直至查询到节点被染色后停止查询,当查询到节点main后,停止查询,标注节点的复杂度complexity为3。
更进一步地说明,对语法树中除代码层数最高的其他的叶子节点进行复杂度计算,具体地,对每一个轮询到的叶子节点,通过查询语句,查询具有父子关系的节点,并对查询到的节点继续查询具有父子关系的节点,直至查询到节点已标注复杂度后停止查询,并对查询到的各节点标注复杂度。
步骤204,当所有节点被染色后,获取所有节点的层数及复杂度,从而得到程序代码复杂度的最大值。
具体地,当图3中所有的节点都被染色后,所有节点的层数和复杂度都不为-1后,得到各节点的层数及复杂度。进一步地,根据各节点的层数和复杂度,得到程序代码复杂度的最大值。
本发明实施例的程序代码复杂度评估方法,通过根据程序代码,生成对应的语法树,其中,所述语法树中各节点对应所述程序代码中的函数或分词语句,各节点之间的父子关系是根据对应函数或分词语句之间的嵌套关系确定的;对语法树中各节点进行初始化,并对各节点顺序标记对应的代码层数;从语法树中代码层数最高的叶子节点开始,对各节点进行染色,做标记,并确定各节点的复杂度;当所有节点被染色后,获取所有节点的层数及复杂度,进一步得到程序代码复杂度的最大值。该方法通过依据父子关系正向顺序标注各节点代码层级后,反向标注复杂度,从而确定复杂度最大值,解决了现有技术中在代码分支较多且嵌套层数不等的情况下,复杂度计算效率低的技术问题。
为了实现上述实施例,本发明还提出一种程序代码复杂度评估装置。
图4为本发明实施例提供的一种程序代码复杂度评估装置的结构示意图。
如图4所示,该程序代码复杂度评估装置包括:生成模块110、层级标注模块120、复杂度标注模块130、确定模块140。
生成模块110,用于根据程序代码,生成对应的语法树,其中,语法树中各节点对应程序代码中的函数或分词语句,各节点之间的父子关系是根据对应函数或分词语句之间的嵌套关系确定的。
具体地,生成模块110通过对程序代码进行分词,得到程序代码中的函数和分词语句,其中,程序代码中的函数和分词语句对应于语法树的各节点。再根据函数和分词语句之间的嵌套关系,生成对应的语法树,以进行下一步分析。
层级标注模块120,用于将语法树的根节点作为首个代码层级,并从根节点开始,根据各节点之间的父子关系,对各节点顺序标注对应的代码层级。
具体地,层级标注模块120用于根据语法树各节点的父子关系,标注对应的代码层级,首先将语法树的根节点作为首个代码层级,标注为第一层,接着从根节点开始,根据各节点之间的父子关系,逐层对各节点顺序标注对应的代码层级。
复杂度标注模块130,用于从语法树中代码层数最高的叶子节点开始,查询具有父子关系的节点,并对查询到的节点继续查询具有父子关系的节点,直至查询到节点为根节点后停止查询,并对查询到的各节点标注复杂度;其中,各节点标注的复杂度随标注的代码层数减小而增大。
具体地,首先从生成的语法树中代码层数最高的叶子节点开始,通过查询语句,查询具有父子关系的节点,对查询到的节点继续通过查询语句查询具有父子关系的节点,直到查询到的节点为根节点的时候,停止查询,并对查询到的各节点标注复杂度。
进一步地,依据对各节点顺序标注的代码层数从大到小的顺序,对语法树中除层数最高的叶子节点以外的其他叶子节点进行轮询。具体地,对每一个轮询到的叶子节点,通过查询语句,查询具有父子关系的节点,并对查询到的节点继续查询具有父子关系的节点,直至查询到节点已标注复杂度后停止查询,并对查询到的各节点标注复杂度。
确定模块140,用于根据根节点标注的复杂度,确定程序代码的复杂度最大值。
具体地,通过对语法树中各叶子节点进行轮询,并对查询到的各节点标注复杂度后,根据各节点标注的复杂度和标注的代码层级,以及根节点标注的复杂度,通过确定模块140确定程序代码的复杂度的最大值。
进一步地,如图5所示的本发明实施例的另一种程序代码复杂度评估装置结构示意图,在图4的基础上还进一步包括:轮询模块150、统计模块160。
轮询模块150,用于依据标注的代码层数从大到小的顺序,对语法树中其他叶子节点进行轮询;对每一个轮询到的叶子节点,查询具有父子关系的节点,并对查询到的节点继续查询具有父子关系的节点,直至查询到节点已标注复杂度后停止查询,并对查询到的各节点标注复杂度。
统计模块160,用于针对各复杂度分别统计标注为对应复杂度的节点个数;或者,针对各复杂度分别统计标注为对应复杂度的节点在语法树中的占比。
本发明实施例的程序代码复杂度评估装置,通过根据程序代码,生成对应的语法树,其中,所述语法树中各节点对应所述程序代码中的函数或分词语句,各节点之间的父子关系是根据对应函数或分词语句之间的嵌套关系确定的;将语法树的根节点作为首个代码层级,并从根节点开始,根据各节点之间的父子关系,对各节点顺序标注对应的代码层级;从语法树中代码层数最高的叶子节点开始,查询具有父子关系的节点,并对查询到的节点继续查询具有父子关系的节点,直至查询到节点为根节点后停止查询,并对查询到的各节点标注复杂度;其中,各节点标注的复杂度随标注的代码层数减小而增大;根据根节点标注的复杂度,确定程序代码的复杂度最大值。该方法通过依据父子关系正向顺序标注各节点代码层级后,反向标注复杂度,从而确定复杂度最大值,解决了现有技术中在代码分支较多且嵌套层数不等的情况下,复杂度计算效率低的技术问题。
需要说明的是,前述对程序代码复杂度评估方法实施例的解释说明也适用于该实施例的程序代码复杂度评估装置,此处不再赘述。
为了实现上述实施例,本发明还提出另一种计算机设备,包括:处理器,以及用于存储所述处理器可执行指令的存储器。
其中,所述处理器通过读取所述存储器中存储的可执行程序代码来运行与所述可执行程序代码对应的程序,以用于实现如本发明前述实施例提出的程序代码复杂度评估方法。
为了实现上述实施例,本发明还提出一种非临时性计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现上述第一方面实施例提出的程序代码复杂度评估方法。
为了实现上述实施例,本发明还提出一种计算机程序产品,当所述计算机程序产品中的指令处理器执行时,执行一种基于人工智能的程序代码复杂度评估方法。
图6示出了适于用来实现本申请实施方式的示例性计算机设备的框图。图6显示的计算机设备12仅仅是一个示例,不应对本申请实施例的功能和使用范围带来任何限制。
如图6所示,计算机设备12以通用计算设备的形式表现。计算机设备12的组件可以包括但不限于:一个或者多个处理器或者处理单元16,系统存储器28,连接不同系统组件(包括系统存储器28和处理单元16)的总线18。
总线18表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器,外围总线,图形加速端口,处理器或者使用多种总线结构中的任意总线结构的局域总线。举例来说,这些体系结构包括但不限于工业标准体系结构(Industry StandardArchitecture;以下简称:ISA)总线,微通道体系结构(Micro Channel Architecture;以下简称:MAC)总线,增强型ISA总线、视频电子标准协会(Video Electronics StandardsAssociation;以下简称:VESA)局域总线以及外围组件互连(Peripheral ComponentInterconnection;以下简称:PCI)总线。
计算机设备12典型地包括多种计算机系统可读介质。这些介质可以是任何能够被计算机设备12访问的可用介质,包括易失性和非易失性介质,可移动的和不可移动的介质。
存储器28可以包括易失性存储器形式的计算机系统可读介质,例如随机存取存储器(Random Access Memory;以下简称:RAM)30和/或高速缓存存储器32。计算机设备12可以进一步包括其它可移动/不可移动的、易失性/非易失性计算机系统存储介质。仅作为举例,存储系统34可以用于读写不可移动的、非易失性磁介质(图6未显示,通常称为“硬盘驱动器”)。尽管图6中未示出,可以提供用于对可移动非易失性磁盘(例如“软盘”)读写的磁盘驱动器,以及对可移动非易失性光盘(例如:光盘只读存储器(Compact Disc Read OnlyMemory;以下简称:CD-ROM)、数字多功能只读光盘(Digital Video Disc Read OnlyMemory;以下简称:DVD-ROM)或者其它光介质)读写的光盘驱动器。在这些情况下,每个驱动器可以通过一个或者多个数据介质接口与总线18相连。存储器28可以包括至少一个程序产品,该程序产品具有一组(例如至少一个)程序模块,这些程序模块被配置以执行本申请各实施例的功能。
具有一组(至少一个)程序模块42的程序/实用工具40,可以存储在例如存储器28中,这样的程序模块42包括但不限于操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。程序模块42通常执行本申请所描述的实施例中的功能和/或方法。
计算机设备12也可以与一个或多个外部设备14(例如键盘、指向设备、显示器24等)通信,还可与一个或者多个使得用户能与该计算机系统/服务器12交互的设备通信,和/或与使得该计算机系统/服务器12能与一个或多个其它计算设备进行通信的任何设备(例如网卡,调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口22进行。并且,计算机设备12还可以通过网络适配器20与一个或者多个网络(例如局域网(Local AreaNetwork;以下简称:LAN),广域网(Wide Area Network;以下简称:WAN)和/或公共网络,例如因特网)通信。如图所示,网络适配器20通过总线18与计算机设备12的其它模块通信。应当明白,尽管图中未示出,可以结合计算机设备12使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
处理单元16通过运行存储在系统存储器28中的程序,从而执行各种功能应用以及数据处理,例如实现前述实施例中提及的方法。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。
此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。在本发明的描述中,“多个”的含义是至少两个,例如两个,三个等,除非另有明确具体的限定。
流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括一个或更多个用于实现定制逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,并且本发明的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序,包括根据所涉及的功能按基本同时的方式或按相反的顺序,来执行功能,这应被本发明的实施例所属技术领域的技术人员所理解。
在流程图中表示或在此以其他方式描述的逻辑和/或步骤,例如,可以被认为是用于实现逻辑功能的可执行指令的定序列表,可以具体实现在任何计算机可读介质中,以供指令执行系统、装置或设备(如基于计算机的系统、包括处理器的系统或其他可以从指令执行系统、装置或设备取指令并执行指令的系统)使用,或结合这些指令执行系统、装置或设备而使用。就本说明书而言,"计算机可读介质"可以是任何可以包含、存储、通信、传播或传输程序以供指令执行系统、装置或设备或结合这些指令执行系统、装置或设备而使用的装置。计算机可读介质的更具体的示例(非穷尽性列表)包括以下:具有一个或多个布线的电连接部(电子装置),便携式计算机盘盒(磁装置),随机存取存储器(RAM),只读存储器(ROM),可擦除可编辑只读存储器(EPROM或闪速存储器),光纤装置,以及便携式光盘只读存储器(CDROM)。另外,计算机可读介质甚至可以是可在其上打印所述程序的纸或其他合适的介质,因为可以例如通过对纸或其他介质进行光学扫描,接着进行编辑、解译或必要时以其他合适方式进行处理来以电子方式获得所述程序,然后将其存储在计算机存储器中。
应当理解,本发明的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。如,如果用硬件来实现和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(PGA),现场可编程门阵列(FPGA)等。
本技术领域的普通技术人员可以理解实现上述实施例方法携带的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,该程序在执行时,包括方法实施例的步骤之一或其组合。
此外,在本发明各个实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读取存储介质中。
上述提到的存储介质可以是只读存储器,磁盘或光盘等。尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。
Claims (10)
1.一种程序代码复杂度评估方法,其特征在于,所述方法包括以下步骤:
根据程序代码,生成对应的语法树,其中,所述语法树中各节点对应所述程序代码中的函数或分词语句,各节点之间的父子关系是根据对应函数或分词语句之间的嵌套关系确定的;
将所述语法树的根节点作为首个代码层级,并从所述根节点开始,根据各节点之间的父子关系,对各节点顺序标注对应的代码层级;
从所述语法树中代码层数最高的叶子节点开始,查询具有所述父子关系的节点,并对查询到的节点继续查询具有父子关系的节点,直至查询到节点为所述根节点后停止查询,并对查询到的各节点标注复杂度;其中,各节点标注的复杂度随标注的代码层数减小而增大;
根据所述根节点标注的复杂度,确定所述程序代码的复杂度最大值,所述复杂度最大值体现所述程序代码的最大嵌套层数。
2.根据权利要求1所述的程序代码复杂度评估方法,其特征在于,所述从语法树中代码层数最高的叶子节点开始,查询具有所述父子关系的节点,并对查询到的节点继续查询具有父子关系的节点,直至查询到节点为所述根节点后停止查询,并对查询到的各节点标注复杂度之后,还包括:
依据标注的代码层数从大到小的顺序,对所述语法树中其他叶子节点进行轮询;
对每一个轮询到的叶子节点,查询具有所述父子关系的节点,并对查询到的节点继续查询具有父子关系的节点,直至查询到节点已标注复杂度后停止查询,并对查询到的各节点标注复杂度。
3.根据权利要求2所述的程序代码复杂度评估方法,其特征在于,所述对每一个轮询到的叶子节点,查询具有所述父子关系的节点,并对查询到的节点继续查询具有父子关系的节点,直至查询到节点已标注复杂度后停止查询,并对查询到的各节点标注复杂度之后,还包括:
针对各复杂度分别统计标注为对应复杂度的节点个数;
或者,针对各复杂度分别统计标注为对应复杂度的节点在所述语法树中的占比。
4.根据权利要求2所述的程序代码复杂度评估方法,其特征在于,所述对每一个轮询到的叶子节点,查询具有所述父子关系的节点,并对查询到的节点继续查询具有父子关系的节点,直至查询到节点已标注复杂度后停止查询,并对查询到的各节点标注复杂度之后,还包括:
根据各节点标注的复杂度和标注的代码层级,确定所述程序代码的复杂度。
5.根据权利要求1-4任一项所述的程序代码复杂度评估方法,其特征在于,所述根据程序代码,生成对应的语法树,包括:
对所述程序代码进行分词,得到所述程序代码中的函数和分词语句;
根据所述函数和分词语句之间的嵌套关系,生成对应的语法树。
6.一种程序代码复杂度评估装置,其特征在于,包括:
生成模块,用于根据程序代码,生成对应的语法树,其中,所述语法树中各节点对应所述程序代码中的函数或分词语句,各节点之间的父子关系是根据对应函数或分词语句之间的嵌套关系确定的;
层级标注模块,用于将所述语法树的根节点作为首个代码层级,并从所述根节点开始,根据各节点之间的父子关系,对各节点顺序标注对应的代码层级;
复杂度标注模块,用于从所述语法树中代码层数最高的叶子节点开始,查询具有所述父子关系的节点,并对查询到的节点继续查询具有父子关系的节点,直至查询到节点为所述根节点后停止查询,并对查询到的各节点标注复杂度;其中,各节点标注的复杂度随标注的代码层数减小而增大;
确定模块,用于根据所述根节点标注的复杂度,确定所述程序代码的复杂度最大值,所述复杂度最大值体现所述程序代码的最大嵌套层数。
7.根据权利要求6所述的程序代码复杂度评估装置,其特征在于,所述装置,还包括:
轮询模块,用于依据标注的代码层数从大到小的顺序,对所述语法树中其他叶子节点进行轮询;对每一个轮询到的叶子节点,查询具有所述父子关系的节点,并对查询到的节点继续查询具有父子关系的节点,直至查询到节点已标注复杂度后停止查询,并对查询到的各节点标注复杂度。
8.根据权利要求7所述的程序代码复杂度评估装置,其特征在于,所述装置,还包括:
统计模块,用于针对各复杂度分别统计标注为对应复杂度的节点个数;或者,针对各复杂度分别统计标注为对应复杂度的节点在所述语法树中的占比。
9.一种计算机设备,其特征在于,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时,实现如权利要求1-5中任一所述的程序代码复杂度评估方法。
10.一种非临时性计算机可读存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1-5中任一所述的程序代码复杂度评估方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810490655.XA CN110515823B (zh) | 2018-05-21 | 2018-05-21 | 程序代码复杂度评估方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810490655.XA CN110515823B (zh) | 2018-05-21 | 2018-05-21 | 程序代码复杂度评估方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110515823A CN110515823A (zh) | 2019-11-29 |
CN110515823B true CN110515823B (zh) | 2023-04-07 |
Family
ID=68622245
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810490655.XA Active CN110515823B (zh) | 2018-05-21 | 2018-05-21 | 程序代码复杂度评估方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110515823B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111008148B (zh) * | 2019-12-20 | 2024-02-02 | 广州品唯软件有限公司 | 代码的测试方法、装置及计算机可读存储介质 |
CN111190818B (zh) * | 2019-12-24 | 2023-07-21 | 中国平安财产保险股份有限公司 | 前端代码分析方法、装置、计算机设备及存储介质 |
CN111562944B (zh) * | 2020-05-11 | 2023-08-29 | 南京域智智能科技有限公司 | 程序代码的比对方法、比对装置 |
CN112463377B (zh) * | 2020-11-26 | 2023-03-14 | 海光信息技术股份有限公司 | 异构计算系统执行计算任务的方法及装置 |
CN115983719B (zh) * | 2023-03-16 | 2023-07-21 | 中国船舶集团有限公司第七一九研究所 | 一种软件综合质量评价模型的训练方法及系统 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106610999A (zh) * | 2015-10-26 | 2017-05-03 | 北大方正集团有限公司 | 查询处理方法和装置 |
CN106980495A (zh) * | 2016-11-18 | 2017-07-25 | 东南大学 | 一种基于程序切片的功能可复用性度量方法 |
CN107239396A (zh) * | 2017-05-11 | 2017-10-10 | 东南大学 | 一种基于代码圈复杂度度量的软件演化评估方法 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CA2684348A1 (en) * | 2009-11-04 | 2011-05-04 | Ibm Canada Limited - Ibm Canada Limitee | Algorithm complexity identification |
EP3208712B1 (en) * | 2016-02-22 | 2020-02-19 | Karlsruher Institut für Technologie | Computer system and method for parallel program code optimization and deployment |
CN105808435A (zh) * | 2016-03-08 | 2016-07-27 | 北京理工大学 | 一种基于复杂网络的软件缺陷评估模型的构建方法 |
CN107704382B (zh) * | 2017-09-07 | 2020-09-25 | 北京信息科技大学 | 面向Python的函数调用路径生成方法和系统 |
CN107644073A (zh) * | 2017-09-18 | 2018-01-30 | 广东中标数据科技股份有限公司 | 一种基于深度优先遍历的字段血缘分析方法、系统及装置 |
-
2018
- 2018-05-21 CN CN201810490655.XA patent/CN110515823B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106610999A (zh) * | 2015-10-26 | 2017-05-03 | 北大方正集团有限公司 | 查询处理方法和装置 |
CN106980495A (zh) * | 2016-11-18 | 2017-07-25 | 东南大学 | 一种基于程序切片的功能可复用性度量方法 |
CN107239396A (zh) * | 2017-05-11 | 2017-10-10 | 东南大学 | 一种基于代码圈复杂度度量的软件演化评估方法 |
Also Published As
Publication number | Publication date |
---|---|
CN110515823A (zh) | 2019-11-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110515823B (zh) | 程序代码复杂度评估方法和装置 | |
CN110196894B (zh) | 语言模型的训练方法和预测方法 | |
CN107193807B (zh) | 基于人工智能的语言转换处理方法、装置及终端 | |
KR102254612B1 (ko) | 텍스트 환언 방법, 장치, 서버, 및 기억 매체 | |
CN110502227B (zh) | 代码补全的方法及装置、存储介质、电子设备 | |
CN110705214B (zh) | 一种自动编码方法及装置 | |
CN108182246B (zh) | 敏感词检测过滤方法、装置和计算机设备 | |
CN110795938B (zh) | 文本序列分词方法、装置及存储介质 | |
CN109710087B (zh) | 输入法模型生成方法及装置 | |
CN111401071A (zh) | 模型的训练方法、装置、计算机设备和可读存储介质 | |
CN110020163B (zh) | 基于人机交互的搜索方法、装置、计算机设备和存储介质 | |
CN108563655A (zh) | 基于文本的事件识别方法和装置 | |
CN112395886B (zh) | 相似文本确定方法及相关设备 | |
CN113807096B (zh) | 文本数据的处理方法、装置、计算机设备和存储介质 | |
CN111949798A (zh) | 图谱的构建方法、装置、计算机设备和存储介质 | |
CN111563380A (zh) | 一种命名实体识别方法及其装置 | |
CN110781292A (zh) | 文本数据多层次分类方法、装置、电子设备和存储介质 | |
CN113408301A (zh) | 一种样本处理方法、装置、设备和介质 | |
CN111738009B (zh) | 实体词标签生成方法、装置、计算机设备和可读存储介质 | |
CN107506345A (zh) | 语言模型的构建方法和装置 | |
CN109308311A (zh) | 一种多源异构数据融合系统 | |
CN109657127B (zh) | 一种答案获取方法、装置、服务器及存储介质 | |
CN114861635A (zh) | 一种中文拼写纠错方法、装置、设备及存储介质 | |
CN108235126B (zh) | 在视频中插入推荐信息的方法和装置 | |
CN112241629A (zh) | 结合rpa及ai的拼音标注文本生成方法及装置 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |