论文部分内容阅读
为了吸引更多开发者或是支持不同的平台,开源项目组织或商业公司倾向于采用多种语言实现他们的项目。研究表明,大约有33%的开源项目存在多种语言版本。在这些多语言项目中,开发者需要维护不同版本间的一致性。他们需要在不同版本上实现相同的功能或是修复同一个缺陷,这会产生大量功能相似的代码,这样的代码片段被称为跨语言的代码克隆。代码克隆增加了软件开发和维护的成本。例如,当某个克隆片段被修改,与之相关的代码克隆都可能需要同样的修改。然而,在多语言项目中避免克隆代码是非常困难的。因此,跨语言的代码克隆检测是多语言软件项目维护中的重要部分。但是,现有的工具大多只能检测同一种语言的克隆,无法有效检测如Java和C#之间存在的跨语言克隆。传统的代码检测工具如DECKARD、CCFinder、CP-Miner等,只能够检测在同一种语言上存在的代码克隆,而C2D2这样的跨语言代码克隆工具,由于他们的工具基于.NET的通用中间语言(CIL),仅能提供基于CIL语言间的跨语言克隆检测,无法检测无中间语言的跨语言克隆代码。代码变更相似性指的是在代码的历史变更中,存在的实现相同功能或是修复相似缺陷的代码变更片段。在多语言项目中,存在大量针对同一任务的相似代码变更,这些代码变更片段反映了开发者维护多语言项目的变更一致性,而这样的一致性也产生了大量跨语言的代码克隆。因此,跨语言的代码克隆可以通过检测代码变更的相似性得到。全文检索技术是一种将文档中所有文本与搜索项匹配的文字资料检索技术,通常用于纯文本文件的信息检索,而在开源项目的代码片段中,通过去除关键字、停用词和转换API接口等一系列方法,能够将代码片段中有意义的变量和方法命名作为全文检索的输入,从而实现代码片段的搜索与匹配。本文结合代码变更相似性和全文检索技术,提出了一套新的检测不同平台间跨语言克隆代码的方法。该方法通过分析项目历史变更中存在的变更相似代码,比较变更片段的相似程度,利用全文检索技术进行代码匹配,较好地解决了现有克隆检测技术无法实现的跨语言代码问题,因此能够有效检测出不同平台的跨语言代码克隆。本文基于Elasticsearch搜索引擎实现了一个跨语言克隆检测系统——DiffMatcher。本文在开源项目ANTLR和FpML上进行了实验评估,实验表明DiffMatcher能够有效检测出Java和C#项目中存在的部分代码克隆,达到了预期工作目标。本文的贡献主要有以下几点:1)分析了现有的代码克隆检测工具的优点和不足,提出了传统克隆检测工具在检测跨语言克隆代码时的问题。2)首次提出了代码变更相似性的概念,将跨语言代码克隆检测问题转换为代码变更相似性比较的问题。利用全文检索技术,有效解决了跨语言克隆检测中存在的代码差异问题和匹配问题。3)根据本文所提出的方法,实现了一个跨语言克隆检测系统,该系统基于Elasticsearch搜索引擎。4)选取了合适的开源项目作为实验的评估程序,验证了本文所提出的检测方法的有效性。