● 摘要
维护和修改一个大型软件系统需要开发人员对系统有一定的理解。但对开发者和管理者来说,理解软件项目源代码是一件非常困难的事,尤其是对于那些缺失了含有业务介绍以及业务域和源代码相关性文档的软件项目。此外,由于很多软件系统和它相关联的业务领域的知识缺乏一种明确的方式来获取,这使得项目的理解成为一项非常复杂的工作。据研究表明[1],47%-62%的软件维护工作被用于软件理解。目前大部分工具都是通过从源代码中提取结构信息来帮助程序理解。这种方法往往忽略程序中的语义信息—标识符和注释中蕴含的有关领域概念和知识,设计思想等方面的信息。由于开发人员倾向于使用有意义的标识符名称和提供注释来解释代码的功能,所以这些语义信息是连接程序员与程序的桥梁,对于理解程序非常重要。目前,一些研究者利用主题模型来解决上述问题。主题模型一般用来处理传统的文本集,这些研究者把代码当做传统的文本集,源文件类似于文档,符号类似于单词,却没有考虑它特有的结构信息。为此,本文分析代码的特征,提出一种基于主题模型的语义聚类(semantic clustering)方法来发现源代码中实现的某些功能概念(functional concept),为程序员提供软件的初步印象,从而帮助其理解或者修改程序,尤其是那些缺失了外部文档的程序。本文将这些揭示代码功能概念的语义信息称为“主题(topics)”。这些主题通常对应于软件中实现的某些跟业务域(business domain)相关的概念或者特征,并和贯穿整个系统的类高度相关。为了实现上述研究目标,本文考虑代码不同层次的信息(包、类、方法等),既分析了代码的结构信息,又分析了代码的语义信息。同时,本文研发的工具可视化一系列信息,包括主题信息、代码文档大小、主题间的关联性等来帮助程序员更好的理解程序。此外,为了更准确地将与揭示代码功能概念的主题最相关的类文档聚在一起,本文采用结合KL距离(Kullback-Leibler Divergence)和凝聚式层次聚类的方法对类文本进行聚类分析。本文的方法意在结合程序的结构信息和语义信息来分析程序,帮助程序员理解程序。最终,将研发出的工具QETEFS作为eclipse插件集合到eclipse平台中。