TypeWriter: Neural Type Prediction with Search-based Validation基于搜索的神经网络预测器

ABSTRACT

维护使用动态类型语言(JavaScript,Python等)写的大型数据库是非常有挑战性的。简单
数据兼容性错误激增,缺乏IDE支持和API 难理解。最近的一些工作尝试用静态分析或概率类型推断解决这些问题。不幸的是,对于动态语言的静态类型推断是非常有限的,概率方法也不够精确。这篇论文提出了TypeWriter,把概率预测和基于搜索的类型预测相结合。TypeWriter预测器从包含部分已标注类型的代码库里进行function返回值和参数类型的推断,结合了自然语言属性和编程语言级的信息。为了验证预测类型,TypeWriter引入一个含有不同类型结合的渐进类型检查器,然后进行以反馈为导向的可能的类型组合。

我们的TypeWriter方法基于Python,并在两个代码语料库上进行评估:Facebook的数百万行代码库以及500个流行的开源项目的集合。实验证明,使用上下文是对神经预测器非常有益的。把预测和基于搜索验证相结合,TypeWriter可以完全标注42%到64%的语料库中随机选择的文件并确保类型正确性。和静态类型推断工具的比较表明TypeWriter添加了更多重要类型

INTRODUCTION

动态类型语言越来越频繁使用,随着项目发展,静态类型推断的缺乏也会导致很多问题,比如长时间未被注意的类型错误,IDE支持欠佳,很难理解的API等。为了解决这些问题,许多动态语言都进行类型注释,类型注释通常在运行时被忽略,然而,它们作为开发者使用API和渐进类型检查器的输入时的信息,从而确保不会出现一些错误。

解决类型注释缺乏的一种方法是通过传统的静态分析进行类型推断,不幸的是,动态特征,例如
异构数组、多态变量、动态代码评估和猴子补丁使得对于动态类型语言的静态类型推断变得困难。静态类型推断工具通常仅在类型确定或非常可能(在某些假设下)的情况下推断类型,这大大限制了可以推断的类型数量。

由于上面的困难,一些概率类型预测技术被提出。一种较为流行的方向是利用已经存在的已经被标注的代码作为训练数据来训练神经网络模型,从而预测未被注释的代码类型。一些方法预测代码实体的类型,如从实体出现的代码上下文中预测一个变量或一个函数。其他一些方法利用源码中的自然语言信息,如变量名或注释,作为一些非正式的类型信息的来源。

虽然已有的这些方法在一些场景下预测类型是有效的,但也会出现不准确和组合爆炸的问题。概率类型预测器为每一个缺失的注释提供一个或多个可能的类型,这也留下一个问题,提供的哪种类型对于开发者来说是正确的呢?特别是,已有的预测器不能在跨多个实体的类型注释中选择出类型正确的组合。可以让开发者或工具最终主动选择类型正确的注释,但这是不现实的。

这篇论文提出了TypeWriter,结合了基于学习的概率类型预测和以反馈为导向的,基于搜索的类型预测验证。这种方法解决了不精确的问题,使用渐进类型检查器可以指出相互矛盾的类型注释,基于搜索可以从预测类型组合中选出最合适的那一组。为了搜索到一组具有一致性的类型,我们把这个问题处理为组合搜索,提供一种可以高效找到类型正确的注释的搜索策略。TypeWriter利用代码中展示的大量类型信息,通过一种新的神经网络结构,这种神经网络结构利用了自然语言(以identifier名字和代码注释的形式)和程序上下文(以使用序列的形式)。

为了阐述这种方法,考虑Figure 1中两种待注释的function,给定代码,TypeWriter的神经类型模型预测参数和返回值的可能类型的排序列表,如注释中所示,TypeWriter添加排序最高的预测作为类型注释,不过,这样引入了find_match的错误的返回值类型,基于这种反馈,搜索机制尝试将排名第二的类型Optional[str]作为find_match的返回值类型,这样返回的参数类型str和预测的参数类型int不一致,搜索机制又重新定义参数的类型为预测的第二种str类型,通过类型检查器检查后的结果具有一致性和正确性,然后TypeWriter才把最终类型加入到代码中。

总之,这篇论文做了以下贡献:

1.概率类型预测和基于搜索的类型预测验证的结合。基于反馈导向的搜索机制获取正确的类型注释可以被用到任意的概率类型预测器和渐进类型检查器中。

2.一种新的神经预测器模型,利用代码上下文和自然语言信息。

3.经验证据表明,该方法对于类型注释是有效的,只需最少的人力即可注释大规模代码库。

 APPROACH

Figure 2是对TypeWriter方法的概述。

TypeWriter的输入是包含部分已经注释类型的代码语料库。该方法主要包含三个部分:

首先,一种轻量级的静态分析从给定代码中提取多种信息,包括程序结构信息(function参数的使用和自然语言信息(identifier名称和注释))

其次,一个神经类型预测器,从已经注释了类型的代码及相关信息中学习如何预测缺失类型,一旦训练,这个模型可以预测代码中当前未注释部分的可能类型。

最后,反馈搜索利用已经训练好的模型找到根据静态渐进类型检查器验证过的具有一致性及类型正确的类型分配。TypeWriter的输出是包含额外类型注释的代码。

2.1 静态抽取类型及上下文信息

TypeWriter的第一部分是基于AST的静态分析,抽取对于类型预测有用的类型及上下文信息。这种容易扩展到其他语言。我们当前关注function层级的类型,如参数类型和返回值类型。这些类型飞常重要的原因是:1)给定function级别的类型,渐进类型检查器可以通过推断局部变量类型来检查function内部的类型 。2)function级别的类型作为接口文件,对于每种类型,静态分析会收集四种上下文信息,具体以Figure 3为例

1)与待注释元素相关的identifier名字(dentifier names)

Figure 3中的参数名name和do_propagete表明参数可以分别为str和boolean类型,为了使TypeWriter更好地获取信息,静态分析抽取和每个函数特征相关的identifier name.特别是,抽取函数名和函数参数名。

 2)待注释元素相关的代码序列(Code occurrences)

关于参数类型的信息,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值