论文部分内容阅读
随着互联网的普及与流行,以及“开放共享”观念的深入人心,越来越多的人愿意在互联网上分享他们的代码。目前,互联网上的开源代码量正以指数规模增长,如果这些代码能被很好地利用,软件工程的很多领域将会因此受益。然而,目前主流的代码库都是以文本方式存放代码,忽略了代码的内部结构,查找代码的方式也仅仅局限于关键字搜索,这不足以使用户充分理解这些代码。代码查询是帮助理解代码的一种有效方法。代码查询技术通常包括三个步骤:信息抽取、查询、以及结果显示。本文提出了一种新的代码存储方法,这种方法以图为基本结构,存储于图数据库Neo4j中,并适用于目前非常主流的Java语言程序。本文主要关注于代码查询的信息抽取步骤,同时本文也涉及部分与查询和结果显示相关的内容。本文方法保证了足够细的代码存储粒度,结合Neo4j提供的查询语言Cypher,用户可以方便地设计并实现查询算法。本文的主要贡献如下:本文设计了一种针对Java语言程序的基本存储模式。这个存储模式以语法树为基础;为类型、方法、变量引入全局唯一的键节点,解决了同名问题;合并冗余图节点,缩小了图数据的规模。同时,本文还提出了一种增量式的扩展存储模式的方法,并实现了几种常用的扩展:调用、范化实现、关联。本文提供了一系列原型工具来支持对Java代码的存储和查询。本文实现了代码存储插件。它支持自动化的Java代码向基本存储模式的转换。同时,这个工具还支持对基本存储模式的相关扩展。本文还实现了数据库查询及显示插件。查询插件的主要功能是提供Cypher语言的编辑环境。显示插件的主要功能是支持图形化的查询结果显示。本文对九个大规模开源Java工程进行了实验,并评估了Neo4j数据库的代码存储能力、以及代码转换为基本存储模式后需要的存储空间。本文还给出了几个实际查询的示例来说明本文工作的广泛应用场景,包括度量指标的计算、目标类型的查找、以及工程中的循环调用情况。