xx是一个类型 这在给定的上下文_深度学习类型推断

9c53cc33806667ee90c5a15c800a139e.png

摘要

动态类型的语言(例如 JavaScript 和 Python)正日益流行,但静态类型尚未完全消失:Python 现在支持类型注释,而诸如 Type-Script 之类的语言为 JavaScript 提供了中间立场:JavaScript 的严格超集,它会向其过渡,再加上允许部分键入程序的类型系统。但是,静态类型化有一个代价:添加批注,阅读添加的语法以及与类型系统进行角力以修复类型错误。类型推断可以简化向更多静态类型代码的过渡,并释放丰富的编译时信息的好处,但是在 JavaScript 之类的语言中受到限制,因为它无法通过 eval 很好地处理鸭子类型或运行时评估。本文建议使用 DeepTyper,这是一种深度学习模型,它可以了解在某些上下文和关系中自然会出现哪些类型,并可以提供类型建议,即使最初无法推断类型,该类型建议也通常可以由类型检查器进行验证。DeepTyper 利用自动对齐的标记和类型的语料库来准确预测成千上万的变量和函数类型注释。此外,本文证明了上下文是准确分配这些类型的关键,并介绍了一种减少对局部提示的过度拟合同时强调需要进一步改进的技术。最后,本文证明了本文的模型可以与编译器进行交互,以超过 95%的精度提供 4,000 多个其他类型注释,而这些注释必须借助 DeepTyper 才能推断出来。

关键词

类型推断,深度学习,自然性

1、 研究内容

现实世界中软件工程中使用的编程语言千差万别,选择语言时通常会对它的设计和质量抱有坚定的信念。反过来,学术界也越来越重视评估重要设计决策的实际影响,例如类型系统的强度,静态/编译时和动态/运行时类型评估之间的权衡。有证据表明,静态类型很有用:Hanenberg 等。Gao 等人在大规模的用户研究中表明,静态类型的语言增强了未记录代码的可维护性和可读性,并具有修复类型和语义错误的能力。发现在 JavaScript 中使用类型注释可以避免 15%的报告错误,Ray 等人。根据经验,在开源项目中,静态类型的功能语言的故障发生率较低。

同时,一些最流行的编程语言是动态的,相对较弱的类型:受深度学习兴趣推动的 Python 已升至 IEEE Spectrum 排名的首位;由于包括 NodeJS 的综合软件包生态系统在内的各种原因,JavaScript(JS)在 Web 开发中和在 Web 开发中均稳步增长。实现诸如 JS 之类的语言的好处是许多研究的主题。这通常是通过动态分析(例如 Jalangi)来完成的,因为这些语言的静态类型推断会通过鸭式输入和 JS 的 eval()等功能而变得复杂。

已经开发了包括 TypeScript(TS)在内的几种语言,提出了一种替代解决方案:它们使用允许部分键入的类型系统增强了现有语言,可以将其转换回原始语言。这样,TS 可以在 IDE 中使用和编译,并具有键入的所有优点,并且可以转换为“普通” JS,以便可以在常规 JS 可以使用的任何地方使用它。这降低了键入现有代码的门槛,同时(至少部分地)解锁了编译时类型检查的好处。

尽管开发人员可能会从诸如 TS 之类的 JS 类型方言中受益,但从 JS 到 TS 的迁移路径却颇具挑战性,因为它需要注释现有的代码库(可能很大)。这是一个耗时且容易出错的过程。幸运的是,TS 在开源生态系统中的受欢迎程度的增长为本文提供了从真实数据中学习类型推断的独特机会:它提供了带有类型注释的类似 JS 的代码数据集,可以将其转换为对齐的训练代码语料库及其对应的类型。本文使用这些数据来训练 DeepTyper,该 DeepTyper 使用对现有类型代码的深度学习来推断 JS 和 TS 的新类型注释。它学习用类型矢量注释所有标识符:类型上的概率分布,本文用来提出类型,验证者可以检查这些类型并将其作为类型建议转发给用户。

在这项工作中,本文演示了深度学习在此任务上的普遍适用性:它基于名称和(可能广泛的)上下文,以强大的直觉丰富了常规类型推断,同时还确定了进一步研究中需要解决的挑战,主要是:已建立的模型(在本文的例子中是深度递归神经网络)很难在函数的整个长度上传递依赖关系,从而保持一致。经过训练后,DeepTyper 可以推断出编译器的类型推断无法建立的标识符的类型,本文通过在大量代码中复制真实世界的类型标注来进行演示。 DeepTyper 建议在召回值为 50%时,类型注释的精度应超过 80%,通常会提供正确的类型或至少将潜在类型缩小到一小组。本文的贡献是三方面的:

(1)一种使用对齐语料库和可区分类型向量的类型推断学习机制,可将离散类型分配任务简化为连续的实值向量函数。

(2)演示了使用深度学习进行类型推断的潜力和挑战,特别是对现有 RNN 的拟议增强,提高了整个文件中类型注释的一致性和准确性。

(3)概率学习者与声音类型推理引擎之间的共生,相互促进了性能。 本文还展示了与 JSNice 的互利共生,它解决了类似的问题。

2、 研究结果

2.1 用于类型推断的深度学习

本文首先在测试数据上显示深度学习模型的整体性能,包括纯 RNN 和本文的变体 DeepTyper,并通过一致性层对其进行了增强。表 2 列出了 w.r.t.的真实类型的预测精度(前 1 名和后 5 名)。 GOLD 数据集上 78 个测试项目中的模型。本文包括一个朴素的模型,该模型为每个标识符分配其在训练时所具有的分布类型。该模型在不考虑任何标识符上下文的情况下达到了可接受的准确性,从而使本文想到了任务的哪一部分相对简单。徐等。报告了类似的 Python 代码结果,尽管本文强调这不是其模型的实现。DeepTyper 通过包含上下文信息大大超过了它,并在 GOLD 数据集中实现了近 60%的 top-1 准确性和 80%以上的 top-5 准确性。

90e519fd21a812afc3d213bbd9a7b7b9.png
76e5fa8be71dc98ed9584bbab34c9567.png

2.2 常规类型推断

本文将结果与通过在测试语料库中的每个项目上使用 CheckJS 运行 Type-Script 编译器获得的结果进行比较。本文的主要兴趣是混合模型:当编译器可以访问每个测试项目的完整构建信息时,其类型判断是正确的(尽管 CheckJS 可能会做出少量不合理的启发式预测)。不确定并默认为任何位置的情况是深度学习者可以做出贡献的位置,因为它“了解”各种位置的自然类型。因此,混合模型首先为每个变量分配其 CheckJS 类型。当 CheckJS 为标识符分配任何值并且 DeepTyper 对它的建议有足够的把握时,混合动力将切换为 DeepTyper 的建议类型。根据图 5,本文使用 90%,99%和 99.9%的置信度阈值在高精度(此设置中首选)和召回率之间取得平衡。

cc857845bae06d586aa96066e49da902.png

2.3 与 JSNice 的比较

本文从 GitHub 上的公共项目中随机选择了统一的 JavaScript 函数,这些项目是按星数排名的前 100 个 JavaScript 项目。为了避免使用琐碎的函数,本文选择了带有至少一个参数并返回一个值或在其主体中具有至少一个声明的变量的函数。因此,每个函数至少需要两个类型注释。由于评估必须手动执行,因此本文检查了 30 个 JavaScript 函数。11 对于每个函数,本文手动确定了正确的类型以用作评估和比较的预言机,如果没有确定性的类型,则可以分配任何类型。结果,本文确定了 167 个注释(关于函数返回类型,局部变量,参数和属性),其中 108 个注释显然不是任何类型。

同样,本文专注于仅预测非任何类型,因为这些类型最有可能对用户有所帮助。JSNice 预测了哪些案例?或 Object,以及 DeepTyper 预测有把握或没有足够把握的情况都被视为“不确定”。本文再次显示 DeepTyper 的各种置信度阈值的结果(跨度稍低一些,以更好地匹配 JSNice 的“不确定”率),并包括另一个混合模型,其中 DeepTyper 可能会尝试“纠正”两种情况 JSNice 不确定(或根本没有注释类型),并且 DeepTyper 有足够的信心。结果示于表 5。

与 JSNice 相比,在最低阈值下,DeepTyper 会得到更多正确和错误的类型,而在最高阈值下,DeepTyper 不会犯任何错误,同时仍能正确注释三分之一以上的类型。 JSNice 犯了一个错误,即它在给定上下文的情况下分配了一种过于具体的类型。12 本文还计算了“部分”正确性,其中给定的类型过于具体但与正确的类型非常接近。这包括 JSNice 和 DeepTyper 都建议使用 HTMLElement 而不是 Element 的情况。

总体而言,尽管 DeepTyper 和 JSNice 在此任务上的性能非常相似,尽管 DeepTyper 主要接受过 TypeScript 代码的培训,使用的是更大的类型词汇,并且不需要有关令牌的任何信息。两种方法也非常互补。当 JSNice 提供类型时,它几乎永远不会出错,但是它常常不确定,不提供任何内容,而 DeepTyper 做出更多的预测,但是比 JSNice 经常出错。如果 JSNice 无法提供类型,则首先查询 JSNice 并使用 DeepTyper 的混合方法显示了对每种方法的孤立性的显着改进,并表明 JSNice 和 DeepTyper 在不同的上下文和不同的类型中都能很好地工作。当使用 90%置信度阈值时,混合模型将准确性提高 12.9%点(从 51.9%到 64.8%),同时不引入任何其他不正确或部分正确的注释。阈值为 0%时,混合模型比两个模型分别正确的可能性要高 15%以上,同时引入的错误比 DeepTyper 本身要少。

3、 总结

本文的工作旨在研究从基础代码可以在何种程度上学习类型注释,以及此类学习者是否可以帮助程序员降低注释税。本文的结果是肯定的:本文证明,对于给定代码的类型,深度学习者可以实现强壮的概率类型,这些代码可以跨项目,并且可以扩展到 TypeScript 和普通 JavaScript 代码。本文还强调了它们目前存在的缺陷,并希望激发人们进行进一步改进的研究。更有希望的是,即使在注释任务可以访问完整的构建信息的情况下,DeepTyper 也被证明是对注释任务的编译器类型推断引擎的补充。他们可以共同预测高精度的数千个注释。本文的工具还与普通 JavaScript 函数上的 JSNice 互补,这表明本文的模型正在从先前的工作中学习新的,不同类型的信息。本文的发现证明了从对齐的语料库中学习传统软件工程任务(特别是类型推断)的潜力。

4、致谢

本文由南京大学软件学院 2018 级博士杨乙霖翻译转述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值