热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

inkscape生成g代码_通过差异化和可视化支持探索性代码搜索

1引用WenjianLiuandXinPengandZhenchangXingandJunyiLiandBingXieandWenyunZhao.Supportingexplora
a74ee22b4fccea2169613eebd9dd54fb.png

1 引用

Wenjian Liu and Xin Peng and Zhenchang Xing and Junyi Li and Bing Xie and Wenyun Zhao. Supporting exploratory code search with differencing and visualization. In Proceedings of the 25th International Conference on Software Analysis, Evolution and Reengineering, 2018, 300-310.

2 摘要

搜索和重用在线代码已经成为软件开发中的一种常见做法。在线代码的两个重要特性在当前的工具支持中没有得到仔细的考虑。首先,许多在线代码大体上相似,但细微不同。其次,一些代码可能通过它们的差异形成复杂的关系。这两个特点使得在线代码很难正确地排列到搜索查询中,降低了检查搜索结果的效率。本文提出了一种探索性的在线代码搜索方法,该方法明确地考虑了在线代码的上述两个特点。给定一个搜索查询返回的方法列表,我们的方法使用克隆检测和代码差异技术来分析搜索结果中方法之间的共性和差异。然后,它生成一个探索图,用来可视化方法差异以及通过这些差异得到的方法间的关系。探索图允许开发人员在搜索结果中呈现的不同方法组的结构化视图中探索搜索结果,并将隐式代码差异转换为视觉提示,以帮助开发人员导航搜索结果。我们在一个名为 CodeNuance 的基于 web 的工具中实现了我们的方法。通过与基于排名表和基于代码聚类的搜索结果检测方法的比较,对我们的搜索结果检测工具 CodeNuance 的有效性进行了实验评价。我们还比较了使用我们的工具和其他探索性代码搜索工具时的性能和用户行为差异。

3 方法

在本节中,我们首先概述该方法,然后描述其关键步骤。

3.1 概述

b11ea02c4da9aa91fc99eaa3300d08af.png

图 1 方法概述

图 1 显示了我们方法的主要步骤。我们的方法支持方法级探索性代码搜索。它把搜索结果中的一组候选方法输入到查询中,并从这些候选方法中生成一个探索图(见图 2)。用户可以与探索图进行交互以探索搜索结果。方法的输入可以是任何现有代码搜索技术的结果,这些技术可以将方法列表作为搜索结果返回给用户查询。

c8a981a021961b58830748db10bbd9c4.png

图 2 查询“将 InputStream 转换为 String”的探索图

代码搜索通常为查询返回大量方法。在在线代码搜索的上下文中,许多方法是相同的,或者在空间,布局,文字,注释等方面只有很小的差异。对于这类方法,通常只要检查其中任何一个并跳过其他方法就足够了,因为其他的将不太可能提供新的编程信息。因此,我们的方法使用克隆检测将候选方法聚类为 Type I / II 克隆方法的组(简称方法组)。

基于代表性方法之间的成对差异,可以生成完全连接的探索图。但这张图没有办法被有效勘探。我们的方法试图通过消除不必要的边缘来简化探索图。不必要的边缘意味着通过边缘连接的两种方法之间的差异可以通过它们之间的一些其他方法的一系列差异进行综合。此外,我们的方法还消除了两种方法之间存在较大差异的边缘。

最后,我们的方法将边缘简化的探索图可视化,以提供搜索结果中有代表性的方法及其差异的结构化视图。建议以总体差异最小的方法作为勘探的出发点。方法节点根据它们与起点方法的相对差异进行着色。用 API 对边缘进行标注,并从两种方法的不同令牌对中提取编程构造差异。

3.2 克隆检测

给定一组候选方法,我们使用克隆检测器(例如,在我们的实现中使用的 CCFinderX)对属于 Type-I 或 Type-II 型克隆的方法进行分组。每个方法组包括许多相同或接近相同的候选方法,它们被视为代码搜索的基本单元。请注意,方法组只能有一个方法。对于具有多个方法的每组,随机选择一个具有代表性的方法进行以下分析。

3.3 代码差异

为了确定两个方法组之间的差异,我们的方法使用 Lin 等人提出的代码差分算法比较了它们的代表性方法。该算法首先将每个方法转换为一个令牌序列,该序列由不同类型的令牌组成,如关键字、分隔符、运算符、文本和标识符。然后计算两个令牌序列之间的最长公共子序列(LCS)。然后,它识别出两个令牌序列中相应的差分范围,并生成相应的差分令牌对列表。

3.4 减少探索边缘

算法 1 基于代表方法之间的成对差异,在搜索结果中所有方法组的代表方法的完全连通图中识别出不必要的边缘,将代表方法 MG 的集合作为输入,并在这些方法 UEdges 之间返回一组不必要的探索。

9c43ea8d4f9f0d328884797b42b4cf1a.png

(1)

2c86d32117b6f16fb1075dda2262d7c3.png

消除由算法 1 中鉴定的不必要勘探边缘之后,我们的方法还消除了两个代表性方法其距离大于阈值之间的边缘。两种方法之间的距离较大表明它们的代码几乎没有共同点,因此无需在探索图中直接连接这两种方法。两种方法 mg1 和 mg2 之间的距离按公式 2 计算,其中 Length 函数返回方法的令牌长度或两种方法之间的差分令牌对的数量。一组代表性方法 MG 的距离阈值计算为等式 3,它首先计算 MG 中每种方法与其他方法的最短距离,然后返回所有最短距离的最大值,我们使用此动态计算的阈值 而不是静态指定的边缘,以消除一组代表性方法的距离相对较大的边缘。

484068bf069323cf189dcc93acd3cf6d.png

(2)

ea37c1a9a365cec0908543ee1eb9c42d.png

(3)

3.5 生成探索图

给定搜索结果中具有代表性的方法的边缘减少的勘探图,我们根据代表性方法之间的距离确定勘探图中的中心点。如果这两种方法直接相连,则它们的距离将计算为公式 2。否则,它们的距离是两种方法之间最短路径上直接连接的方法的距离之和。中心点是在中心点与所有其他方法之间具有最小总距离的方法。建议将中心点作为探索的起点。

我们使用渐变着色方案来反映两种代表性方法之间的差异程度。我们为中心点组和与中心点距离最大的组设置了两种基线颜色。然后,根据两个节点的相应方法与中心点方法之间的距离,在两个基线颜色之间按比例计算其他节点的颜色。

8a4b455ded13890e256ced131368b037.png
  • API 或本地类和方法调用,e.g. StringBuilder;
  • 条件语句, e.g. if (BufferedReader.readLine() == null);
  • 循环语句,e.g. while(BufferedReader.readLine() ! = null);
  • switch 语句,e.g. switch(tag);
  • return 语句,e.g. return String;
  • 捕获异常,e.g. catch IOException;
  • 其他,e.g. 代数运算。

4 评估

我们的方法的目的是通过分析和可视化代码搜索结果中存在的共性、差异和关系来改进代码搜索。为了评估我们实现这一目标的方法和工具,我们进行了一系列实证研究,以回答以下研究问题:

RQ1:探索图是否减少了代码搜索中的结果检查工作?

RQ2:与其他探索性代码搜索工具相比,CodeNuance 能否帮助用户更快、更准确地找到所需的代码?

RQ3:边缘缩小和差异标签如何影响用户的代码搜索体验?

4.1 分析研究 - 结果检查工作(RQ1)

图 3 给出了通过一组排名列表、基于 FCA 的树视图或我们的勘探图的结果进行搜索结果的检查这三种方法的结果检查工作量的描述性统计数据。对于基于排名列表的检查和基于 FCA 的树形视图,我们考虑了两种处理方法:一种是原始搜索结果(分别表示为 RList-Original 和 FCA-TV-Original);另一个是减少克隆的搜索结果(表示为 RList-NoClone 和 FCA-TV-NoClone)。

17529628335e5f939e729480aff7ba7d.png

图 3 结果检验工作的比较

这反映了我们的 CodeNuance 方法与基于 FCA 的方法之间的关键区别:CodeNuance 同时考虑了代码共性和候选方法之间的差异,并通过它们之间的差异分析了方法之间的关系,而基于 FCA 的方法仅考虑了候选方法之间的共性。

4.2 用户研究 - CodeNuance 与 KeywordRec(RQ2)

图 4 这些结果表明,与 KeywordRec 相比,参与者在使用 CodeNuance 时能够更快、更准确地找到所需的代码。结果表明,TG2 任务的性能比 TG1 任务的性能差。根据参与者的反馈,TG2 任务比 TG1 任务更困难,因为从任务描述中不容易识别出所需方法的正确查询。由此可见,在更具探索性的任务中,CodeNuance 的优势更为显著。

aac6c03e9f7767c95c2a2de2f43c7522.png

图 4 TG1 的代码搜索表现(T1-T5)和 TG2 的代码搜索表现(T6-T10)

4.3 用户研究 - 边缘缩小和差异标签(RQ3)

图 5 显示了三个任务的默认探索图中的边数和参与者首选探索图中的边数。#Node 显示,克隆减少的搜索结果分别有 83、86 和 83 种方法用于这三个任务。我们可以看到,对于所有这三个任务,首选的探索图比默认图拥用更少边。我们对参与者的采访表明,这部分是由边缘重叠的差异标签造成的。参与者更喜欢一个他们能清楚看到不同标签的探索图。如果有很多重叠的标签,它们通常会选择消除更多的边以使图形更清晰。或者,它们可能忽略差异标签,只需沿着边检查方法的相邻方法。

7021f431dc1b18b356030d3b7f44c678.png

图 5 首选边缘缩减率

根据参与者的反馈,虽然差异标签准确地反映了候选方法之间的差异,但是他们更喜欢抽象的和更短的差异标签。他们建议,该工具应允许他们按不同类型筛选差异标签。例如,有时它们只关心 API 的使用或异常处理差异。在这种情况下,显示所有的差异是没有意义的。他们还建议,为了更有效地通过探索边来探索相邻方法,该工具应在两个方法单击边时为它们提供一个代码比较框。这将减少它们在理解方法差异时对边缘标签的依赖。

5 本文主要贡献

本文的主要贡献如下:

1)提出了有效在线代码搜索必须明确处理的两个重要特征;

2)提出了一种探索性的代码搜索方法和工具,在系统设计中明确地解决了在线代码的这两个特征;

3)我们进行了一系列实验和用户研究,以评估我们的方法的有效性并确定改进机会。

致谢

感谢国家重点研发计划课题:基于协同编程现场的智能实时质量提升方法与技术(2018YFB1003901)和国家自然科学基金项目:基于可理解信息融合的人机协同移动应用测试研究(61802171)支持!

本文由南京大学软件学院 2018 级硕士生韩奇翻译转述。



推荐阅读
  • 思科IOS XE与ISE集成实现TACACS认证配置
    本文详细介绍了如何在思科IOS XE设备上配置TACACS认证,并通过ISE(Identity Services Engine)进行用户管理和授权。配置包括网络拓扑、设备设置和ISE端的具体步骤。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 通过将常用的外部命令集成到VSCode中,可以提高开发效率。本文介绍如何在VSCode中配置和使用自定义的外部命令,从而简化命令执行过程。 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • JUC(三):深入解析AQS
    本文详细介绍了Java并发工具包中的核心类AQS(AbstractQueuedSynchronizer),包括其基本概念、数据结构、源码分析及核心方法的实现。 ... [详细]
  • [c++基础]STL
    cppfig15_10.cppincludeincludeusingnamespacestd;templatevoidprintVector(constvector&integer ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • php更新数据库字段的函数是,php更新数据库字段的函数是 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 本文探讨了如何利用Java代码获取当前本地操作系统中正在运行的进程列表及其详细信息。通过引入必要的包和类,开发者可以轻松地实现这一功能,为系统监控和管理提供有力支持。示例代码展示了具体实现方法,适用于需要了解系统进程状态的开发人员。 ... [详细]
author-avatar
卢军好2602912493
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有