一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

用于评估程序员的工作量的方法和设备与流程

2022-12-20 01:49:00 来源:中国专利 TAG:


1.本公开内容总体上涉及程序开发领域,更具体地,涉及用于评估程序员的工作量的方法和设备。


背景技术:

2.许多类型的组织,例如公司或者开源项目组织,都希望能够准确地衡量开发软件的程序员的工作量。然而,通常很难量化程序员完成了多少实质性工作。例如,通常基于字数就可以较为准确地衡量翻译人员的工作量,但是仅使用代码行数(lines of code,loc)或提交次数(numbers of commit,noc)则难以准确地衡量程序员的工作量。在本文中,“提交”是指程序员在对程序代码进行了修改之后,将修改后的代码提交到代码库的操作。
3.在诸如c/cpp、javascript等一些编程语言中对代码行的长度没有限制,一些程序员可能习惯于在一行中写较长的代码,而另一些程序员则可能习惯于在一行中写较短的代码。图1示意性地示出了不同格式的两段代码,它们的行数不同,但本质内容没有区别。此外,一些程序员可能会在一次提交中提交对于现有代码的大量更改,而另一些程序员可能在一次提交中仅修改几行代码。因此,仅基于代码行数或提交次数来评估程序员的工作量是不准确的。
4.因此,存在着对于能够准确评估程序员的工作量的方案的需求。


技术实现要素:

5.针对上述问题,本公开内容提出了能够准确地评估程序员在开发程序代码中所做出的实质性工作的方法和设备。
6.根据本公开内容的一个方面,提供了一种用于评估程序员的工作量的计算设备,包括:存储有可执行指令的存储器;以及一个或多个处理器,所述一个或多个处理器被配置为通过执行所述指令而进行以下操作:获取旧版本程序代码以及所述程序员对所述旧版本程序代码进行编辑后所生成的新版本程序代码,其中,所述旧版本程序代码和所述新版本程序代码被以相同的编程语言编写;将所述旧版本程序代码解析为第一语法树,并且将所述新版本程序代码解析为第二语法树;生成编辑脚本,所述编辑脚本包括使得所述第一语法树改变为所述第二语法树的一个或多个编辑操作;基于所述编辑脚本来确定用于评估所述程序员的工作量的得分。
7.根据本公开内容的另一个方面,提供了一种由计算机实现的用于评估程序员的工作量的方法,包括:获取旧版本程序代码以及所述程序员对所述旧版本程序代码进行编辑后所生成的新版本程序代码,其中,所述旧版本程序代码和所述新版本程序代码被以相同的编程语言编写;将所述旧版本程序代码解析为第一语法树,并且将所述新版本程序代码解析为第二语法树;生成编辑脚本,所述编辑脚本包括使得所述第一语法树改变为所述第二语法树的一个或多个编辑操作;基于所述编辑脚本来确定用于评估所述程序员的工作量的得分。
8.根据本公开内容的另一个方面,提供了一种存储有程序的非暂态计算机可读介质,所述程序在被计算机执行时使得所述计算机操作为如上所述的计算设备。
附图说明
9.附图示出了根据本公开内容的实施方式,并且提供对本公开内容的进一步理解。参照下面结合附图对各个实施方式的说明,可以更加容易地理解本公开内容的以上和其他目的、特点和优点,在附图中:
10.图1示意性地示出了不同格式的两段代码。
11.图2示意性地示出了根据本公开内容的评估方法的概念图。
12.图3a示出了用于将python程序的ast中的节点转换为uast中的节点的程序的一个简单示例。
13.图3b示意性地示出了python程序的ast中的节点class_definition的定义,并且图3c示出了用于将该节点class_definition转换为uast中的节点class的示例性程序。
14.图3d示出了用于将java程序的ast中的节点class_declaration转换为uast中的节点class的示例性程序。
15.图4示意性地示出了得分的计算以及在计算中所应用的权值。
16.图5示出了根据本公开内容的评估方法的流程图。
17.图6示出了实现本公开内容的计算机硬件的示例性配置框图。
具体实施方式
18.在下文中,将参照附图详细描述根据本公开内容的实施方式。在附图中,相同或相似的元件将由相同或相似的附图标记来表示。此外,如果有可能使本公开内容的主题不清楚,则将省略对并入本文中的已知技术的详细描述。
19.本文中使用的术语仅用于描述特定实施方式的目的,而非意图限制本公开内容。除非上下文明确指出,否则单数形式的表述也包含复数形式。此外,本文中使用的术语“包括”、“包含”和“具有”意图表示所描述的特征、实体、操作和/或部件的存在,但是并不排除一个或多个其它的特征、实体、操作和/或部件的存在或添加。
20.在下面的描述中,描述了许多具体细节以提供对本公开内容的全面理解。然而,也可以在没有一些细节或全部细节的情况下实施本公开内容。在附图中仅示出了与本公开内容的技术密切相关的部件,而省略了与本公开内容关系不大的其它细节。
21.在本公开内容中考虑两种类型的程序代码,一种是以诸如c语言或java的编程语言编写的,另一种是以诸如json或yaml的非编程语言编写的。
22.在下文中将首先针对以编程语言编写的程序代码,结合图2来描述本公开内容的技术。
23.由于程序代码通常存储在版本控制系统中,因此可以通过挖掘版本控制系统以发现原始程序代码(旧版本代码)以及程序员对原始代码进行编辑后提交的新版本代码。图2示意性地示出了新、旧版本代码。在本公开内容中,程序员对旧版本代码进行的编辑可以包括代码的添加、代码的删除以及代码的修改。对于程序员新添加的代码文件,可以假设与其对应的旧版本是一个空文件,对于程序员删除的旧代码文件,可以假设与其对应的新版本
是一个空文件。
24.然后,如图2所示,将旧版本代码和新版本代码分别解析为语法树。语法树可以是具体语法树(cst)、抽象语法树(ast)以及将在下文中描述的统一抽象语法树(uast)。在本文中将主要基于ast和uast进行描述,但明显的是,本领域技术人员可以使用其它形式的语法树来实现本公开内容的技术。
25.ast是程序代码的语法结构的一种抽象表示,它以树的形式表现代码的语法结构,树上的每个节点表示代码中的一种元素,例如字面量(literal)、变量、操作符、控制流语句等。与代码相比,ast不包含无关紧要的标点符号和分隔符(例如大括号、分号、圆括号等)。ast是本领域技术人员已知的技术。在本公开内容中,可以使用已有的开源解析器将旧代码和新代码分别解析为ast。
26.需要注意的是,针对以不同编程语言编写的代码往往需要使用不同的解析器,例如,用于解析python程序代码的解析器和用于解析java程序代码的解析器不同。由于各种编程语言具有不同的语法以及各种解析器具有不同的解析规则,因此所得到的ast的结构以及节点的类型可能不同。为了提供一种与编程语言无关的解决方案,在本公开内容中优选地将ast进一步转换为统一抽象语法树uast(unified ast)。
27.具体来说,基于预设的规则,将所得到的ast中每种类型的节点转换为根据本公开内容定义的节点。图3a示出了用于将python程序的ast中的节点while_statement转换为根据本公开内容定义的节点while的程序。这是一个简单的转换示例,其中,将节点while_statement中的字段“condition”和“body”分别转换为节点while中的“condition”和“block”字段。
28.此外,作为相对复杂的示例,图3b示意性地示出了通过解析python程序而生成的ast中的节点class_definition的定义,并且图3c示出了用于将该节点class_definition转换为根据本公开内容定义的节点class的示例性程序。如图3b和图3c所示,节点class_definition中的字段“name”、“superclasses”和“body”被分别转换为节点class中的“identifier”、“super_types”和“members”。
29.此外,图3d示出了将另一语言(java)的程序代码所对应的ast中的类似节点(例如class_declaration)也转换为根据本公开内容定义的节点class的示例性程序。也就是说,不同ast中的定义不同但实质意义相同或相似的节点可以被转换为在本公开内容中定义的同一个节点。以此方式,可以将基于不同编程语言的代码所生成的ast转换为统一的树uast。
30.在本公开内容中,针对每种编程语言所对应的ast中的每种节点类型预先设置相应的转换规则。图3a-3d中的程序提供了转换规则的一些示例,但明显的是,在本文中穷举所有的规则是不现实的,本领域技术人员可以根据实际设计要求来设计适当的转换规则。
31.根据本公开内容的uast可以代表不同编程语言之间的共同元素,诸如类、方法声明、字面量、控制流、操作符等,并且uast与编程语言的种类无关。
32.返回参见图2,在获得对应于旧版本代码的旧语法树(优选地,旧uast)和对应于新版本代码的新语法树(优选地,新uast)之后,通过树差异(tree-diff)算法来确定新、旧语法树之间的差异。作为一个示例,可以采用gumtree算法。在jean-r
é
my falleri等人的论文“fine-grained and accurate source code differencing”,自动化软件工程国际会议论
文集,2014年,瑞典韦斯特拉斯,第313-324页中描述了gumtree算法,该论文的内容通过引用而并入本文中。然而,本领域技术人员也可以采用其它适当的算法来计算该差异,本公开内容对此不作限定。
33.基于所确定的旧语法树与新语法树之间的差异来生成被称为“编辑脚本”的数据结构。如图2所示,编辑脚本描述了对语法树的节点执行的一系列编辑操作,这些编辑操作使旧语法树改变为新语法树。编辑脚本的目标是准确地反映对旧语法树所进行的更改,由此反映程序员对旧版本代码所做出的实质性更改。
34.例如,编辑脚本中可以包括以下编辑操作:
[0035]-插入:添加节点,
[0036]-删除:删除节点,
[0037]-更新:将节点的旧值替换为新值,
[0038]-移动:将节点移动到不同的父节点之下。特别地,随着节点的移动,
[0039]
该节点的所有子节点也会移动,因此该操作可以移动整个子树。
[0040]
在图2所示的编辑脚本的示例中,旧语法树中的节点n1被删除(操作e1),旧语法树中的节点n2的值被更新并且变成新语法树中的节点n4(操作e2),旧语法树中的节点n3被移动并且变成新语法树中的节点n5(操作e3),在新语法树中插入了节点n6(操作e4)。易于理解的是,编辑脚本可以包括同一类型的多个编辑操作(例如,针对3个节点的3个删除操作),也可以不包括上述编辑操作中的一种或多种(例如,不包括插入操作)。
[0041]
如上所述,编辑脚本反映对旧版本代码所做的实质性更改,因此可以基于编辑脚本来评估程序员在编写新代码时付出了多少劳动。作为一种简单的评估方法,可以根据编辑脚本中包含的编辑操作的数量来确定得分。例如,在图2所示的编辑脚本的示例中包含4个编辑操作(e1,e2,e3,e4),因此可以确定得分为4。
[0042]
此外,存在着以下情况:新版本代码是由程序员原创的程序代码,也就是说,不存在旧版本代码。在此情况下仍然可以应用图2所示的评估方法。具体来说,可以将旧版本代码假设为空代码,进而将旧语法树假设为空的语法树。然后基于旧语法树(空语法树)与新语法树之间的差异来生成编辑脚本,实质上是基于新语法树来生成编辑脚本,然后基于编辑脚本来计算得分。因此,本公开内容也适用于基于单个程序代码来评估程序员编写该程序代码所做出的工作量,而不是必须获取新、旧两个版本的程序代码才能评估程序员的工作量。
[0043]
可以基于所确定的得分来衡量程序员的工作量。得分越高,表明程序员对旧版本代码的实质性更改越多,工作量越大。在实践中,软件公司或开源项目组织可以根据该得分而向程序员提供报酬或其它形式的奖励。
[0044]
另一方面,由于整个代码文件通常很大,基于代码文件而生成的语法树也将会很大,由此导致在计算中消耗大量的计算资源。因此,更优选地,在本公开内容中以代码段为基础来执行如图2所示的过程。代码段的一个示例是函数,因为函数是代码文件的通用组成部分,并且最小的代码更改单元通常是函数。在下文中将基于函数来进行描述,然而,本公开内容中的代码段并不限于函数,本领域技术人员可以采用其它形式的代码段。
[0045]
具体来说,首先从旧版本代码中提取函数(以下称为“旧函数”),并且从新版本代码中提取函数(以下称为“新函数”),其中该新版本代码是程序员对旧版本代码进行编辑而
得到的代码。然后,确定旧函数和新函数是否对应于同一函数。如果确定旧函数和新函数是同一函数在编辑之前和之后的不同版本,则认为旧函数和新函数彼此匹配。特别地,对于添加的新函数,可以假设与它匹配的旧函数是空函数。对于被删除的旧函数,可以假设与它匹配的新函数是空函数。由此,可以获得代表新、旧版本代码之间的变化的一对或多对函数。
[0046]
针对彼此匹配的一对旧函数和新函数,可以按照图2所示的过程为它们分别构建旧语法树和新语法树,然后应用tree-diff算法以生成编辑脚本,并且基于编辑脚本来计算针对函数的得分,该得分反映程序员在更改旧函数时所做的实质性修改。以此方式针对新、旧代码文件中所有的彼此匹配的函数对计算得分,然后将所得到的针对函数的得分相加,作为针对代码文件的得分。进一步地,可以针对程序员一次提交的多个代码文件分别计算得分,然后将所得到的针对代码文件的得分相加,从而得到针对一次提交的得分。图4示意性地示出了针对函数的得分、针对代码文件的得分以及针对一次提交的得分的计算过程。基于所计算的得分能够评估程序员在更改一个函数、一个代码文件、或一次提交的多个代码文件时所做出的工作量。
[0047]
在上文中描述了根据编辑脚本中包含的编辑操作的数量来确定得分的简单评估方法。为了进一步提高评估的准确性,本公开内容还提供了基于另外的因素来调整得分的机制。具体来说,本公开内容主要基于以下机制来调整得分:
[0048]-基于编辑操作类型的加权,
[0049]-基于节点类型的加权,
[0050]-基于代码段内重复的加权,
[0051]-基于批量编辑的加权,
[0052]-基于代码段重复的加权,
[0053]-基于文件类型的加权,
[0054]-基于提交类型的得分设置。
[0055]
在下文中将结合图4来具体描述以上主要调整机制。然而,需要说明的是,在本公开内容中还可以基于语法树的深度、宽度或其它复杂度统计,或是基于节点在语法树中的位置或其它附加信息,来调整得分。
[0056]
[基于编辑操作类型的加权]
[0057]
如上文中所述,编辑操作可以包括插入、删除、更新、移动四种类型。本公开内容根据各个类型的编辑操作所对应的工作量的相对大小,对每种类型设置相应的权值。作为一个示例,创建了新内容的插入操作可以被给予较大的权值,而相对简单的删除操作可以被给予较小的权值。本领域技术人员可以基于实验或对实际情况的调查,以适当的方式为各种编辑操作设置权值。
[0058]
图4示意性地示出了在计算针对代码段(例如函数)的得分的过程中应用基于编辑操作类型的权值。再次参照图2所示的示例,如果对删除操作设置权值0.4,对更新操作设置权值0.7,对移动操作设置权值0.8,对插入操作设置权值1,则基于编辑操作e1-e4所计算的得分将是:0.4 0.7 0.8 1=2.9。
[0059]
更通常地说,可以基于以下数学式(1)来计算针对代码段的得分s:
[0060]
s=∑ew
edit_type-(1)
[0061]
其中,e表示编辑操作,w
edit_type
表示基于编辑操作的类型的权值。
[0062]
[基于节点类型的加权]
[0063]
由于语法树中的每个节点具有类型,以反映该节点表示变量名、字面量、运算符、或是更复杂的编码构造(例如循环)等等,因此在本公开内容中为每种节点类型设置相应的权值。作为一个示例,可以对变量名和运算符(诸如“《=”)设置权值“1”,对字面量(诸如“6.0”或“0”)则设置低得多的权值,例如“0.1”。此外,可以对if语句、类或其它复杂构造设置更大的权值,例如“2”。
[0064]
图4示意性地示出了在计算针对代码段的得分的过程中应用基于节点类型的权值。再次参照图2所示的示例,假设以下情况:对删除操作设置权值0.4,对更新操作设置权值0.7,对移动操作设置权值0.8,对插入操作设置权值1,并且基于节点类型对节点n1,n2,n3,n6分别设置权值0.3、0.5、1、0.9。在此情况下所计算的得分将是:0.4
×
0.3 0.7
×
0.5 0.8
×
1 1
×
0.9=2.17。
[0065]
更通常地说,可以基于以下数学式(2)来计算针对代码段的得分s:
[0066][0067]
其中,w
node_type
表示基于编辑操作所应用到的节点的类型的权值。
[0068]
[基于代码段内重复的加权]
[0069]
当程序员必须添加一系列类似的操作时,就会出现代码复制的情况。复制代码可能是处理某些情况的适当方法,但不应当对以复制的方式添加了数十个节点的程序员给予奖励。因此,在本公开内容中检查通过复制代码而实现的插入操作,并且降低这种操作的得分。
[0070]
具体来说,由于通过解析代码文件而生成的语法树有时可能非常大,因此可以针对语法树的子树来执行克隆检测算法,以检测在一个代码段(例如函数)内的重复的代码。在ira d.baxter等人的论文“clone detection using abstract syntax trees”以及hyo-sub lee等人的论文“tree-pattern-based duplicate code detection”中具体描述了克隆检测算法。通过忽略uast的叶子的值,可以找到重复的代码以及相似的代码(例如相似性大于一定阈值的代码)。
[0071]
然后,可以基于重复次数和相似性来设置重复/相似的代码所对应的的语法树节点的权值。一般来说,重复的次数越多,对重复代码所对应的节点设置的权值就越小;相似性越大,对相似代码所对应的节点设置的权值就越小。此外,在本公开内容中,如果检测出的相同或相似的代码中所包含的节点数量小于预设阈值,则可以不对该相同或相似的代码中的节点设置权值。
[0072]
图4示意性地示出了在计算针对代码段的得分的过程中应用基于代码段内重复的权值。具体来说,可以基于以下数学式(3)来计算针对代码段的得分s:
[0073]
s=∑ew
edit_type
·wnode_type
·wintra_function-(3)
[0074]
其中,w
intra_function
表示基于代码段内重复而应用于节点的权值。
[0075]
[基于批量编辑的加权]
[0076]
程序员有时一次性对一个或多个代码文件进行相同的更改,例如,对变量名或类名进行重命名、用一个函数替换另一个函数、将相同的代码添加到多个行等等。存在着很多执行批量编辑的方法,最常见的是在编辑器中使用“查找和替换”工具以及使用集成开发环
境(ide)重构工具(refactoring tool)。由于工作基本是由编辑器或ide完成的,因此不应当对于进行批量编辑的程序员给予奖励。
[0077]
在本公开内容中使用基于文本的算法在一次提交的多个代码文件中检测批量编辑。具体来说,由一对旧文本模式和新文本模式来表示编辑操作的“编辑模式”。编辑模式表示编辑操作的方式、特点等,每种编辑操作有其独特的编辑模式。识别程序员提交的每个代码文件中每一行更改的编辑模式,并且计数每种编辑模式出现的次数。如果某种编辑模式的出现次数大于预设阈值,则将该种编辑模式确定为“批量编辑”。
[0078]
在检测到批量编辑后,可以根据该种编辑模式出现的次数来设置权值,并且将权值设置给以下代码所对应的语法树节点:该代码由于被确定为批量编辑的编辑操作而发生更改。一般来说,某一编辑模式的出现次数越多,对相应的语法树节点设置的权值就越小。
[0079]
图4示意性地示出了在计算针对代码段的得分的过程中应用基于批量编辑的权值。具体来说,可以基于以下数学式(4)来计算针对代码段的得分s:
[0080]
s=∑ew
edit_type
·wnode_type
·wintra_function
·wbulk_editing-(4)
[0081]
其中,w
bulk_editing
表示基于批量编辑而应用于节点的权值。
[0082]
以上已经通过数学式(1)-(4)描述了计算针对代码段的得分的具体方法。然而,需要说明的是,本公开内容并不限于此,而是可以基于权值以另外的方法来计算得分。例如,数学式(1)-(4)中的每个权值可以被替换为该权值的多次方。本领域技术人员可以根据实际情况而设计出适合的计算方法。
[0083]
[基于代码段重复的加权]
[0084]
程序员还经常会从项目的其它部分或从因特网上可用的免费开源项目获得代码,甚至是整个函数,并且将获取的函数复制到当前正在开发的程序中。显然不应当对程序员的这种复制操作给予奖励。因此,本公开内容检查程序员所提交的代码段(例如函数)是否与组织所拥有的代码库或其它代码库(例如开源项目)中的现有代码段(例如函数)重复。
[0085]
可以基于所提交的函数和现有函数各自对应的语法树之间的相似度来检测重复的函数。另一方面,考虑到为各种代码库中存储的所有代码创建语法树需要巨大的工作量,因此也可以基于代码本身来检测重复的函数,也就是说,基于函数的文本相似度来检测重复的函数。
[0086]
对于程序员所提交的每个新添加的函数,如果检测到它与代码库中存在的已知函数相同或相似(例如,与已知函数的相似度大于一定阈值),则根据新添加的函数与已知函数之间的相似度来确定权值,并且将该权值设置给该新添加的函数。作为一个示例,可以将权值w设置为w=1-s,其中,s表示相似度。
[0087]
图4示意性地示出了在计算针对代码文件的得分的过程中应用基于代码段重复的权值。具体来说,在通过将针对各个代码段的得分进行相加来获得针对代码文件的得分的过程中,将针对新添加的代码段的得分乘以如上所述的权值,然后将加权后的得分与其它代码段的得分进行相加,以获得针对代码文件的得分。
[0088]
[基于文件类型的加权]
[0089]
在一个项目中,通常并非所有的代码文件都是由开发人员手动创建的,例如,有些文件是由开发工具自动生成的。此外,并不是所有类型的代码文件的编写都需要同样的工作量,例如,java pojo文件看起来像一个普通的类,但相比于其它的类文件,java pojo文
件的编写(手动或使用模板)要容易得多。在本公开内容中,对于自动生成的文件可以将得分直接设置为“0”,因为它们不是由程序员编写的。此外,对于特定类型的代码文件(例如java pojo文件),可以对该文件设置较小的权值。本领域技术人员可以根据对实际情况的调查而决定针对哪些类型的代码文件设置小的权值。
[0090]
图4示意性地示出了在计算针对提交的得分的过程中应用基于文件类型的权值。具体来说,将针对每个文件的得分乘以如上所述的权值,然后将加权后的得分相加,以获得针对提交的得分。
[0091]
[基于提交类型的得分设置]
[0092]
根据程序员提交代码的特征,本公开内容限定了以下提交类型,并且针对每种类型的提交设置了得分。
[0093]-恢复(revert)
[0094]
·
这种类型例如可以是git中的恢复提交,git是一种分布式版本控制系统。由于这种提交是由git操作创建的,程序员没有付出劳动,因此本公开内容将针对这种提交的得分设置为“0”。
[0095]-挑选(cherry-pick)
[0096]
·
这种类型例如可以是git中的挑选提交。由于这种提交也是由git操作创建的,因此本公开内容将针对这种提交的得分设置为“0”。
[0097]-合并(merge):
[0098]
.这种类型例如可以是git中的合并提交。由于这种提交也是由git操作创建的,因此本公开内容将针对这种提交的得分设置为“0”。
[0099]-改良的挑选(modified cherry-pick)
[0100]
.这种类型是在git中的挑选的基础上进行小的修改而创建的提交。本公开内容根据这种提交与git中的挑选提交的相似性来降低针对这种提交的得分。
[0101]-大量插入(large insertion)
[0102]
.这种类型是添加了大量代码的提交。由于所添加的大量代码通常是从其它来源复制的,在本公开内容中将这种类型的提交视为异常提交,并且针对异常提交的得分被设置为“0”。作为一个示例,当添加的代码的行数超过预定阈值(例如10000行)时,可以将该提交视为异常提交。
[0103]-大量删除(large deletion)
[0104]
.这种类型是删除了大量代码的提交。在本公开内容中将这种类型的提交视为异常提交,并且将其得分设置为“0”。作为一个示例,当删除的代码的行数超过预定阈值(例如10000行)时,可以将该提交视为异常提交。
[0105]
除上述之外,在本公开内容中还可以手动地将特定类型的提交加入黑名单中,被加入黑名单的提交的得分被设置为“0”。容易理解的是,本领域技术人员可以根据实际需要建立这样的黑名单。
[0106]
图4示意性地示出了在计算针对提交的得分时根据提交的类型来设置得分。
[0107]
需要说明的是,本领域技术人员可以根据实际设计要求而选择性地使用本公开内容中所提供的多种权值中的任何一种或多种。
[0108]
以上已经针对以编程语言编写的代码描述了根据本公开内容的技术,其中主要利
用了新、旧语法树之间的差异。对于以非编程语言(诸如json、yaml、xml、html、markdown、makefile等)编写的程序代码而言,由于无法根据它们构建语法树,因此基于代码行数(loc)来评估程序员的工作量。然而,不同于仅使用代码行数的常规方法,在本公开内容中可以根据以每种非编程语言编写程序的难易程度来预先为各种语言设置不同的权值,然后将发生更改的代码的行数乘以该权值,所得到的值被用于评估程序员的工作量。此外,在本公开内容中还可以确定发生更改的代码是“被添加”还是“被删除”,并且可以对所添加的代码行数应用比所删除的代码行数更大的权值。以此方式,针对非编程语言的代码,本公开内容也提供了更加准确地评估程序员的工作量的方法。
[0109]
以下将结合图5来描述根据本公开内容的评估方法的流程图。
[0110]
如图5所示,在步骤s510获取旧版本程序代码和新版本程序代码,其中新版本程序代码是由程序员对旧版本程序代码进行编辑而生成的。
[0111]
在步骤s520,将旧版本程序代码解析为第一语法树,并且将新版本程序代码解析为第二语法树。
[0112]
在步骤s530,基于第一语法树和第二语法树之间的差异生成编辑脚本,该编辑脚本包括使得第一语法树改变为第二语法树的一个或多个编辑操作。
[0113]
在步骤s540,基于编辑脚本来确定用于评估程序员的工作量的得分。可以基于编辑脚本中包括的编辑操作的数量来确定该得分。更优选的是,基于编辑操作以及上文中所描述的一个或多个权值来计算得分,以实现更准确的评估。
[0114]
在上述实施例中描述的方法可以由软件、硬件或者软件和硬件的组合来实现。包括在软件中的程序可以事先存储在设备的内部或外部所设置的存储介质中。作为一个示例,在执行期间,这些程序被写入随机存取存储器(ram)并且由处理器(例如cpu)来执行,从而实现在本文中描述的各种处理。
[0115]
图6示出了根据程序执行本公开内容的方法的计算机硬件的示例配置框图,该计算机硬件是根据本公开内容的用于评估程序员的工作量的计算设备的一个示例。
[0116]
如图6所示,在计算机600中,中央处理单元(cpu)601、只读存储器(rom)602以及随机存取存储器(ram)603通过总线604彼此连接。
[0117]
输入/输出接口605进一步与总线604连接。输入/输出接口605连接有以下组件:以键盘、鼠标、麦克风等形成的输入单元606;以显示器、扬声器等形成的输出单元607;以硬盘、非易失性存储器等形成的存储单元608;以网络接口卡(诸如局域网(lan)卡、调制解调器等)形成的通信单元609;以及用于驱动可移除介质611的驱动器610,该可移除介质611例如是磁盘、光盘、磁光盘或半导体存储器。
[0118]
在具有上述结构的计算机中,cpu 601将存储在存储单元608中的程序经由输入/输出接口605和总线604加载到ram 603中,并且执行该程序,以便执行上文中描述的方法。
[0119]
要由计算机(cpu 601)执行的程序可以被记录在作为封装介质的可移除介质611上,该封装介质以例如磁盘(包括软盘)、光盘(包括压缩光盘-只读存储器(cd-rom))、数字多功能光盘(dvd)等)、磁光盘、或半导体存储器来形成。此外,要由计算机(cpu 601)执行的程序也可以经由诸如局域网、因特网、或数字卫星广播的有线或无线传输介质来提供。
[0120]
当可移除介质611安装在驱动器610中时,可以将程序经由输入/输出接口605安装在存储单元608中。另外,可以经由有线或无线传输介质由通信单元609来接收程序,并且将
程序安装在存储单元608中。可替选地,可以将程序预先安装在rom 602或存储单元608中。
[0121]
由计算机执行的程序可以是根据本说明书中描述的顺序来执行处理的程序,或者可以是并行地执行处理或当需要时(诸如,当调用时)执行处理的程序。
[0122]
本文中所描述的单元或装置仅是逻辑意义上的,并不严格对应于物理设备或实体。例如,本文所描述的每个单元的功能可能由多个物理实体来实现,或者,本文所描述的多个单元的功能可能由单个物理实体来实现。此外,在一个实施例中描述的特征、部件、元素、步骤等并不局限于该实施例,而是也可以应用于其它实施例,例如替代其它实施例中的特定特征、部件、元素、步骤等,或者与其相结合。
[0123]
本公开内容的范围不限于在本文中描述的具体实施例。本领域普通技术人员应该理解的是,取决于设计要求和其他因素,在不偏离本发明的原理和精神的情况下,可以对本文中的实施例进行各种修改或变化。本发明的范围由所附权利要求及其等同方案来限定。
[0124]
此外,本公开内容还可以包括以下实现方式。
[0125]
(1)一种用于评估程序员的工作量的计算设备,包括:
[0126]
存储有可执行指令的存储器;以及
[0127]
一个或多个处理器,所述一个或多个处理器被配置为通过执行所述指令而进行以下操作:
[0128]
获取旧版本程序代码以及所述程序员对所述旧版本程序代码进行编辑后所生成的新版本程序代码,其中,所述旧版本程序代码和所述新版本程序代码被以相同的编程语言编写;
[0129]
将所述旧版本程序代码解析为第一语法树,并且将所述新版本程序代码解析为第二语法树;
[0130]
生成编辑脚本,所述编辑脚本包括使得所述第一语法树改变为所述第二语法树的一个或多个编辑操作;
[0131]
基于所述编辑脚本来确定用于评估所述程序员的工作量的得分。
[0132]
(2).根据(1)所述的计算设备,其中,所述处理器还被配置为通过挖掘版本控制系统来获取所述旧版本程序代码和所述新版本程序代码。
[0133]
(3).根据(1)所述的计算设备,其中,所述第一语法树是第一抽象语法树ast,所述第二语法树是第二ast,并且其中,所述第一ast和所述第二ast的树结构和节点类型随着所述编程语言的改变而发生改变。
[0134]
(4).根据(3)所述的计算设备,其中,所述处理器还被配置为基于预设的规则,将所述第一ast和所述第二ast分别转换为第一统一抽象语法树uast和第二uast,并且其中,所述第一uast和所述第二uast的树结构和节点类型不随着所述编程语言的改变而发生改变。
[0135]
(5).根据(1)所述的计算设备,其中,所述处理器还被配置为确定所述第一语法树和所述第二语法树之间的差异,并且基于所述差异来生成所述编辑脚本。
[0136]
(6).根据(1)所述的计算设备,其中,所述处理器还被配置为基于所述编辑脚本中包括的编辑操作的数量来确定所述得分。
[0137]
(7).根据(1)所述的计算设备,其中,所述编辑脚本中包括的编辑操作是以下类型中的至少一种:用于添加节点的插入操作,用于删除节点的删除操作,用于将节点的旧值替
换为新值的更新操作,用于将节点移动到不同的父节点之下的移动操作。
[0138]
(8).根据(7)所述的计算设备,其中,在所述旧版本程序代码和所述新版本程序代码对应于单个代码段的情况下,所确定的得分是用于评估所述程序员编辑单个代码段的工作量的得分。
[0139]
(9).根据(8)所述的计算设备,其中,所述处理器还被配置为基于所述编辑脚本中包括的编辑操作以及以下权值中的至少一个来确定针对单个代码段的得分:基于编辑操作的类型的权值,基于节点的类型的权值,基于所述单个代码段内重复的代码的权值,基于批量编辑的权值。
[0140]
(10).根据(8)所述的计算设备,其中,在所述旧版本程序代码和所述新版本程序代码对应于单个代码文件、并且所述单个代码文件包括多个代码段的情况下,所述处理器还被配置为将针对所述多个代码段分别确定的得分相加,以获得用于评估所述程序员编辑单个代码文件的工作量的得分。
[0141]
(11).根据(10)所述的计算设备,其中,所述处理器还被配置为检测所述新版本程序代码中新添加的代码段是否与已知代码段相同或相似,并且将基于相似性的权值应用于针对所述新添加的代码段确定的得分,以计算针对单个代码文件的得分。
[0142]
(12).根据(10)所述的计算设备,其中,在所述旧版本程序代码和所述新版本程序代码对应于所述程序员一次提交的多个代码文件的情况下,所述处理器还被配置为将针对所述多个代码文件分别确定的得分相加,以获得用于评估所述程序员编辑所述多个代码文件的工作量的得分。
[0143]
(13).根据(12)所述的计算设备,其中,所述处理器还被配置为将基于代码文件的类型的权值应用于针对相应代码文件确定的得分,以计算针对所述多个代码文件的得分。
[0144]
(14).根据(12)所述的计算设备,其中,所述处理器还被配置为基于由所述程序员进行的提交的类型,来设置针对所提交的多个代码文件的得分。
[0145]
(15).根据(1)所述的计算设备,其中,如果所述旧版本程序代码和所述新版本程序代码被以相同的非编程语言编写,则所述处理器被配置为:确定所述新版本程序代码相对于所述旧版本程序代码发生更改的代码的行数;以及基于所确定的发生更改的代码的行数来评估所述程序员的工作量。
[0146]
(16).根据(15)所述的计算设备,其中,所述处理器还被配置为将所确定的发生更改的代码的行数乘以权值,并且基于加权后的代码行数来评估所述程序员的工作量,并且其中,所述权值基于以下中的至少一个:以所述非编程语言编写程序代码的难易程度,所述发生更改的代码被更改的方式。
[0147]
(17).根据(1)所述的计算设备,其中,所述处理器还被配置为在所述新版本程序代码是由所述程序员新创建的程序代码的情况下,将所述旧版本程序代码设置为空的程序代码,并且将所述第一语法树设置为空的语法树,基于所述空的语法树和所述第二语法树之间的差异来生成编辑脚本,以及基于所述编辑脚本来确定用于评估所述程序员创建所述新版本程序代码的工作量的得分。
[0148]
(18)一种由计算机实现的用于评估程序员的工作量的方法,包括:
[0149]
获取旧版本程序代码以及所述程序员对所述旧版本程序代码进行编辑后所生成的新版本程序代码,其中,所述旧版本程序代码和所述新版本程序代码被以相同的编程语
言编写;
[0150]
将所述旧版本程序代码解析为第一语法树,并且将所述新版本程序代码解析为第二语法树;
[0151]
生成编辑脚本,所述编辑脚本包括使得所述第一语法树改变为所述第二语法树的一个或多个编辑操作;
[0152]
基于所述编辑脚本来确定用于评估所述程序员的工作量的得分。
[0153]
(19).根据(18)所述的方法,还包括:通过挖掘版本控制系统来获取所述旧版本程序代码和所述新版本程序代码。
[0154]
(20).根据(18)所述的方法,其中,所述第一语法树是第一抽象语法树ast,所述第二语法树是第二ast,并且其中,所述第一ast和所述第二ast的树结构和节点类型随着所述编程语言的改变而发生改变。
[0155]
(21).根据(20)所述的方法,还包括:基于预设的规则,将所述第一ast和所述第二ast分别转换为第一统一抽象语法树uast和第二uast,其中,所述第一uast和所述第二uast的树结构和节点类型不随着所述编程语言的改变而发生改变。
[0156]
(22).根据(18)所述的方法,还包括:确定所述第一语法树和所述第二语法树之间的差异,并且基于所述差异来生成所述编辑脚本。
[0157]
(23).根据(18)所述的方法,还包括:基于所述编辑脚本中包括的编辑操作的数量来确定所述得分。
[0158]
(24).根据(18)所述的方法,其中,所述编辑脚本中包括的编辑操作是以下类型中的至少一种:用于添加节点的插入操作,用于删除节点的删除操作,用于将节点的旧值替换为新值的更新操作,用于将节点移动到不同的父节点之下的移动操作。
[0159]
(25).根据(24)所述的方法,其中,在所述旧版本程序代码和所述新版本程序代码对应于单个代码段的情况下,所确定的得分是用于评估所述程序员编辑单个代码段的工作量的得分。
[0160]
(26).根据(25)所述的方法,还包括:基于所述编辑脚本中包括的编辑操作以及以下权值中的至少一个来确定针对单个代码段的得分:基于编辑操作的类型的权值,基于节点的类型的权值,基于所述单个代码段内重复的代码的权值,基于批量编辑的权值。
[0161]
(27).根据(25)所述的方法,还包括:在所述旧版本程序代码和所述新版本程序代码对应于单个代码文件、并且所述单个代码文件包括多个代码段的情况下,将针对所述多个代码段分别确定的得分相加,以获得用于评估所述程序员编辑单个代码文件的工作量的得分。
[0162]
(28).根据(27)所述的方法,还包括:检测所述新版本程序代码中新添加的代码段是否与已知代码段相同或相似,并且将基于相似性的权值应用于针对所述新添加的代码段确定的得分,以计算针对单个代码文件的得分。
[0163]
(29).根据(27)所述的方法,还包括:在所述旧版本程序代码和所述新版本程序代码对应于所述程序员一次提交的多个代码文件的情况下,将针对所述多个代码文件分别确定的得分相加,以获得用于评估所述程序员编辑所述多个代码文件的工作量的得分。
[0164]
(30).根据(29)所述的方法,还包括:将基于代码文件的类型的权值应用于针对相应代码文件确定的得分,以计算针对所述多个代码文件的得分。
[0165]
(31).根据(29)所述的方法,还包括:基于由所述程序员进行的提交的类型,来设置针对所提交的多个代码文件的得分。
[0166]
(32).根据(18)所述的方法,还包括:如果所述旧版本程序代码和所述新版本程序代码被以相同的非编程语言编写,则确定所述新版本程序代码相对于所述旧版本程序代码发生更改的代码的行数,并且基于所确定的发生更改的代码的行数来评估所述程序员的工作量。
[0167]
(33).根据(32)所述的方法,还包括:将所确定的发生更改的代码的行数乘以权值,并且基于加权后的代码行数来评估所述程序员的工作量,其中,所述权值基于以下中的至少一个:以所述非编程语言编写程序代码的难易程度,所述发生更改的代码被更改的方式。
[0168]
(34).根据(18)所述的方法,还包括:在所述新版本程序代码是由所述程序员新创建的程序代码的情况下,将所述旧版本程序代码设置为空的程序代码,并且将所述第一语法树设置为空的语法树,基于所述空的语法树和所述第二语法树之间的差异来生成编辑脚本,以及基于所述编辑脚本来确定用于评估所述程序员创建所述新版本程序代码的工作量的得分。
[0169]
(35).一种存储有程序的非暂态计算机可读介质,所述程序在被计算机执行时使得所述计算机操作为(1)-(17)中任一项所述的计算设备。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献