英语原文共 20 页,剩余内容已隐藏,支付完成后下载完整资料
语法和语义定义一门编程语言,而应用程序编程接口(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的援助,产生精确的解决抽象语法树(AST)约1亿5000万行,捕捉用API的实体(即包、类、方法和字段)从超过150万的成本,根据我们的定义和衡量指标的使用方法:频率(是否一个API已经被频繁使用),人气(无论是一个API已广泛应用)和覆盖(无论是一个API已经完全使用)。我们分析了几乎所有的API库所采用的实际项目,包括核心API和第三方API。此外,我们研究了一些额外的问题,API的子集和第三方的API的版本选择,例如建设。综上所述,本文做了以下贡献:
·它提出了一个大规模的,全面的,对一个现代的编程语言的API的使用实证分析,即java;
·这是第一个深入研究核心API和第三方的API的工作,包括实体使用过时的API。这也是第一个研究如何使用API的设计紧凑的配置文件(即API的子集);
总之,我们的研究结果允许API设计经验考虑API的设计是否有利于程序员的发展,根据他们的实际使用。我们的研究还确定了热点(即频繁和广泛使用的API)和冷点(即很少和狭义的使用API)通知程序员有选择性地学习和采用的API。例如,如果API从未被使用,提醒程序员谨慎使用它们在实际开发中是必不可少的。此外,结果帮助建立适当的API的子集,可以在资源受限的设备和高安全性的环境。我们相信,我们的工作可以使数据驱动语言API的设计,优化和简化,类似于Cocke的研究在IBM在上世纪70年代对指令最终导致了RISC架构实际使用。
软件工程的研究表明,复用可以提高开发团队的生产力,缩短上市时间,提高软件产品的整体质量。采用API库是一种有效、高效的复用方法。我们对API起源感兴趣,以了解从现有API库中重用多少代码,以及新添加多少。为此,我们收集了所有API的使用,包括项目特定的API实体,它们可能是内部使用的保护或私有的。
表4显示了API来源的分布,从全局的角度来看,API实体的使用是由它们的值来计算的。从类的角度来看,我们发现超过40%的使用类源于核心API库,而15%来源于第三方库。其余45%个内部具体实施项目。从方法的角度,从一个大比例的第三方库账户的使用(23.27%,其中2.27%的人没有正确地解析,5也来自于第三方库)和相应的核心库的使用方法,下降到15%。从以上两分布明显不同,从现有的图书馆使用领域(含核心API和第三方库)占比较小(12%)。一个可能的原因是,大多数领域的设计状态的对象的记录,这通常是由程序员通过相应的方法,如干将。访问或操作这些字段的任务由它们的声明类单独执行,剩余的静态和公共字段只能访问一个很小的比例。
我们还介绍了API的使用出处分布图3项目。从类的角度来看,使用核心API库占了相当大的比重(35 - 53%)的所有API的使用,而使用第三方库占较低的比例(8 - 32%)。从方法的角度来看,出处分布看起来类似,其中使用特定项目的方法占较高比例。与表4中的结果类似,项目特定字段的使用仍然占主导地位。
总之,目前的软件项目依赖于使用API库。大约45%的使用的API实体从现有的API库(从核心API和第三方库15.53%)。换句话说,如果我们简化软件开发作为一个实体组成的API的工作任务,编码45%(的SLOC)应通过重用现有的API函数库来完成的,而剩下的55%的工作是需要进行从头开始。核心API和第三方库都是软件开发的基础。
从表1中的数据,我们发现,平均而言,一个班,每两行;一种方法是采用每三行一场采用每五行。同样,一个java文件有47类,37种方法和21场平均推测项目大小与API使用紧密相关的就是合理的。为了验证我们的直觉猜想,我们生成日志记录API–地块实体计数(包括类、方法和字段分别)每项目关于项目大小。图4(a)-(c)演示结果。项目规模增长快于所采用的API实体的数量,表示约线性趋势。基本上每个项目使用少于100000个API类(或方法、字段)。我们还生成一个日志–对数图的不同API的实体的数量(包括类、方法和字段分别)每个项目的项目采用以大小。图4(d)-(f)展示了结果,这清楚地表明,项目规模增长快得多,比唯一使用的API实体的大小。大多数项目采用少于10000个唯一的API类(或方法、字段)。
一个功法表明,一小部分的元素是非常常见的,而很大一部分是非常罕见的。在软件系统上的一些指标已遵守遵守幂律[ 24 - 26 ]。识别这些规律有利于捕捉潜在软件的特性,它们的存在对软件工程具有重要意义。在这项研究中,我们有兴趣在调查是否API的使用也服从功法。我们采用的度量包频率(CO P)来验证这个假设。
图5(a)表明,少量的包占最核心的API使用。前1%名的包占80%所有API的使用和3%大帐户为90%。重尾覆盖许多很少使用的包,70%的最不经常使用的包占不到0.5%的所有API的使用;50%小于0.1%。我们也适合一些候选分布的API使用数据。图5(b)表明幂律分布比对数正态分布更适合。
目前,大多数API不断引入新的API实体,实现额外的功能和功能,使他们的足迹巨大。API的设计者很少采取行动来修剪和简化API随着时间的推移。我们发现,大量的API实体很少被程序员采用。重尾直接识别的API的冷点,以简化和优化的可能目标。这是非常重要的API设计人员重新考虑他们的API的设计,根据其实际使用前,他们计划开发一个新的版本,例如移动非常不受欢迎的API实体从内核到可选的功能集。当然,这是不公平的只采用一种度量频率确定冷点,因为一些API的实体,这是唯一的一次(如配置全局设置)在大多数应用中,使用更少的使用频率比别人。我们采取一些其他指标,如覆盖面和普及,考虑在未来几节。
API覆盖分析被认为是帮助API迁移和提高API可用性的主要方法。它也可以被用来检查API库是否得到充分利用。新功能不断推出,而很少有现有的功能,很少使用已被删除的核心API。预计将导致核心库和设备的资源消耗的快速增长。我们希望找出这些基因的核心API,很少或从未接触过的程序员和简化的API库提供建议。
覆盖范围不可避免地受到新API实体的核心API版本的影响。我们首先讨论核心覆盖从java API 8。从图书馆的角度报道(由Covcl、Covml和Covfl测量),我们发现15.3%的类的方法和字段41.6% 41.2%是从来没有在任何工程所采用的语料。为了进一步分析包的覆盖范围(即已封装在一个包中的类或方法的比率)和类覆盖(即的比率的方法或字段已被覆盖的类)中详细,我们采用的度量covcp和covmp评估包覆盖,Covmc和covfc评估类的覆盖。图6(a)-(d)显示结果,我们分别讨论它们。
API热点是在实践中广泛使用的API实体,它可以作为开发者和新手理解、学习和重用给定库的指导起点。我们发现最流行和常用的API的实体核心API。表8–11验证结果,共享类似的结构。第一列显示了每个API的实体名称;第二列列出它的普及(RPP,RPC,转速和RPF值包、类、方法和字段分别)和相应的ranking7;第三列频率(COP,SOC,SOM和SOF值包,类,方法和字段分别)和相应的排序;最后一栏显示其平均频率在项目使用它(PCOP,PSoC PSOM和psof值包、类、方法和字段分别)。对于使用套餐,不出所料,java。郎,根据和一个是前三的流行包,在他们的知名度(90%)和频率(超过3.0e 06)远远超过其余的包。一些语言的特点,通过核心API库实现,例如反射(java。reflect),正则表达式(java中使用java. regex),并发(java util。并发)和注释(java。lang.annotation),也被广泛使用。关于使用类,在三个最常用的包的类也占主导地位的最受欢迎的类,这主要涉及到异常(5 / 20),集合(5 /),字符串(2 / 20)和内置注释(2 / 20)。使用注释,特别是java.lang.override,远远超出我们的预期。我们随机检查一些项目,发现注解@Override和@ suppresswarnings使用最多的是由现代IDE自动生成(例如Eclipse),每当一个类并重写一个方法或指定编译器警告应在注释元素抑制。程序员很少实例化内置注释。我们还发现,采用异常是频繁的,这可能是由于异常处理机制。任何可能抛出某些异常的调用方法都必须包含可以捕获此异常的尝试语句或指定它可以抛出异常的方法。这样的语言的限制,必然导致异常相关的类的使用增加更多的在7节讨论。最流行的方法是主要来自三大使用java类。lang.string,java.lang.list和java.lang.map。他们专注于收集和字符串的操纵。领域的使用越来越广泛分布;他们主要处理的阈值(例如java。lang.integer。max_value),系统的I/O(例如java。lang.system。出)和设置常数枚举(如java,util。现场。英语)。我们还包括一个特殊领域命名的长度,即建立在数组类型的成员,因为数组是java对象的特殊性。它的普及率要高得多,因为它不是一个特定的类领域。
API实体的频率和普及并不总是一致的。以packagejava.lang。反映为例,其RPP值排名第六,而COP值仅排名第十八。这可能是因为包装的不同尺度(即类包中包含了大小)。对于包java.awt和java.lang.reflect,虽然前者包采用较少的项目,它的子类的数量远远超过那些在后面的包的数量,容易形成累积增加使用频率。此外,平均频率(即PCO或PSO值)与UI相关的API的实体(javax.swing为例)比其他单位高很多。
上述的发现使我们了解API的实体的一个特殊群体,具有较高知名度和较低的频率。表12和表13表明,API的类和方法的结果,并达到规定的普及(RPge;20%)。表中的所有实体按其PSO值排序。我们发现这些类与I / O,初始化和服务,通常需要一个单一的使用在写代码。同样,表中的方法主要用于加载属性、创建URL连接以及在I / O.中执行读写操作。
一个API可以声明部分本身不。在一般情况下,程序员都劝阻使用已过时的API的实体,因为它可能是危险的,或者更好的替代API实体的新版本提供。然而,我们发现过时的API的实体仍然在实践中的应用。探讨程序员使用它们,我们捕捉到所有采用过时的实体从我们的语料库。java提供了两种机制,反对一个API的实体:(1)利用建立在注释@弃用前API的实体声明;(2)使用“过时的标签将显示一个API实体使用javadoc。我们捕捉两种情况下的反例的使用来说明。
从项目的角度看,48.5%(2513 / 5185)都采用至少一个过时的API的实体,其中30.3%(1575 / 5185)使用过时的课,38.8%(2012 / 5185)使用过时的方法,和15.1%(785 / 5185)使用过时的领域。只有51.5%的项目在我们的语料库的应用API无实体标记为过时的API文档。数据表明,使用API单位仍在大量使用在许多项目。
我们进一步探讨废弃实体使用的核心API。在JDK1.8,我们发现51.1%(24 / 47)的过时的课,43.5%(240 / 552)的过时的方法,和18.1%(13 / 72)的过时的领域是通过程序员。表14显示了分布的使用已过时的API的实体不同的核心API的版本,无论大小独特的过时的实体的使用和简单的事件和单独列出。过时的实体,特别是方法,从JDK1.1,大量使用JDK1.2和jdk1.4。我们也列出前10用过时的API的实体表15–17。在转化为指定格式的getter方法是由不同的工程采用。一些大量使用过时的API的实体,如法java.lang.thread。stop(),本质上是不安全的,可能导致任意行为。
现象近一半的项目采用低复杂实体的API;过时的API的类和方法有一半是用强烈的表明,大量使用过时的API单位。确定它们如何使用,特别是那些可能导致错误的行为,有利于发现和定位源代码的潜在漏洞。
除了使用核心API库,程序员通常选择适当的第三方库,以最大限度地提高代码重用和提高开发过程的效率。在全球范围内,项目在我们的语料库雇用103256外部第三方依赖。假设我们忽略了库有多个版本的可能性(在第5.3节中讨论),采用了16329个不同的第三方库。然而,大多数使用集中在有限的范围内。在语料库中,只有15的图书馆采用
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[137259],资料为PDF文档或Word文档,PDF文档可免费转换为Word
课题毕业论文、外文翻译、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。