英语原文共 12 页,剩余内容已隐藏,支付完成后下载完整资料
挖掘数十亿AST节点研究实际与潜在使用的Java语言功能
摘要:
编程语言一直在演变,增加额外的语言功能来简化日常任务和让语言更加容易使用。例如,Java语言规范已经有了四个版本,目前正在起草第五个版本。虽然语言功能的增加是由一个假设的社会需求所驱动(通常与这些功能的直接请求),然而很少有经验证据表明这些新功能一旦被发布后如何开发人员所采用的。本文中,我们分析了代表九百多万个Java文件的超过31K的开源Java项目,解析时发现其包含180亿个AST节点。我们分析这一主体来找到新的Java语言功能的使用。我们的研究提供了有趣的见解,比如:有数以百万计的地方可能会被使用的功能,但却没有;开发人员转换现有代码来使用新功能;我们发现了数以千计的潜在资源处理错误的实例。
关键字:
Java;实证研究;语言使用;软件挖掘
介绍
Java语言规范(JLS)[17-20]是用于Java的官方规范。规范的新版本(JLS2-JLS4)发布时增加了一些新功能。官方Java平台(Java运行环境(JRE)和Java开发工具包(JDK));标准版(SE),移动版(ME)和企业版(EE)都实现了基于这个官方规范的语言。
由于来自社会的需求,规范进行了一些改变。这需求经常出现在官方要求的形式中(一个使用Java社区程序(JCP)Java规范要求(JSR))。JSP正式的定义了需求是什么,当前规范缺乏这种需求的原因,并且提出了一个解决方案。每个新的语言功能有一个配套的JSP,语言的每一个新版本有一个伞型JSP来识别新功能。
然而,目前很少有定量证据表明这些新的语言功能是如何在实践中使用。以前的研究调查了一些Java语言功能的使用,例如[21]研究了在Java中的几个面向对象的功能使用,如类、接口和方法,[27]研究了Java泛型的使用。相似的,[24],[9]和[10]调查了非语言功能,如反射(其在Java运行时支持,不是语言)。然而,这些研究相对于数量很少的Java项目(约20个),研究一个很小的子集功能,或者没有随着时间的推移更新他们的调查。
本文中,我们利用Boa语言和基础设施[14,15,28]来研究在大型Java项目中的18个Java语言功能的使用。我们查询的数据集是来自SourceForge的超过31K个项目,代表了9百多万个独特的Java源文件,这些文件中有超过2800万个快照,解析时发现其包含超过180亿个AST节点。
从这个数据集中我们通过在发布日期之前查询功能的使用来调查是否功能确实是符合社区的需求。我们的结果显示这是真的:每个功能在发布前已经被使用。接下来我们研究这些功能如何随着时间沿着三个维度被使用:项目,源代码文件和功能使用者。我们的结果显示,虽然一些功能被广泛使用,然而许多人只能看到有限的使用。
然后,我们通过定义一组挖掘任务来定位源代码,这些源代码潜在使用了这些新功能,来发现这些功能是否由于机会的缺乏而未被使用。我们发现了数以百万计的这些例子,无论是在功能发布日期前存在的文件,还是在功能发布后出现的新文件。这表明有更好的工具支持的空间来建议使用这些新的语言功能或者转换代码来使用这些功能。这也表明新功能有更好训练和广告的需要。我们的一些有趣的结果包括:
- 所有语言功能在他们被官方发布前就被使用。
- 所有被研究的功能都被使用,然而一些功能显然是最流行的的,包括:注释使用,增强循环,具有泛型类型的变量。一些功能很少使用。
- 开发人员在新功能发布后转换现有代码来利用新的语言功能。因此,这种转换操作的工具支持和建议的代码位置转换对于社区很重要。
- 我们发现了功能被使用的很多实例,但不是,表示需要更好的训练或者IDE支持。事实上,一些错过的机会实际上导致了错误的行为。
- 提交者往往在个人基础上采用新功能,而不是一个团队。这一结果与之前的研究[27]一致,但是有100次以上的提交者,
- 大多是开发者只使用少量的新功能。少数开发者会考虑使用大部分新功能。
接下来,我们给出JLS每个版本的背景和新语言功能。然后在第三部分,我们给出我们
的研究旨在回答的研究问题。在第四部分我们描述了在我们的研究中使用的方法,并且在第五部分给出了研究本身。在第六部分我们给出了一些讨论。第七部分我们描述了一些关于语言功能使用的之前的研究。最后我们在第八部分得出结论和未来工作。
Java语言规范(JLS)
这部分提供了Java语言规范(JLS)的背景。自从Java语言规范的原始版本,现在已经
有了三次版本的更新。在这一部分我们列出了每一个版本的语言更新。功能的全部列表如图表1所示。值得注意的是,新的语言版本是纯粹的添加,每一个版本都能兼容之前的版本。
图表1.被研究的Java语言功能,举例。
JLS2新语言功能
Java语言规范,版本2(JLS2)[18]在新语言功能上有一个相对小的更新。这个版本增
加了一个新语言功能:断言语句。
JLS3新语言功能
Java语言规范版本3(JLS3)增加了几个重要的语言功能,包括:注释类型,增强循环,类型安全枚举(枚举),通用类型和变量参数方法。
JLS4新语言功能
Java语言规范4(JLS4)做了一些改变,包括:二进制数,通用类型操作,允许捕获多
个异常类型,交互抑制的警告,自动资源管理和文字强调。由于这些功能并不是众所周知,在这一部分我们只详细介绍他们中的一部分。
泛型实例创建的类型推断(菱形)
正如之前所提及的,语言允许通用类型。当声明一个通用类型变量时,通用类型参数必须被重复。例如:
Maplt;K, Vgt; m = new HashMaplt;K,Vgt;();
声明一个带有关键字类型K和值类型V的HashMap。注意到通用类型参数在变量声明(左边)中和对象实例化中被重复。JLS4允许实例化泛型类型参数的重复省略,从而改变了以往的例子变成:
Maplt;K, Vgt; m = new HashMaplt;gt;();
新操作在编译器能推断出通用类型的地方可以任意使用。
捕获多异常类型(多捕获)
这个版本允许在catch中指定多个异常类型。当任意一种异常被捕获后Catch子句的主体随后被执行。例如,代码:
try { .. } catch (E1 | E2 e) { .. }
如果try语句抛出了一个E1类型或者E2类型异常,代码就会执行catch语句的主体。这有益于避免代码重复。
安全的可变参数警告抑制
JLS2增加了方法功能中的参数变量数目,其当与通用相结合时会导致大量的编译警告。然而通常程序员知道这些警告能被安全地忽略,因此移除这些警告的能力被增加了。
@SafeVarargs
@SuppressWarnings({'unchecked', 'varargs'})
static lt;Tgt; Listlt;Tgt; asList(T... elems) { .. }
这些注释的使用将会抑制编译器在这些位置发出的警告。
带资源的try语句
一些资源,如文件,当它们不再被使用时需要手动释放。资源本身很容易忘记,然而即便是程序员记得关闭资源,错误依然会产生[37]。为了避免这些资源的管理,一种新的语句被引出:
try (File f = new ..) { .. }
这种try语句声明了一个资源f,其在try语句的主体中被使用。一旦退出try语句(正常或异常退出)资源都会被自动释放。
关于语言功能使用的研究问题
我们的研究聚焦开源发展者对Java语言功能的使用。在这一部分,我们列出了我们希望回答的具体的研究问题(RQ)。
RQ1:在新语言功能发布前项目是否使用了它们?通常,尤其是Java,一个被要求的功能的实现在其发布前都是可用的。这可以采取一种官方的beta/预发布或者一种非官方编译器的形式。
我们对新功能在发布前被使用的频率感兴趣。这些数据可以给出一个指示,是否一个特定的功能是预期的,和在发布前提供实现是否对社会有用。
RQ2:一种语言功能内使用的频率是多少?接下来的问题处理了功能使用。新语言功能的增加是由来自社会的需求所驱动,但到目前为止,还没有研究来调查大多数Java语言功能是如何被开发者所使用。
这个问题考察了在JLS2-JLS4中被提出的语言功能。对于每一种语言功能,它在我们整个数据集中的使用都被追踪。这个数据提供了每个功能是如何被使用的视野。
RQ3:提交者是怎样使用语言功能的?一旦一个新的语言功能集可用,对于开发者来学习和在哪儿使用它们都是要花时间的。一些开发者也许会激动,并且尽可能经常的尝试使用它们。其他开发者也许还是用以前的功能集来解决问题,因为那是他们习惯的方式。我们希望调查来发现对于个体开发者语言功能是如何被使用的。
RQ4:是否有错过使用语言功能的机会?虽然一种新语言功能也许是可用的,开发者可能不会选择使用它。我们对知道这种错失的使用机会存在频率很感兴趣。
RQ5:旧代码会被转换为使用新语言功能吗?我们也希望调查看看是否使用了老的语言功能的代码会被更新来使用更新的语言功能。
方法:工具和数据集
在这一部分,我们描述了用于回答之前的研究问题的方法。我们的方法依赖于
Boa[14,15,28]和来自于SourceForge的数据集[12]。
Boa语言和基础设施的背景
Boa语言和基础设施被设计来抽象软件挖掘的细节,提供一个简易写查询的平台,其能
对软件库数据进行有效执行。Boa包含了来自SourceForge项目的数据,支持基于此种数据的多种查询。
Boa语言抽象了软件挖掘的大多数细节。Boa框架挖掘了软件库,将数据转换成一组自定义类型。语言提供了这些领域的具体类型,比如项目,代码存取,修订和允许用户执行软件库查询。
Bo语言处理了CVS和Subvrsion库的Java项目。当它发现一个Java源文件里的改变时,它会核查使用Eclipse JDT解析器修改和分析的该文件的快照,包括类型,如命名空间,声明,方法,变量,语句和表达式。语句和表达式类型是联合类型,允许每个表示多个实例。
Boa基础设施产生一个Hadoop MapReduce程序来有效执行查询。这也抽象出来,开发者不需要写任何代码来进行并行化查询。
研究使用的数据集
在我们的研究中使用的数据集是来自Boa里2013年9月的数据集。这个数据集包含了
在SourceForge上所有的Java工程,至少一个CVS或者Subversion库。数据集不包含只有Mercurial,Git,或者Bazaar库上Java工程。Java项目的所有数量超过35K(见图表2)。
然而,这些项目不是所有的都有用。我们确认了大概4K个项目,其所有的Java源文件都包含一个解析错误。我们过滤掉了这些项目,留下了超过31K个工程用于我们的研究。
数据库包含广泛使用的Java工程,包括:Azureus/Vuze,Hibernate,JHotDraw,JabRef,JUnit,iText,FindBugs,JML,TightVNC等等。这个数据集代表了5万多个开发者的超过九百万次修订。它包含了九百多万个独特的Java文件和这些文件的超过2800万张快照。这表示(据我们所知)迄今为止用于Java项目最大的经验数据库,其包含了源库的所有历史信息和来自Java源文件的所有AST信息。
对于我们的研究问题,Java工程的大小(无论是1或者1K个文件)都是不相关的,正如我们对调查开发者使用的Java语言功能感兴趣一样,不限制于对任具体的开发者的研究。因此,我们包括了小工程还有大工程。然而对于RQ3,小工程能影响我们的结果,因此我们稍后提及,对于这个研究问题,我们过滤了少数开发者的项目。
图表2.基于SourceForge数据集的度量
Java语言功能使用的实证研究
这部分展示了我们对Java语言功能使用情况的研究。
RQ1:项目是否在新语言功能发布前就已经有过使用?
如果一个功能被社会所需要,那么大多数可能的人会在其发布前就很激动地使用它。为了验证这个是否属实,首先,我们需要知道官方发布每一个语言规范的发布日期。我们展示了这些发布日期,基于每个规范的JSR,如图表3所示。
使用表里的发布日期,我们接着分析每一个有效的Java文件来看看它是否使用了一个特定功能。我们过滤掉所有包含解析错误的Java文件。然后我们收集使用了每个语言功能的每个文件的时间戳,然后基于特定语言功能的发布日期过滤掉。结果显示在图表3,包含了功能列表,功能第一次挖掘使用的日期,在功能发布前就使用其的项目数量,在功能发布前就使用其的所有文件的数量。
对于最简单的使用,我们手动调查来验证确实使用了特定功能的文件,提交日期符合我们的结果。基于这种分析我们确定一个带有明显错误提交日期的项目,然后我们从这个分析中移除该项目。有趣的是,对于一个在1998年中大量使用泛型的项目,引用日志“switch[ing] to GT”,这是由Bracha等人提出的语言扩展[8],最终成为Java泛型的基础。
表中的结果清晰地显示了每个语言功能都在其官方发布前被使用过,使用最有可能
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[137245],资料为PDF文档或Word文档,PDF文档可免费转换为Word
课题毕业论文、外文翻译、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。