关键词:
代码标识符重构
重构识别与重命名
重构演变规律
深度学习
编程上下文
摘要:
标识符在帮助开发人员分析和理解源代码方面发挥着重要作用。然而,源代码中可能会出现大量存在拼写错误,违反其命名准则、语义角色和编程上下文的标识符,本文将这些标识符称为有缺陷的标识符。这些有缺陷的标识符可能会误导开发人员,使其无法正确理解源代码,从而进一步可能导致潜在的软件漏洞,所以这些标识符需要被重构。但是,现有研究只关注于有限数目粒度的标识符,没有考虑所有粒度的标识符。同时这些方法只关注于发生单次变化的标识符,忽略了那些随着软件演变而一直演变的标识符。此外这些方法只能建议一系列组成标识符的子序列,不能建议完整的标识符。与此同时,对标识符重构原因及演变规律的不明确,模糊了开发者进行标识符重构的意图,加重了开发者进行标识符重构的负担。基于此,本文在深度学习与自然语言处理的基础上,结合了标识符所在的领域知识,提出了关于标识符重构的三个子研究问题,即标识符重构识别,标识符重命名,标识符重构原因及演变规律挖掘,来帮助开发者进行重构活动,增强代码的可理解性与可维护性。本文主要工作如下:
(1)针对标识符的重构识别,本文提出了一种全粒度的多重变化标识符的识别方法。本文提出了关于标识符的两个领域特征,即类型和归一化的标识符,以及其编程上下文,借助深度学习来理解标识符的语义信息,进行分类器模型训练,从而识别那些会发生多次变化的标识符。大量实验表明,所提方法在Precision,Recall和F-measure上均达到了不错的效果。
(2)针对标识符重命名,本文提出了一种基于结构分析和词法分析的方法标识符推荐策略。本文基于Java语言的编程规范和分治思想,创造性地提出了方法标识符的功能行为与功能对象两个概念。本文基于相似方法体具有相似功能以及编程上下文反映语义环境这两个原则,通过深度学习来体会方法标识符的功能行为与功能对象,提取出构成方法标识符的构成项,最后通过动态风格算法来对构成项进行动态生成,从而推荐给开发者。大量实验表明,我们在推荐一个标识符上达到了23.67%的命中率,在推荐五个标识符上达到了33.62%的命中率,优于现有最好的方法。
(3)针对重构原因及演变规律挖掘,我们提出了一种基于提交历史的主题聚类方法。本文通过对提交历史的实证研究,提出了使用聚类对其进行主题挖掘,动态地形成不同的主题,代表了开发者进行代码提交的意愿,同时也代表了当前标识符重构的一般原因。之后,将一般原因通过标识符变化映射到多重变化的原因序列,进一步反映标识符的演变规律。在大量实验基础上,本文总结了15个标识符变化的一般原因以及变化2-6次的标识符演变规律。