本文是一篇计算机软件论文,本文研究了基于程序分析和自然语言处理的注释定位技术,首先介绍在注释方法的研究工作,比如注释生成、注释传播、注释分类等。然后介绍了本文所做工作使用的技术,也就是深度学习、程序分析和注解系统 OneDev。之后介绍了我们注释分类的实现方法,还有使用注释分类器对现有方法级别的注释进行分类,使用注释定位模型进行定位。本文并没有生成新的注释,而是利用现有注释定位到具体的实现代码中,并且使用注解系统进行实现,不会破坏原有的代码结构,实现注释的重定位。
第一章 绪论
1.1 研究背景及意义
随着互联网的高速发展,软件已经被广泛的应用在生活中的各个方面,成为我们生活中必不可少的一部分,众多开发人员在软件开发过程中贡献了大量优秀的代码。这些代码是与自然语言具有不同结构和语法的语言,比较难以理解。伴随着软件开发过程的不断复杂化,软件开发人员在开发和维护代码时需要理解代码的功能。开发人员在编写和阅读代码时通常会添加代码注释,来提高源代码的可读性和可理解性。一个项目的开发通常需要多位开发人员的共同协作,开发人员通常会遇到需要调用其他开发人员编写的代码的情况。所以在代码中编写代码注释就显得尤为重要,可以帮助开发人员理解代码的主要功能。在项目交接的过程中也需要理解项目源代码的功能,通过阅读源代码中的注释可以更快的理解源代码的功能,加快维护人员理解代码的速度[8],减少了项目维护的难度。注释与源代码相比,注释是使用自然语言进行编写的。相对代码而言,开发人员可以更快的理解自然语言多表达的意图。注释除了可以帮助开发人员更快理解代码的功能之外,还可以通过分析代码注释和源代码之间的关系,缩小它们之间的差距,来帮助分析代码的行为[10][11]。但是在开发工程中,由于编写高质量的注释需要花费大量的时间和精力,所以开发人员倾向不编写注释,或者编写只适合于自己理解的注释[9],不符合注释编写的规范。比如注释编写的位置和其具体的代码是分离的,不能确定注释描述的是哪一段代码。注释的质量依赖于开发人员的水平,质量差的注释通常会使维护的时间成本增加,而且,如果项目中出现问题时会导致排查的时间增加。目前通过现有的注释编写规则无法有效的解决这些问题。
为了解决以上问题,缓解开发人员在开发过程中规范编写注释的压力,现有研究人员通过人工模板、信息检索、深度学习的方式来自动生成源代码的注释,并且可以通过生成的注释来对代码进行维护。现有注释生成方法有很多,通过预定义人工模板来生成代码注释是最常见的注释生成方法之一。比如说,首先通过预定义启发式的规则来设定人工模板,在生成代码注释时分析代码的结构来匹配相应的注释模板,最后从源代码中提取变量名、方法名等关键字来生成注释。但是如果方法名等标识符不规范时,无法生成准确的注释;还有通过信息检索的技术来为代码生成注释,比如说,首先通过概率的方法构建代码片段和注释之间的映射关系,然后从项目中搜索相似的代码片段来为代码片段添加注释。
.......................
1.2 国内外研究现状
现代的软件系统通常包含大量的代码注释[12],这些注释可以用于理解代码功能和软件维护,是一种很好的编程习惯[13]。现有几位研究人员调查了注释的用处,表明高质量的软件注释更具有可读性。例如,Woodfield 等人进行了一项用户研究[14],让具有经验丰富的开发人员阅读含有注释的代码和不含注释的代码,结果证明包含注释的代码更易于被开发人员理解。Tenny 人通过更多的实验证实了这些结果[16]。Hartzman 等人调查了大型软件产品的维护过程,调查结果表明注释可以减小软件维护的经济成本[17]。代码注释提供了丰富的形式,可以用来执行多种软件工程的任务。比如说测试[18][19]、错误检测[20-23]、代码合成[24-28]等。总体而言,根据现有的研究,在源代码中包含大量注释是公认的良好做法。
高质量的注释对于理解程序很重要,但是编写高质量的注释需要耗费很大的时间和精力。开发人员在开发过程中倾向于不编写注释或者编写只适合于自己查看的注释。自动生成代码注释不仅可以节省开发人员编写注释的时间,也可以帮助开发人员理解代码的功能。Java 是过去 10 年来最流行的编程语言,目前已经提出了许多方法来为 Java 的方法[29][30]和类[31]生成注释。现有基于人工制作的模板[32-41],信息检索[42-45],和深度学习[27][46-49]等技术用于在源代码中生成注释。Newman C 等人根据预定义的启发式方法,为每个方法生成一个构造型,然后根据构造型信息和预定义的模板为每个方法生成注释[51]。Wang X,Pollock L 等人的研究,也是基于人工模板来对方法内主要语句生成自然语言描述[52]。该方法提取每个 Java 方法的抽象语法树,并且根据抽象语法树来识别与该方法相关的动作单元。我们识别动作单元中的主要焦点语句,并且这些语句包含了这个动作单元的主要内容。根据焦点语句中的参数与操作,将其转化为自然语言短语。其中根据大量 Java 数据研究出的一组规则来识别焦点语句,并且通过手动分析项目中的语句,定义了相关的模板。最后进行了一项评估研究,评估结果表明,生成的注释与人工编写的注释相比足够简洁和充分。
.........................
第二章 相关背景知识介绍
2.1 程序分析
程序分析是指自动分析一个程序的正确性、安全性和规范性的分析过程。主要包括两种类型:静态程序分析和动态程序分析。其中静态程序分析的特点是不需要执行程序、执行速度快和误报率较高,可以对代码的规范性和安全性等指标进行验证。常用的静态程序分析技术包括数据流分析、无效代码分析和污点分析等,经常被应用在软件优化、软件错误检测领域。下面将详细介绍在本文中主要使用的程序分析相关技术。
2.1.1 数据流分析
数据流分析是常用的一种静态分析方法,其主要是从如何使用程序对数据处理方面进行分析,也就是分析每一条程序路径上的数据被改写和传播的情况。数据流分析也可以从代码中收集语义信息,在编译时确定变量的定义和使用的情况。通过数据流分析,可以帮助开发人员理解程序。常用的数据流分析包括:
1. 可达性分析:主要用于分析程序中的变量是否能通过某一个程序路径达到一个程序点。其中程序点与程序语句不同,一条程序语句有两个程序点,在语句执行之前有语句入口点,在语句执行之后具有语句出口点。
2. 变量活性分析:主要用于分析程序中的变量在经过程序点之后,在被重新赋值之前,还可能被哪些语句使用到。
3. 可用表达式分析:主要用于分析程序中可用的表达式,也就是分析某一程序点之前,有哪些表达式被计算过。
4. 频繁表达式分析:主要用于分析程序中的哪些表达式在程序点之后,沿着所有的路径,均会被使用到。
.....................
2.2 自然语言处理
我们的工作采用了深度学习中的最新先进技术和自然语言处理[71-73]。深度学习技术被证明在分类等问题中具有较好的效果。在本章节中,我们讨论这些技术的背景。
2.2.1 递归神经网络的序列嵌入
RNN(递归神经网络)[55][74]是现在被广泛的使用的一种深度神经网络,主要用于对具有顺序的句子数据的嵌入,比如说自然语言等。循环神经网络(Recurrent Neural Network,RNN)DNN 以及 CNN 在对样本提取特征的时候,样本与样本之间是独立的,而有些情况是无法把每个输入的样本都看作是独立的。RNN 是一种特殊的神经网络, 它的提出是基于过往的经验和记忆。与 DNN,CNN 不同的是,RNN 可以记下前一时刻的输入,对于一些具有时序性的数据处理具有较好的效果。比如处理自然语言描述,这类问题就是一种带有时序序列的问题,无法将样本看做是相互独立的,因此单纯的 DNN 和 CNN 解决这类问题就比较棘手。此时 RNN 就是一种解决这类问题很好的模型。
..............................
第三章 基于自然语言处理的注释分类............................18
3.1 注释分类的缘由.........................18
3.2 注释类别................18
第四章 基于程序分析和自然语言处理的注释定位.........................24
4.1 动机........................24
4.2 总体概览....................25
第五章 实验与结果分析..........................30
5.1 实验环境....................30
5.1.1 硬件环境...................30
5.1.2 开发环境...................30
第五章 实验与结果分析
5.1 实验环境
5.1.1 硬件环境
本文实验的硬件环境主要如下:主机处理器为 Intel(R) Core(TM) i7-4800MQ CPU @2.70GHz 四核处理器。安装了 64 位 Windows 10 操作系统,内存为 8G。显卡为英伟达 GTX960。还使用了一个腾讯云服务器作为人工试验的注解系统主机。配置为 l 核 2G,64 位Centos7.2 系统。并且搭建了两台虚拟机,其中一台用于存放数据库,数据库为 Mysql5.6,系统是 Centos6.5, 分配了 1G 内存和一个 CPU 使用。
5.1.2 开发环境
本实验是基于 Java 语言开发和 Python 语言,jdk 版本是 1.8,Python 版本是 3.6,开发工具使用的是 I