CSNIPPEX:问答网站的可编译代码段的自动合成

小微 科技CSNIPPEX:问答网站的可编译代码段的自动合成已关闭评论116字数 1856阅读模式
摘要摘要目前,众多代码片段汇集于主流的问答网站(如 StackOverflow)上。但是,这些代码片段中的大部分都具有类型信息不完整的问题,这使得它们常常无法编译,进而无法应用于各种软...

摘要

目前,众多代码片断汇集于主流的问答网站(如 StackOverflow)上。然而,这些代码片断中的大部份都拥有类型信息不完全的问题,这使得它们往往没法编译,进而没法利用于各种软件工程任务。 基于此问题,本文提出了一种名为 CSnippEx 的技术。该技术通过解析外部依赖关系、生成导入声明和修复语法过错,将无用代码片断自动地转化为可编译的 Java 源代码文件。在本文中,作者团队以 Eclipse 插件的情势对 CSnippEx 进行了实现,并应用 242,175 个包括代码片断的 StackOverflow 帖子对其机能进行了评估。CSnippEx 胜利地将其中的 40,410 个代码片断转化成为了可编译的 Java 文件。另外,CSnippEx 还能在几秒内有效地恢复每一个帖子中代码片断的引用声明,其修复精度到达了 91.04%。文章源自微观生活(93wg.com)微观生活-https://93wg.com/2889.html

关键词文章源自微观生活(93wg.com)微观生活-https://93wg.com/2889.html

人工代码片断;开发折社交网络;程序合成;文章源自微观生活(93wg.com)微观生活-https://93wg.com/2889.html

1 引言文章源自微观生活(93wg.com)微观生活-https://93wg.com/2889.html

目前,愈来愈多的软件开发人员通过社交网络进行协作,或是分享工作经验。尤其是问答类网站,如 StackOverflow, CodeRanch 以及 CodeProject,都是开发人员时常光顾之处。在这些问答网站上,开发人员以问答的情势,提出问题或分享解决方案,并对问题以及回答进行评级以达成更好的合作。跟着时间的推移,这些问答网站累积了大量的群体知识。截至 2016 年 1 月,StackOverflow 已经索引了 1100 万个问题以及 1800 万个谜底。文章源自微观生活(93wg.com)微观生活-https://93wg.com/2889.html

这些群体知识对现代软件开发实践大有裨益。其缘由在于:问答帖子时常会包括一些高质量的代码片断。这些代码片断,或是为编程任务提供解决方案;或是指点 bug 修复、提供 API 的使用范例。问答帖子通过不断被人们阅读、评价、讨论以及更新不断优化,为代码重用以及代码分析提供了可贵的代码资源。为了提高工作生产的效力,开发人员时常会重用问答帖中的一些代码片断;当工作遭受技术困难时,也往往会转向这些代码片断以汲取“编码灵感”。文章源自微观生活(93wg.com)微观生活-https://93wg.com/2889.html

但是,人们在这些 Q&A 代码片断进行重用以及分析时,通常面临一个巨大的难题:这些代码片断没法直接编译。对于精确静态分析来讲,大多数 Q&A 帖子所包括的代码片断其实不拥有完全的语义,它们通常不可编译、不可执行,自然也就没法使用。呈现这类情况的缘由在于:回答者在编写代码片断时一般仅处于说明性目的,他们一般不会斟酌这段代码是不是能够通过编译。事实上,问答网站确切也很少对提交的代码片断进行语法检修。为了在高层次(设计或指点层面)上转达问题的解决方案,代码片断通常十分简洁,一般不会有具体的实现细节。虽然缺乏的实现细节可以人工弥补,但因为需要开发者对各种库都有至关程度的了解,这个弥补进程一般无比繁琐。对于通常触及众多代码片断的、基于群体的软件工程目标来讲,这类人工弥补显然是不相符需求的。文章源自微观生活(93wg.com)微观生活-https://93wg.com/2889.html

若要自动化地解决代码片断不可编译的问题,有两个技术挑战亟待解决:第一个难点是怎么对代码片断的外部依赖关系进行解析。大多数代码片断使用简化名称引用库类。在完整类名(如 org.library1.sub.C)限制的情况下,命名(引用)二义性问题就很容易发生;第二个难点是怎么将一个帖子中的多个代码片断自动地分割成适量数量的源文件。简单的启迪式法则(如老是或从不将帖子中的代码片断合并到单个源文件中)没法合用于繁杂的实际情况。文章源自微观生活(93wg.com)微观生活-https://93wg.com/2889.html

2 背景与念头文章源自微观生活(93wg.com)微观生活-https://93wg.com/2889.html

图 1:Q&A 代码片断合成的示例文章源自微观生活(93wg.com)微观生活-https://93wg.com/2889.html

2.1 问题表述

输入:CSnippEx 的输入是一个 Q&A 帖子。该帖子应包括一个或多个代码片断,也就是一个包括若干 Java 源代码行的聚拢。但是问答帖子也有可能含有一些用于交换的自然语言,这对代码片断的提取会发生一些干扰。一般来讲,主流问答网站多使用专用的 HTML 标记对代码片断进行封装 ,因而提取清晰完全的代码片断其实不是一件难事。

输出:CSnippEx 的输出是一个或多个编译单元。编译单元是指一个合法的 Java 源代码文件,它可以被标准编译器接受(能够正常通过编译)。在编译单元中,若要进行 Java 类型的引用,该引用声明需要在源代码中对应体现 。每一个编译单元及其包括的所有声明类型都隶属于同一个命名空间(或包)。编译单元可以通过两种方式在代码中引用 Java 类型:简化名称 ,完全名称。隶属于同一个包的类型彼此之间可以通过简化名称互相引用。若要引用在其他包中定义的外部类型,则需要导入声明来保证 Java 编译器能够正确解析该引用。同时,Java 允许两种导入

以上就是微观生活(93wg.com)关于“CSNIPPEX:问答网站的可编译代码段的自动合成”的详细内容,希望对大家有所帮助!

继续阅读
 
小微
  • 版权声明: 本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们(管理员邮箱:81118366@qq.com),情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!
  • 转载请务必保留本文链接:https://93wg.com/2889.html