基于编辑距离的源代码相似度度量方法技术

技术编号:2915024 阅读:431 留言:0更新日期:2012-04-11 18:40
本发明专利技术提供一种基于编辑距离的源代码相似度度量方法,包括:输入第一源代码块和第二源代码块;识别第一源代码块和第二源代码块中的符号;判断所述符号的类型,根据所述类型设置相应的增加值;逐一比较第一源代码块与第二源代码块中的符号,利用编辑距离公式采用动态规划法计算编辑距离,得出相似度度量值,其中所述编辑距离公式被定义,以使得第一源代码块与第二源代码块的编辑距离取决于所述符号、对所述符号的编辑操作以及所述符号对应的增加值。利用本发明专利技术所提供的方法,可以在进行源代码相似度度量或源代码相似性判断时,提供更高的精确度。

【技术实现步骤摘要】

本专利技术涉及源代码相似度度量方法,更具体而言,涉及基于编辑距离的源代码相似度度量方法
技术介绍
随着软件行业的高速发展,常常会出现源代码复用,也就是对已有的源代码进行拷贝并粘贴到新的上下文环境中,并且为了适应新的上下文环境,而对原有的源代码进行少量的修改。为了判断源代码的复用率,常常需要度量这两块源代码的相似度,也就是判断这两块源代码的相似性。目前,业界通常利用传统的编辑距离方法来计算源代码之间的编辑距离,从而给出相似度的度量值。在此,所述编辑距离是指将字符串s1和字符串s2变成相同字符串而需要进行:(1)把字符串s1中的字符ch1替换成字符串s2中的字符ch2或相反操作;(2)删除字符串s1中的字符ch1或删除字符串s2中的字符ch2以及(3)向字符串s1中插入字符ch2或向字符串s2中插入字符ch1这三种操作的最小次数。然而,这种传统的编辑距离方法中的三种编辑操作均是针对字符,并且对于任意字符使用三种编辑操作之一时,均是累加一次编辑次数,从未考虑到源代码特有的词法和语法结构,因此在判断源代码的相似性或度量源代码的相似度时,所给出的判断或度量的精确度很低。例如对一段源代码进行几个关键字的修改以及进行几个变量名的修改,尽管前者的修改会对程序的功能造成更大的影响,然而传统的编辑距离方法对这两种修改后的源代码与原有源代码相比后所给出的编辑距离是相同的。由此,当用户利用这种编辑距离进行源代码相似度度量或源代码相似性判断时,会得出一些不正确的结论,尤其是当原有的源代码被通过非正当手段进行复用,也就是被剽窃而需要精确地确定源代码的相似度时,这种传统的编辑距离方法无法满足精确度的需求。因此,需要一种能够针对源代码特有的词法和语法结构,在进行源代-->码相似度度量或源代码相似性判断时,能提供更高精确度的基于编辑距离的源代码相似度度量方法。
技术实现思路
本专利技术的目的是针对利用传统的编辑距离方法进行源代码相似度度量时产生度量精确度不高的问题,而提供一种针对源代码特有的词法和语法结构,在进行源代码相似度度量或源代码相似性判断时,能提供更高的精确度的改进的基于编辑距离的源代码相似度度量方法。本专利技术提供一种基于编辑距离的源代码相似度度量方法,包括:输入第一源代码块和第二源代码块;识别第一源代码块和第二源代码块中的符号;判断所述符号的类型,根据所述类型设置相应的增加值;逐一比较第一源代码块与第二源代码块中的符号,利用编辑距离公式采用动态规划法计算编辑距离,得出相似度度量值,其中所述编辑距离公式被定义,以使得第一源代码块与第二源代码块的编辑距离取决于所述符号、对所述符号的编辑操作以及所述符号对应的增加值。利用本专利技术所提供的方法,可以在进行源代码相似度度量或源代码相似性判断时,提供更高的精确度。附图说明为了更好地理解本专利技术,下面结合附图仅以举例的方式对本专利技术的实施方案作详细说明,其中:图1示出了根据本专利技术的一个实施方案计算编辑距离的流程图。具体实施方式在下面描述中,为说明起见,描述了很多具体细节以便全面理解本专利技术的实施方案。然而,对于本领域的技术人员来说,显而易见的是本专利技术可不采用这些具体细节进行实施。在本说明书中以及随后的权利要求书中,将涉及到若干术语,这些术语将被定义具有下述含义。符号(token):一个程序设计语言的基本语法符号。关键字:也称基本字,如PASCAL语言中的begin、end、if、while-->和var等。标识符:用来表示各种名字,如常量名、变量名和过程名等。字面量:各种类型的常数,如25、3.1415、TRUE和“ABC”等。访问修饰符:可以限制类和结构,以便只有声明它们的程序或命名空间才能使用它们的符号,如private、static、public、this和const等。其它:不属于关键字、标识符、字面量和访问修饰符的其他符号,如运算符、界符等。基于上文所述,已知判断两个字符串s1和字符串s2的差别,可以通过计算这两个字符串之间的编辑距离来实现。虽然上文已经介绍了编辑距离,但是为了更加清楚地理解编辑距离,此处将通过公式的形式,对编辑距离进行定义。假设d(s1,s2)表示字符串s1和s2的编辑距离,″表示一个空字符串,ch1和ch2分别表示串s1和s2中的字符,|s|表示字符串s的长度,则编辑距离的计算满足以下定义:d(″,″)=0    (1),d(s,″)=d(″,s)=|s|    (2),d(s1+ch1,s2+ch2)=      min(d(s1,s2)+ifch1=ch2 then 0 else 1,//修改操作      d(s1+ch1,s2)+1,       //插入操作      d(s1,s2+ch2)+1)        //删除操作            (3)。本专利技术所述的编辑距离对上述编辑距离进行了改进,其中d(cs1,cs2)表示源代码块cs1和cs2的编辑距离,″表示一个空源代码块,tc1和tc2分别表示源代码块cs1和cs2中的符号,|cs|表示源代码块cs的长度(即源代码块cs中符号的个数),score表示符号所对应的增加值,则本专利技术所述的编辑距离满足以下定义:d(″,″)=0      (1),d(cs,″)=d(″,cs)=|cs|     (2),d(s1+tc1,s2+tc2)=  min(d(cs1,cs2)+if tc1=tc2 then 0 else score,//修改操作      d(cs1+tc1,cs2)+score,     //插入操作      d(cs1,cs2+tc2)+score)      //删除操作         (3)。-->在上文中已经简单介绍了传统的编辑距离方法,在此,将通过举例的方式利用伪代码对此作进一步的说明,以便更好地理解本专利技术。作为例子,用动态规划法来计算两个源代码块f1和f2的编辑距离,即相似度值。首先,传统的编辑距离方法:输入:源代码块f1,源代码块f2输出:f1,f2的相似度值computeSimilarity(f1,f2){     len_f1=源代码块f1中的字符个数     len_f2=源代码块f2中的字符个数     //d[i][j]表示f1中的字符1至字符i和f2中的字符1至字符j之间的编辑距离     d[0][0]=0;     for(int i=0;i<len_f1;i++)          d[i+1][0]=d[i][0];     for(int j=0;j<len_f2;j++)          d[0][j+1]=d[0][j];     for(int i=0;i<len_f1;i++){          for(intj=0;j<len_f2;j++){             float d1,d2,d3;             if(f1的第i个字符与f2的第j个字符相等)                 d1=d[i][j];//无需任何编辑操作             else                 d1=d[i][j]+1;//修改             d2本文档来自技高网
...

【技术保护点】
一种基于编辑距离的源代码相似度度量方法,包括: 输入第一源代码块和第二源代码块; 识别第一源代码块和第二源代码块中的符号; 判断所述符号的类型,根据所述类型设置相应的增加值; 逐一比较第一源代码块与第二源代码块中的符号,利用编辑距离公式采用动态规划法计算编辑距离,得出相似度度量值, 其中所述编辑距离公式被定义,以使得第一源代码块与第二源代码块的编辑距离取决于所述符号、对所述符号的编辑操作以及所述符号对应的增加值。

【技术特征摘要】
1.一种基于编辑距离的源代码相似度度量方法,包括:输入第一源代码块和第二源代码块;识别第一源代码块和第二源代码块中的符号;判断所述符号的类型,根据所述类型设置相应的增加值;逐一比较第一源代码块与第二源代码块中的符号,利用编辑距离公式采用动态规划法计算编辑距离,得出相似度度量值,其中所述编辑距离公式被定义,以使得第一源代码块与第二源代码块的编辑距离取决于所述符号、对所述符号的编辑操作以及所述符号对应的增加值。2.根据权利要求1所...

【专利技术属性】
技术研发人员:李虎曹羽中刘超金茂忠
申请(专利权)人:北京航空航天大学
类型:发明
国别省市:11[中国|北京]

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

1