论文部分内容阅读
开源软件迅速发展,产生了大量优秀的软件制品,这些软件制品不仅被广泛应用到各个开源项目中,在商业领域也有越来越多的应用。一方面,开源软件所积累的大量软件制品为人们提供了良好的研究素材。另一方面,开源软件一般由自由贡献者创作,相比商业组织的有偿招募,严密组织,它提供了一种新颖的软件开发方法。因而,人们广泛研究开源软件的生产过程和演化过程以帮助提高软件生产效率和产品质量。代码演化研究是其中的一个重要方面,它能够帮助人们更好地理解软件各模块及其组合关系的演变过程,还有助于对各种遗产软件的理解和维护,以及帮助探索软件开发的最佳实践等。 鉴于版本控制系统(Version Control System,VCS)记录了代码的创建、修改、分支等事件,近年来人们普遍通过挖掘VCS记录的历史数据来回答代码演化相关的研究问题。然而,目前的代码演化研究大多针对单个或几个工程的小数据源,而且往往不考虑工程问的代码复用等情况,因而所得结果的有效性比较有限。面向包含多种版本控制系统以及成千上万工程的大数据源的数据提取、过滤、分析和代码演化历史的追踪是目前软件工程研究者和实践者面临的一个很大的挑战。 本文尝试应对上述挑战,提出一种大数据源中代码演化历史的追踪方法。通常,人们把开发过程中产生的源代码和配置文件等称为代码数据,代码数据的创建、修改、分支、复用等事件构成了其演化历史。代码演化历史包含三个非常重要的方面:第一,在版本控制系统中,代码(文件或目录)的各个版本是如何迭代的。第二,代码在工程内部或工程间是怎样复用的。第三,工程各版本的代码文件的组织结构如何。本文面向大数据源回答上述三个问题,其难点在于:首先,本文面向大量的版本控制系统和其中存储的数万个工程,建立一个统一的模型来表示其中的代码演化过程比较困难。另外,各版本控制系统有其特定的数据存储格式,与它们交互获取所需的数据有一定难度。最后,利用现有的算法和硬件平台分析数亿个文件的版本迭代和复用关系也是一大难点。 针对上述问题和挑战,本文提出了代码演化图模型来表示代码的演化过程,并在此基础上设计和实现了一个代码演化历史追踪工具。该方法收集代码演变历史中的各种数据,跟踪代码的各种演化事件,并将这些数据和事件抽象为代码演化图中的顶点和边。本文关注的代码版本迭代、复用情况和组织结构等三方面内容都能够通过模型中不同类型的顶点和边等元素来表示。演化图模型屏蔽了各种版本控制系统中的细节,提供了代码演化相关的统一视图,使得对代码演化过程中的各种事件的检索抽象成为了在该图上的遍历等操作。 本文的主要贡献在于设计了一个代码演化追踪工具,该工具能够提供一种重现代码演化历史的方法,能够追踪每一个源文件的版本迭代历史,能够建立不同开源工程间代码复用的关系,能够获取代码在每一个演化关键点的组织结构。在此基础上,该工具可以服务于很多研究目标,比如利用演化图中的提交信息度量开发者的生产效率;利用代码演化图中的复用信息度量开源工程的影响力;利用代码演化图探索源代码的模块结构演变过程等等。