英语原文共 20 页,剩余内容已隐藏,支付完成后下载完整资料
了解Java中的API用法
摘要
应用程序编程接口(API)有助于使用编程语言。它们定义了与软件程序进行交互的规则和规范集。语言API的设计通常是艺术性的,受到美学关注和语言设计师的直觉的驱动。尽管最近对有限的API使用范围进行了研究,但仍缺乏全面的定量分析来探索和寻求了解真实源代码如何使用语言API的方法。目的:本研究旨在了解在实际开发中如何使用API,并根据API使用情况分析的结果探索其潜在应用。方法:我们对Java上API的实际使用情况进行了大规模,全面的实证分析,Java是一种现代,成熟且广泛使用的编程语言。我们的语料库包含5000多个开源Java项目,总计1.5亿个源代码行(SLoC)。我们研究了核心(官方)API库和第三方(非官方)API库的用法。我们会自动解决项目依赖关系,生成准确的解析抽象语法树(AST),从超过150万个AST中捕获使用过的API实体,并根据我们定义的指标(频率,受欢迎程度和覆盖范围)衡量使用情况。结果:我们的研究提供了详细的定量信息和产量方面的见识,特别是(1)证实了使用API服从Zipf分布的传统观点;(2)证明核心API未得到充分使用(许多类,方法和字段从未使用过);(3)发现不赞成使用的API实体(其中一些早已不推荐使用)仍在广泛使用;(4)评估当前紧凑型材的使用未得到充分利用;(5)标识API库的热点和热点。结论:我们的发现暗示了在语言API设计,优化和限制,API教育,库推荐和紧凑配置文件构建方面的潜在应用。
1.简介
语法和语义定义了一种编程语言。应用程序编程接口(API)有助于其使用。当今大多数软件项目都严重依赖于API库的使用[1]。它们提高了代码重用性,降低了开发成本,并提高了程序员的生产率。然而,由于美学上的关注和API设计师的直觉,API设计一直具有艺术性和偏颇性。他们通常对程序员如何实际使用API的知识有限,这导致引入了许多不自然且很少使用的API功能,而没有一些预期的功能[2,3]。同时,不断增长的API(已引入了越来越多的功能)仍然是阻碍新手程序员其发展的主要障碍。此外,API库已成为选择编程语言最有影响力的因素之一[5]。 API的不良设计会增加开发人员的学习曲线,并极大地影响他们的生产力。因此,了解当前API库的实际用法并优化设计以提高程序员的API可用性非常重要。
研究大量现实世界中的程序如何使用API可以帮助验证或反驳关于哪些API最被采用,最有用,最容易使用的许多流行的“理论”;关于流行文学和互联网上的编程,API是否已被程序员等充分使用。对于语言教育,API与它们的实际用法之间的差距可以指导教学法,使教师了解什么是常见的(也许应该是)和罕见的(也许应该不是)。它还指导新手程序员选择成比例的较小部分,即整个API的大多数实质,以减少学习成本。另外,API使用率分析对于挖掘API使用模式至关重要,并为API迁移提供支持。它也对软件维护产生积极的影响。为此,我们对超过5000个现实世界Java项目的不同语料库进行了大规模的实证研究,以了解API在实践中的使用方式。我们借助Maven [13]检索项目依赖项,为大约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%的最不经常使用的软件包占所有API使用的lt;0.5%,仅50%lt;0.1%;(2)从未使用过核心API的15.3%的类,41.2%的方法和41.6%的字段;(3)9.5%的软件包具有从未使用过的所有从属方法,而29.2%的类具有从未使用过的所有从属方法已采用核心API中51.1%的不赞成使用的类,43.5%的不赞成使用的方法和18.1%的不赞成使用的字段。综上所述,我们的结果使API设计人员可以根据实际使用情况,从经验上考虑API的设计是否有助于程序员的开发。我们的研究还确定了热点(即频繁使用的API)和冷点(即很少使用的API)来告知程序员选择性地学习和采用这些API。例如,如果从未使用过API,则提醒程序员在实际开发中谨慎使用它们是必不可少的。此外,结果有助于构建API的适当子集,这些子集可以在资源受限的设备或高安全性环境中使用。我们相信我们的工作可以实现数据驱动的语言API的设计,优化和简化,类似于Cocke在1970年代在IBM上对CISC指令的实际使用进行的研究最终导致了RISC体系结构的研究[14]。
2.方法论
本节首先讨论所研究的研究问题,然后介绍本研究中使用的语料库的基本信息,然后说明我们如何设置和执行实验的过程。
2.1研究问题
本研究的目的是回答关键的研究问题:在实际的开源项目中如何使用编程语言API。为了更好地调查这个问题,我们关注以下方面:
API使用情况的全局视图。当前大多数软件项目都严重依赖于API库的使用。了解API使用来源可概述API使用分布,即从现有API(核心API或第三方API)重用了多少API实体,以及针对项目专门设计和创建的API实体。我们也有兴趣调查一般采用多少API实体来构建项目,并进一步验证软件的规模是否与API使用率相关。另外,我们希望确认使用API实体服从Zipf分布的传统观点。
核心API使用情况。核心API库是必不可少的API,可促进编程语言的使用,该语言通常由维护此类编程语言的官方组织开发(例如Java SE Development Kit,即Oracle的JDK [15])。但是,随着新功能的引入越来越多,核心API库的规模正在迅速增长,消耗了更多的设备资源,并增加了新手程序员的学习难度。了解核心API的用途(即核心库中的所有API实体是否已全部使用)非常重要。紧凑型概要文件是整个核心API的子集,它引入了新概念,这促使我们以类似的方式检查紧凑型概要文件的使用情况。此外,识别热点和冷点可能有助于优化当前核心API的设计,并指导新手优先学习其本质。我们还将调查已弃用的API实体的使用。第三方API使用情况。第三方API库是对核心API库的补充,提供了核心API不支持的额外功能或具有最佳实现方式的类似功能。其中许多是由知名的商业公司(例如Google的番石榴)或开源社区(例如Apache的commons- lowast;)开发和维护的。我们对调查项目在多大程度上依赖第三方API感兴趣,即通常需要多少第三方API库来构建项目。另外,一个库有多个版本。弄清楚一个典型的库通常有多少个不同的版本会很有趣。研究程序员如何选择和采用具体版本也很重要。
2.2收集语料库
我们的大型语料库由5185个(包括超过150万个Java文件和1500万个非注释代码行)开源和实际的Java项目组成,这些项目的源代码可从Github(最受欢迎的存储库之一)获得。托管服务。我们会综合考虑Github提供的观看者,明星和前叉的大小,根据受欢迎程度严格选择应用程序。表1列出了语料库摘要信息。语料库是多种多样的,涵盖了各种应用领域和规模。不仅包含由知名的开源社区维护的广泛使用的Java项目(例如Apache Software Foundation的Tomcat,Hadoop,Derby和Eclipse Foundation的JDT,PDT,EGIT),还包含独立程序员开发的相对较小的项目。图1给出了以非注释SLoC度量的应用程序大小分布的指示。所有应用程序均由Maven [13]管理,Maven是开放源代码社区中最常用的构建管理系统。我们的语料库建于2014年底,在2014/12/29至2014/12/31之间从Github签出了所有申请。
2.3解决依赖性
大多数软件系统严重依赖于API库[1]。如果缺少依赖的API库,则编译和构建项目的过程将失败,这可能会导致无法正确解析此项目使用的API实体。与Lauml;mmel等人采用的策略不同。通过Web搜索和下载手动解决了所需的依赖项[16],我们使用了最流行和使用最广泛的软件项目管理和理解工具之一Maven,自动消除了依赖项管理[13]。它支持传递依赖项解析,即计算当前依赖项需要的相关依赖库的关闭,并自动检索所有它们。通常在Maven配置文件pom.xml(POM)中指定项目中使用的依赖关系,该文件与可检索依赖关系的远程存储库集合相关联。依赖项由其坐标groupId:artifactId:version唯一标识,类似于集成地址和时间戳。在将依赖项创建为项目时确定坐标。显示了一个在项目中涉及依赖项junit:junit:4.0的示例。定义中的属性范围是指不同环境(例如,编译,测试,运行时等)下任务的类路径。在这项研究中,我们专注于POM中依赖项的提取和分析。总共检索了103,256个依赖项。收集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()来区分它们。在另一种情况下(请参见下面的代码),Object o = new Object(); toString(),String();第一个方法对对象o的toString()调用解析为java.lang.Object.toString(),而第二个toString()解析为java.lang.String.toString()。根据第2.3节中已解决的依赖性,从源代码中对已解析的AST进行了优化,并为所有API实体附加了准确的类型绑定。引入了三类度量标准来度量API使用情况:流行度,频率和覆盖率。首先,我们将这些措施正式化。考虑API库x,Pl(x)表示在x中定义的一组软件包。注意,请注意x中的一组类,方法和字段。对于任何包yisin;Pl(x),Cp(y),Mp(y)和n Fd(y)分别表示y中定义的一组类,方法和字段。对于任何类别zisin;Cl(x),Mc(z)a n d Fc(z)分别表示z中定义的方法和字段集。计算API库(或Entity2)的流行度是为了评估它是否在社区中被广泛使用,即被尽可能多的项目采用。在我们的语料库中,我们采用指标NP(x)/ RP(x),即使用特定API库(或实体)的项目数量/比率来衡量其受欢迎程度。频率。计算API实体的频率是为了评估它在实践中是否经常使用。对于API实体x,我们计算其简单发生次数(SO(x),其中不包括x的从属实体的出现)和累积发生率(CO(x),其中包括SO(x)与lus o f o x的从属实体)。在计算类的CO(x)值时,应同时计算自身的SO(x)值及其在该类中定义的方法和字段。关于以下代码,System.out.printlin(“ Hello World!”); SOc(java.lang.System)= 1而COc(java.lang。System)= 2,因为使用了其声明的字段java.lang。 System.out也应计算在内。此外,我们使用PSO(x)或PCO(x),即平均SO(x)或CO(x)v aleacute;pe r Project,来测量使用x的单个项目中x的“局部”频率。覆盖范围。计算API库(或entity3)的覆盖范围是为了评估程序员是否充分使用了它。关于类别覆盖率Covc(x)(即单个类别的覆盖率),我们计算至少使用w.r.t.的覆盖的公共方法(或字段)的比率。类x中定义的所有公共方法(或字段)。同样,我们使用覆盖的公共类(或方法和字段)的比率来估算包覆盖率Covp(x)(即单个包的覆盖率)。关于库覆盖率Covl(x)(即API库的覆盖率),可以采用覆盖的公共包(或类,方法和字段)的比率。 API的覆盖率越高,表示API利用率越高。
3. API使用情况的全局分析
3.1 API的使用来源
对软件工程的研究表明,重用可以提高开发团队的生产力,缩短产品上市时间并提高软件产品的整体质量[22]。采用API库是一种有效且有效的重用方法[23]。我们对API来源感兴趣,以便找出现有API库中有多少代码可重复使用,以及有多少新添加的代码。为此,我们收集所有API的使用,包括特定于项目的API实体,这些API可能受保护或仅供内部使用。我们还显示了图3中按项目分类的API使用来源的分布。从类的角度来看,核心API库的使用在所有API使用中占相对较大的比例(35–53%),而第三种使用第三方库所占比例较低(8–32%)。从方法的角度来看,物源分布看起来很相似,其中使用特定于项目的方法所占的比例更高。与表4中的结果类似,使
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[237950],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。