近几年,人工智能迅速发展,在各行各业都有所应用,特别是近两年,面向开发者的AI开发工具也是层出不穷,特别是从 工具中看到了AI对开发者带来的无限可能性。本文主要介绍目前业界比较实用的几款智能开发工具,并会在后续的文章中做一些更为详细偏个人使用感受的对比评测。
本文涉及到的工具包含国外的Kite、、、 、微软,国内的阿里云Cosy、。
简单来说,支持的语言及IDE种类最多, 提供的补全效果更惊艳,阿里云Cosy的代码搜索功能最丰富,接下来让我带你一起详细了解一下。
一、Kite
说到业界在代码智能补全领域发布最早的工具,Kite便是其中之一,它成立于2014年,在Atom/Vim/等编辑器发布代码智能提示插件,初期只面向开发者,当前扩展到面向绝大部分主流开发语言。并于2020年初发布插件,2021年初发布插件。
Kite支持目前主流的16种开发语言以及16种代码编辑器,但是从我的使用体验上来看,其最擅长的还是语言,毕竟是Kite最早支持的语言类型。效果较好的语言:
支持功能代码搜索(支持)使用体验
由于Kite主打的是语言,所以我主要在中进行试用,Kite需要先安装一个独立应用(目前Kite官网不知道什么原因,已经关闭了下载入口),通过该应用向各种IDE安装插件,这个独立应用时不时会自动弹出来,是比较烦人的。
Kite最主要的功能是代码智能补全,从补全效果来看,它不擅长生成长序列代码片段,生成出的最长代码通常只有两到三个单词,但是它最主要的亮点在于它能对IDE自带的补全结果进行整体的排序优化,我们知道IDE自带的补全效果是比较一般的,很多只是根据API名称进行简单的排序,稍微好一些的会根据使用的频率进行排序,而Kite会结合代码的上下文,根据开发者的需求,将开发者更可能用到的API排在最上面,从而减少开发者的输入。但是这种方式带来的体验提升有限,跟自带的补全差别不会很大,特别是的新版提供了基于机器学习的排序优化。
下面展示几个补全示例:
1)Kite根据上文能自动补出Flask的导入,但是第三项只补了一半。
2)补全结果中只带有Kite Logo的是Kite生成的结果,如果是Kite Logo与IDE自带图标组合的表示是Kite对IDE结果进行了排序优化,我们可以看到Kite能生成 app = Flask() 这种长序列的代码,但是排序比较靠后。
3)从下面的示例中可以看到Kite生成了比较多的结果,总体还是不错的,但是像rule、list 这两个变量是不存在的,需要开发者删掉重写,这个问题也是诸多代码补全工具的共性问题。由于它们是从开源代码中学习到诸多模式,但是这些模式不一定适合本地工程,就很容易生成在本地工程中存在语法错误的代码。
在其他语言上,Kite的表现就不太理想了,比如在Java上会提供很多错误的补全结果,而且大部分也只有单API的补全结果,基本上没太大用处,后面的文章会有更详细的评测。
总体来说,Kite适合喜欢短序列补全结果的开发者。
二、
除了Kite,业界另一个涉足最早涉足该领域的工具是,成立于2013年,在2014年下旬发布第一个插件版本,主要面向Java开发者。但是,目前公司收购之后,已经放弃了这款插件,并将老产品改名为了。效果最好的语言:Java
支持功能代码示例搜索(支持Java、)使用体验
的代码补全功能能在一些非常通用的代码上提供补全结果,在代码模板的推荐效果上比较好,可以认为是IDEA代码模板的补充,但是在代码上下文识别、变量自动填充等方面效果比较一般。
下面展示几个示例:
1)在补全时能生成了非常多的补全结果,但是补全结果太多,很多时候是比较打扰我编码的,会把IDE自带的补全挤到很后面,而且有很多不太准确,同时也存在类似Kite的语法错误问题,比如下图中的 url 变量是不存在的。
2)我们再来看看变量的自动填充效果如何:当上文中存在变量时,有一个补全项自动填充了变量,但是其他的补全项并没有识别到已经声明了文件路径的场景,反而推荐了各种代码模板,这些都不是我想要的,过多的结果反而对我形成了干扰。
如果我们将变量改个名,比如,那么就不会进行变量的自动填充,说明的变量自动填充的能力比较有限,更多的是进行代码模板的推荐。
3)在下面的动图中,我们可以看到无法自动将变量填充到的参数中,需要人工填写,并且在后续的补全中不能很好的识别代码上文,在下一行依然在推荐的初始化代码,而当我们希望通过已有的变量获取结果时,无法识别到已有的变量。
4)当然,在代码模板方面,它对IDEA的代码模板进行了进一步的补充,这一点是比较好的。
在其他代码补全工具发布之前,还是一个比较不错的开发利器,但是现在目前稍微有点差强人意,所以公司已经放弃该产品的演进,转而大力发展收购的。
三、
是一款比较年轻的开发工具,刚发布的时候还是比较惊艳的,那个时候刚开源GPT-2模型不久,基于GPT-2模型在海量代码数据上进行调优,打造出了一款针对代码的深度学习引擎,它能智能识别代码的上文信息,提供长序列的代码补全结果。目前,已经被公司收购,并主推该工具,宣称支持所有主流的开发语言。
支持功能度量分析使用体验
在针对Java语言的体验中,能对很多情况都生成较长的代码序列,不仅支持代码符号,也支持字符串、注释、等内容的自动提示,在这方面还是比较方便的,但是通常自动提示的效果不是很好,毕竟这类信息的生成是需要理解代码的,而只能根据上文学习的模式进行生成,没有真正理解到代码的逻辑。除了Java文件,Java工程相关的文件如Yaml、等配置文件,它也能根据一定的模式进行自动提示。
但是经常会推荐生成了一半的补全结果,也会经常推荐出本工程内不存在的API,最让人不能接受的地方是如果是使用离线模式,内存占用量非常高,cpu占用有时候也会比较高。下面我们来看几个示例(以下示例基于 Pro版本):
1)提供的代码补全经常会出现不完整代码片段,比如下图中的 。
下图中的XSS也是不完整的,并且 sheet = new 该选项不符合语法,sheet变量对应的是类。
2)由于深度学习模型的推理非常耗时,所以考虑到性能原因,每次补全首次触发时会通过轻量级模型进行代码生成,在下次触发时通过缓存获取深度学习模型的结果,所以如果我们在同一个光标位置,重新触发代码补全,会提供给我们更好的补全结果。上面两幅图均为首次触发的结果,下图为第二次触发的结果,可以看到代码生成半截的情况会少很多,但是依然存在语法错误。
3)能提供比较长的补全结果,但遗憾的是方法是不存在的,存在语法错误。
4)比较好的地方是对之前出现过的代码学习能力较好,能快速的学习到出现过的代码模式。
后面的文章会对做更详细的对比评测,这里就不展开介绍了,总体来说,能提供长序列的代码补全,但是与其他工具相同,会推荐出不完整的代码以及存在语法错误的代码。我也了解到有部分同学喜欢即时学习代码模式的能力。
四、
近期发布的的代码智能生成插件,目前支持、等IDE平台,不同于其他代码补全工具只提供最多一行的补全结果,能通过代码上下文以及语言描述,生成整个代码片段,无疑是开发者的编码利器。它是如何做到的呢?上文提到使用的是GPT-2深度学习模型,而使用的是据说烧了数千万美元研发出来的GPT-3模型,在GPT-3模型基础之上通过对的开源代码进行学习,得到了Codex模型,该模型具备强大的代码生成能力,但是由于该模型非常庞大,需要有足够的基础设施支撑,所以目前只能通过邀测的形式小范围试用,从FAQ中的信息显示,未来不太可能会大面积免费开放,所以喜欢该工具的开发者需要做好掏钱的准备。
支持功能使用体验
的模型非常强大,其原理本质上跟是相似的,但是的代码生成效果要好很多。代码生成结果的展现形式跟其他工具都不同,它采用了内联的方式,这种方式非常直观的展示的代码生成后的样子,适合多行代码片段的展示,但是这种方式不适合推荐结果比较多的时候,只能通过快捷键切换结果,而且如果开启了自动触发,在写代码时经常会在我不需要的时候出现,把正在编写的代码挤到下面去,这会是一种打扰。
1)用同样的示例,能将整行进行补全,并且自动将填充到参数中。
2)也能自动识别到上文中出现过的变量及其方法,没有发生语法错误的问题。
3)虽然在上一个例子中补全效果较好,没有出现语法错误的问题,但是依然会在很多情况下生成存在语法错误的代码片段。如下图所示,类是在本地工程中创建的,类下面只有一个方法,然而却生成了print方法,因为是根据数亿的开源代码学习到的,不能及时的去学习本地工程的代码信息,所以本质上跟一样是会存在语法错误的问题,只是由于模型更强大,所以错误的概率更小,但是一旦涉及到本地工程的代码,错误的概率就会非常高。
4)用写单元测试是非常方便的,它能帮助我生成很多测试数据,减少我Mock数据的烦恼。
5)方法级的代码生成也有很多错误的时候,比如生成读取XML文件的代码,结果生成的是读取Excel的代码,可能是因为类开头了较多Excel相关的API。
如果我把去掉,那么它就无法生成了,只会根据注释生成另一段注释。
有时候它生成的代码会陷入无限重复,比如下图中陷入了生成的死循环。
总的来说, 是一款非常好用的代码生成工具,适合生成通用的工具代码、算法、单元测试等场景的高频代码,而对业务代码的生成则依然存在语法错误的问题,希望以后收费不用太贵。
五、微软
要说做开发工具哪家强,那肯定是微软最厉害,上面提到的 使用的GPT-3模型,其研究组织也是受微软10亿美元投资的,所以也有微软的功劳。微软自己开发的另一款工具,在2018年7月发布,支持C#、C++、Java、、SQL 、/、XAML,并且在2021年初发布 插件。跟其他众多补全工具一样,提供了代码智能补全的能力,目前支持以及 。效果较好的语言:C#、C++
支持功能代码重构代码评审 独立插件使用体验
在我的尝试中,在上对于Java语言只能提供方法调用的推荐,不知道是不是使用的姿势不太对。如下图所示,只有在sb. 时才能提供对方法调用的排序,并且只能推荐单个API(标有星号的结果),无法像其他工具一样生成长序列的代码片段。
下面附上官方在语言的使用效果示例,我们能看到只能进行单个API的推荐,更多是对IDE自带补全结果的排序优化,所以在上使用体验较为一般。
说完了国外的,我们再来说说国产的。
六、阿里云Cosy
阿里云的智能编码插件Cosy是2021年10月份才发布,到现在才两个月时间,目前仅支持Java语言,是支持语言最少的工具。通过Cosy的帮助文档了解到,它使用深度学习模型加语法分析结合的技术,通过深度学习模型的学习能力生成长序列代码,同时又通过结合语法分析的能力去纠正模型生成的错误。我理解Cosy是想解决、 等普遍存在的生成错误代码的问题,从使用体验上感觉错误代码确实少很多,但是依然会存在。我个人比较喜欢的是Cosy的代码搜索功能,它从和中抽取出了常用的代码片段,让我能很方便的在IDE中直接搜索出来。
支持功能
仅提供 IDEA插件,支持Java语言
代码示例搜索使用体验
Cosy简单体验下来,在同样的代码中产生的错误结果会少很多,但也不是完全没有,偶尔也会产生错误的结果。相比于其他工具的缺点在于它有时候给不出补全的结果,可能是为了避免语法错误,这个有时候也是优点,毕竟宁缺毋滥,至少装了这类工具应该让我的体验比之前更好,而不是会有体验下降的问题。
1)Cosy识别代码上下文的能力还不错,能生成长序列的补全结果,在下图的示例中没有语法错误,并且能自动将填充到参数中。