英语原文共 20 页
API在Java中应用的理解
Dong Qiu , Bixin Li, Hareton Leung
摘要:上下文:应用程序编程接口(API)便于编程语言的使用。它们定义了与之交互的软件程序的规则和规范集。语言API的设计通常是艺术性的,由审美关注和语言架构师的直觉驱动。尽管最近对有限的API使用范围进行了研究,但缺乏全面的定量分析,探索并试图了解真实世界的源代码如何使用语言API。
目的:本研究旨在了解API如何在实际开发中使用,并根据API使用分析的结果探索其潜在应用。
方法:我们对Java的实际使用情况进行了大规模,全面的实证分析,这是一种现代的,成熟的,广泛使用的编程语言。我们的语言库包含5000多个开源Java项目,总共1.5亿个源代码行(SLoC)。我们研究了核心(官方)API库和第三方(非官方)API库的使用。我们自动解决项目依赖关系,生成准确解析的抽象语法树(AST),从超过150万个AST捕获使用过的API实体,并根据我们定义的指标测量使用情况:频率,流行度和覆盖率。
结果:我们的研究提供了详细的定量信息和产量洞察,特别是:(1)证实了API的使用服从Zipf分布的传统观念;(2)证明核心API没有得到充分利用(许多类,方法和领域从未使用过);(3)发现被弃用的API实体(其中一些很久以前被弃用)仍然被广泛使用;(4)评估当前紧凑型材的使用未得到充分利用;(5)识别API库的coldspots和热点。
结论:我们的研究结果暗示了跨语言API设计,优化和限制,API教育,库推荐和紧凑配置文件构建的潜在应用。
关键词:API使用情况,实证研究,Java
1 引言
语法和语义定义了一种编程语言。应用程序编程接口(API)便于其使用。今天的大多数软件项目在很大程度上依赖于API库的使用。它们可以改善代码重用,降低开发成本并提高程序员的工作效率。然而,API设计具有艺术性和偏见性,受美学问题和API设计者的直觉驱动,他们通常对程序员实际使用API的方式知之甚少,导致许多非自然且很少使用的API特性被引入,而不是一些预期的API,同时,不断增长的API(增加的功能已经引入)仍然是新手程序员的重大障碍,此外,API库已成为选择编程语言的最有影响力的因素之一。API的糟糕设计增加了开发人员的学习曲线,并极大地影响了他们的生产力,因此,理解当前API库的实际用法并优化设计以提高程序员的API可用性非常重要。
研究大量真实世界的程序如何使用API可以帮助验证或反驳许多流行的“理论”,这些理论涉及哪些API最常用,最有用,最容易使用;程序员是否已充分利用API,这些API 在大众文学和互联网上的编程方面比比皆是,对于语言教育,API与其实际使用之间的差距可能会指导教学法,让教师深入了解常见(也许应该是)和罕见(也许不应该)的内容。它还指导新手程序员选择比例较小的部分,即整个API的大部分精华,以降低学习成本。语言API设计者可以利用实际API使用的数据来优化API库的设计,例如简化不受欢迎的API并识别可以消除的未使用的API。此外,API使用分析在挖掘API使用模式中至关重要,并为API迁移提供支持,它还对软件维护产生积极影响。
为此,我们对5000多个真实Java项目的多样化语料库进行了大规模的实证研究,以深入了解API在实践中的使用方式。我们借助Maven检索项目依赖关系,为大约1.5亿个SLoC 生成准确解析的抽象语法树(AST),从超过150万个AST中捕获使用过的API实体(即包,类,方法和字段),并测量基于我们定义的指标的用法:频率(是否经常使用API)、普遍性(API是否已被广泛使用)和覆盖范围(API是否已被完全使用)。我们分析了几乎所有实际项目采用的API库,包括核心API和第三方API。此外,我们还研究了一些额外的问题,例如构建API子集和选择第三方API的版本。总之,本文做出以下贡献:
它对现代编程语言(即Java)中API的使用进行了大规模,全面的实证分析。
这是深入研究核心API和第三方API的第一项工作,包括使用已弃用的API实体。它也是第一个研究API使用如何指导紧凑配置文件(即 API的子集)的设计。
一些有趣的结果被证明:(1)1%最常用的包占所有API使用量的80%,而70%使用最少的包使用lt;0.5%的API使用率,50%仅lt;0.1%;(2)从未使用过15.3%的类,41.2%的方法和41.6%的核心API字段;(3)9.5%的包装都使用了从未使用的所有辅助方法,29.2%的类别从未使用过所有的辅助方法;(4)已采用51.1%的弃用类,43.5%的已弃用方法和18.1%的已弃用字段。
总之,我们的结果允许API设计者根据经验考虑API的设计是否有助于程序员根据其实际使用情况进行开发。我们的研究还确定了热点(即频繁和广泛使用的API)和冷点(即很少和狭义的API),以通知程序员有选择地学习和采用API。例如,如果从未使用API,则警告程序员在实际开发中谨慎使用它是必不可少的。此外,结果有助于构建适当的API子集,可以在资源受限的设备或高安全性环境中使用。我们相信我们的工作能够实现数据驱动的语言API设计,优化和简化,类似于Cocke在20世纪70年代在IBM研究CISC指令的实际使用方式最终导致了RISC架构。
2方法
本节首先讨论研究的研究问题,然后介绍本研究中使用的语料库的基本信息,并说明我们如何建立和执行实验的过程。
2.1 研究问题
本研究的目的是回答关键的研究问题:如何在真正的开源项目中使用编程语言API。为了更好地调查此问题,我们专注于以下维度:
表2.1 Java语料库概述
API使用的全局视图。当前的大多数软件项目在很大程度上依赖于API库的使用。了解API使用来源可以概述API使用分布,即从现有API(核心API或第三方API)重用多少API实体,以及有多少API实体是针对项目设计和创建的。我们还有兴趣研究采用多少API实体来构建项目,并进一步验证软件的规模是否与API使用相关。此外,我们希望确认API实体的使用服从Zipf分布的传统观点。
核心API使用情况。核心API库是促进编程语言使用的基本API,通常由维护此类编程语言的官方组织开发(例如 Java SE Development Kit,即 来自Oracle的 JDK)。但是,随着新功能的引入越来越多,核心API库的规模正在快速增长,为设备消耗更多资源,并增加了新手程序员的学习曲线。理解核心API 的使用是很重要的,即核心库中的所有API实体是否已被充分利用。推出全新概念,紧凑型材,它们是整个核心API的子集,激励我们类似地检查紧凑型材的利用率。此外,识别热点和冷点可以提示优化当前核心API的设计,并指导新手优先学习本质。我们还研究了已弃用的 API实体的使用。
第三方API使用情况。第三方API库是核心API库的补充,提供核心API不支持的额外功能或具有优选实现的类似功能。其中许多是由信誉良好的商业公司(例如Google的guava)或开源社区(例如来自Apache的commons- *)开发和维护的。我们有兴趣调查项目依赖于第三方API的程度,即一般来说,构建项目需要多少第三方API库。此外,库有多个版本。一般来说,弄清楚典型库有多少个不同的版本会很有趣。研究程序员如何选择和采用具体版本也很重要。
2.2 收集语料库
我们的大型语料库包括5185(包括超过1.5M Java文件和15M非注释代码行)的开源和现实Java项目,其源代码可从Github获得,Github是最受欢迎的存储库托管服务之一。我们通过综合考虑Github提供的观察者,星星和叉子的大小,严格选择基于流行度的应用程序。表2.1列出了语料库摘要信息。语料库是多种多样的,涵盖各种应用领域和规模。它不仅包含由信誉良好的开源社区维护的广泛使用的Java项目(例如Tomcat,Hadoop,Derby来自Apache Software Foundation和JDT,PDT,来自Eclipse Foundation的EGIT),也是由独立程序员开发的相对较小的项目。图1给出了应用程序大小分布的指示,以非注释SLoC的形式衡量。所有应用程序都由Maven管理,Maven是开源社区中最常用的构建管理系统之一。我们的语料库于2014年底建成,所有申请均于2014.12.29-2014.12.31期间从Github签出。
图2.1 语料库中项目规模的分布
2.3 解决依赖关系
大多数软件系统在很大程度上依赖于API库。如果缺少其依赖的API库,则编译和构建项目的过程将失败,这可能导致无法正确解析此项目使用的API实体,与Lauml;mmel等人采用的策略不同。通过网络搜索和下载手动解决了所需的依赖关系,我们采用了最流行和最广泛使用的软件项目管理和理解工具之一Maven来自动处理依赖管理。它支持传递依赖性解析,即计算当前依赖项所需的相关依赖库的闭包,并自动检索所有这些库。项目中的受雇依赖项通常在maven配置文件pom.xml(POM)中指定,该文件与可以检索依赖项的远程存储库集合相关联。依赖关系由其坐标groupId:artifactId:version唯一标识,类似于集成地址和时间戳,将依赖关系创建为项目时确定坐标,图2.2显示了一个涉及项目中依赖关系junit:junit:4.0的示例,属性范围在定义内是指不同环境下的任务的类路径(例如编译,测试,运行时等)。在本研究中,我们专注于提取和分析POM中的依赖关系,总共检索到103,256个依赖项。
图2.2 XML片段显示了Maven如何管理依赖项
2.4 收集API使用情况
编程语言中的API通常是指一组公开的特性或函数,它们有助于程序员使用软件。在Java的上下文中,API通常表示为预先编写的类的集合,与其各自的字段和方法相关联。相关类通常由可以提供访问保护和命名空间管理的包组织。实际上,API通常与可重用的软件库相关,从而有助于代码重用。在本研究中,我们直接将Java API视为Java API实体的集合,包括包,类,字段和方法。术语API的使用是指程序员均采用怎样给定的API库,即采用混凝土API实体到他们的源代码。因此,我们将API使用链接到包,类,方法和字段的实际使用。表2列出了我们在本研究中捕获的API使用的所有典型场景,并与相应的示例相关联。通过使用其声明的类,方法和字段来聚合包的使用。一个值得注意的事情是API实体可能是同音异义词:相同的词汇,对行为有明显的影响。例如,名为get()的方法可以位于类java.util.List或java.util.Set中。我们使用生成的类型信息并获取它们在这种情况下,完全限定名称,即 java.util.List.get()和java.util.Set.get(),以区分它们。在另一种情况下(见下面的代码),
表2.2 本研究中捕获的API使用情况
a仅考虑显式声明的超类。未捕获任何未在声明中显示的继承类,例如 java.util.Collection。
b它还包括在其声明类中的方法调用,例如 public void m1(){...} public void m2(){ m1(); ...}。
c它还包括其声明类中的字段访问,例如 this age = 10;。
Object o = new Object(); o.toString().toString();
第一个方法调用toString()被解析为java.lang.Object.toString(),而第二个toString()被解析为java.lang.String.toString()。基于2.3节中已解析的依赖关系,我们可以从源代码生成已解析的AST,并附加所有API实体的精确类型绑定。
通常,所使用的API实体源自两个来源:外部API库和专门针对单个项目设计的内部API。前者指的是现有库的重用,包括核心API库和第三方库; 后者指的是额外的项目特定功能的实现。在本文中,我们规定:(1)官方JDK被设置为核心API;(2)项目外部导入的其他API库被设置为第三方API;(3)项目中定义的API实体属于项目特定的API。在讨论API使用来源时,我们捕获程序员在开发过程中使用的所有API实体的使用,包括项目特定的实体。我们的目标是弄清楚:有多少API被重用,程序员为特定目的写了多少?当我们在核心和第三方API库的使用进一步的调查中,只有访问 API实体(即通过修改指定的公众在Java中)正在考虑的。
2.5 度量
引入了三类度量来衡量API使用情况:流行度,频率和覆盖率。首先,我们将这些措施正式化,考虑到API库x,P(x)表示在x中定义的包集。我们还使用C(x),M(x)和F(x)来表示该组中的类,方法和字段用x分别。对于任何y isin;P (x),Cp(y),M p(y)和F p(y)分别用于表示y中定义的类,方法和字段的集合。对于任何类z isin; C(x), Mc(z)和Fc(z)用来表示该组中所定义的方法和字段z分别。
因此,我们有:
我们的语料库是一组软件项目:C={S1,S2,S3,...}。当C i是一个班级时,Uc={c1,c2,c3,...}是C中采用的类集。我们使用Oc(S)来表示软件项目S中使用的多态类。我们让mX表示多集合X的多重函数;多样性返回多重性,即类c的出现。当它的结合从上下文中清楚时,我们忽略XUc(S)表示Oc(S)的基础,其指标函数对于具有多重性gt; 0的Oc(S)中的每个类返回1,即S使用的唯一类的集合。同样,我们使用Op(S)
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。