程序员编码加速器,代码智能补全工具盘点
近几年,人工智能迅速发展,在各行各业都有所应用,特别是近两年,面向开发者的AI开发工具也是层出不穷,特别是从GitHub Copilot工具中看到了AI对开发者带来的无限可能性。
本文主要介绍目前业界比较实用的几款智能开发工具,并会在后续的文章中做一些更为详细偏个人使用感受的对比评测。本次涉及到的工具包含国外的Kite、Codota、TabNine、GitHub Copilot、微软IntelliCode,国内的阿里云Cosy、AIXcoder。我们先来看一下这些工具的特点:
文章图片
简单来说,TabNine支持的语言及IDE种类最多,GitHub Copilot提供的补全效果更惊艳,阿里云Cosy的代码搜索功能最丰富,接下来让我带你一起详细了解一下。
一、Kite
说到业界在代码智能补全领域发布最早的工具,Kite便是其中之一,它成立于2014年,在Atom/Vim/Spyder等编辑器发布代码智能提示插件,初期只面向Python开发者,当前扩展到面向绝大部分主流开发语言。并于2020年初发布JetBrains插件,2021年初发布VSCode插件。
Kite支持目前主流的16种开发语言以及16种代码编辑器,但是从我的使用体验上来看,其最擅长的还是Python语言,毕竟是Kite最早支持的语言类型。效果较好的语言:Python
支持功能
- 代码智能补全
- 远程服务模式,代码需要上传到远程服务器
- 离线模式,能够把模型下载到用户本地,无法联网也可使用补全
- 专业版能针对用户的代码库进行训练
- 代码搜索(支持Python)
- 支持Python API的官方文档及少量示例
Kite最主要的功能是代码智能补全,从补全效果来看,它不擅长生成长序列代码片段,生成出的最长代码通常只有两到三个单词,但是它最主要的亮点在于它能对IDE自带的补全结果进行整体的排序优化,我们知道IDE自带的补全效果是比较一般的,很多只是根据API名称进行简单的排序,稍微好一些的会根据使用的频率进行排序,而Kite会结合代码的上下文,根据开发者的需求,将开发者更可能用到的API排在最上面,从而减少开发者的输入。但是这种方式带来的体验提升有限,跟PyCharm自带的补全差别不会很大,特别是PyCharm的新版提供了基于机器学习的排序优化。
下面展示几个补全示例:
1)Kite根据上文能自动补出Flask的导入,但是第三项只补了一半。
文章图片
2)补全结果中只带有Kite Logo
文章图片
的是Kite生成的结果,如果是
文章图片
图标表示是Kite对IDE结果进行了排序优化,我们可以看到Kite能生成 app = Flask(__name__) _ _这种长序列的代码,但是排序比较靠后。
文章图片
3)从下面的示例中可以看到Kite生成了比较多的结果,总体还是不错的,但是像 rule、list 这两个变量是不存在的,需要开发者删掉自己写,这个问题也是诸多代码补全工具的共性问题。由于它们会从开源代码中学习到诸多模式,但是这些模式不一定适合本地工程,就很容易生成在本地工程中存在语法错误的代码。
文章图片
在其他语言上,Kite的表现就不太理想了,比如在Java上会提供很多错误的补全结果,而且大部分也只有单API的补全结果,基本上没太大用处,后面的文章会有更详细的评测。
文章图片
总体来说,Kite适合喜欢短序列补全结果的Python开发者。
二、Codota 除了Kite,业界另一个涉足最早涉足该领域的工具是Codota,Codota成立于2013年,在2014年下旬发布第一个Jetbrains插件版本,主要面向Java开发者。但是,目前Codota公司收购TabNine之后,已经放弃了Codota这款插件,并将老产品改名为了TabNine。效果最好的语言:Java
支持功能
- 代码补全
- 基于程序分析、统计分析的规则化代码补全,主要能针对部分类名、常用的代码模板进行补全
- 代码示例搜索(支持Java、JavaScript)
- 支持搜索引用了指定API的代码示例
- 支持关键词搜索
下面展示几个示例:
1)Codota在补全时能生成了非常多的补全结果,但是补全结果太多,很多时候是比较打扰我编码的,会把IDE自带的补全挤到很后面,而且有很多不太准确,同时也存在类似Kite的语法错误问题,比如下图中的 url 变量是不存在的。
文章图片
2)我们再来看看变量的自动填充效果如何:当上文中存在filePath变量时,Codota有一个补全项自动填充了filePath变量,但是其他的补全项并没有识别到已经声明了文件路径的场景,反而推荐了各种代码模板,这些都不是我想要的,过多的结果反而对我形成了干扰。
文章图片
如果我们将filePath变量改个名,比如filePathTest,那么Codota就不会进行变量的自动填充,说明Codota的变量自动填充的能力比较有限,更多的是进行代码模板的推荐。
3)在下面的动图中,我们可以看到Codota无法自动将inputStream变量填充到XSSFWorkbook的参数中,需要人工填写,并且在后续的补全中不能很好的识别代码上文,在下一行依然在推荐Workbook的初始化代码,而当我们希望通过已有的workbook变量获取XSSFSheet结果时,Codota无法识别到已有的workbook变量。
文章图片
4)当然,在代码模板方面,它对IDEA的代码模板进行了进一步的补充,这一点是比较好的。
文章图片
在其他代码补全工具发布之前,Codota还是一个比较不错的开发利器,但是现在目前稍微有点差强人意,所以Codota公司已经放弃该产品的演进,转而大力发展收购的TabNine。
三、TabNine TabNine是一款比较年轻的开发工具,刚发布的时候还是比较惊艳的,那个时候OpenAI刚开源GPT-2模型不久,TabNine基于GPT-2模型在海量代码数据上进行调优,打造出了一款针对代码的深度学习引擎,它能智能识别代码的上文信息,提供长序列的代码补全结果。目前,已经被Codota公司收购,并主推该工具,宣称支持所有主流的开发语言。
支持功能
- 代码智能补全
- 免费版只提供较为基础的补全功能,收费的Pro版本补全效果更好
- 远程服务模式,代码需要上传到远程服务器,但是模型更强大,本地内存占用少
- 离线模式,能够把模型下载到用户本地,无法联网也可使用补全,但是本地内存占用高,有时候CPU会飙高
- 针对专业版提供了适配企业/私有代码的能力,是需要收费的
- 度量分析
- 在IDE中提供了简单的编码效能的数据
但是TabNine经常会推荐生成了一半的补全结果,也会经常推荐出本工程内不存在的API,最让人不能接受的地方是如果是使用离线模式,内存占用量非常高,cpu占用有时候也会比较高。下面我们来看几个示例(以下示例基于TabNine Pro版本):
1)TabNine提供的代码补全经常会出现不完整代码片段,比如下图中的 HSSFWork。
文章图片
下图中的XSS也是不完整的,并且 sheet = new XSSFRow 该选项不符合语法,sheet变量对应的是XSSFSheet类。
文章图片
2)由于深度学习模型的推理非常耗时,所以TabNine考虑到性能原因,每次补全首次触发时会通过轻量级模型进行代码生成,在下次触发时通过缓存获取深度学习模型的结果,所以如果我们在同一个光标位置,重新触发代码补全,TabNine会提供给我们更好的补全结果。上面两幅图均为首次触发的结果,下图为第二次触发的结果,可以看到代码生成半截的情况会少很多,但是依然存在语法错误。
文章图片
3)TabNine能提供比较长的补全结果,但遗憾的是getSheetCount方法是不存在的,存在语法错误。
文章图片
4)比较好的地方是TabNine对之前出现过的代码学习能力较好,能快速的学习到出现过的代码模式。
文章图片
后面的文章会对TabNine做更详细的对比评测,这里就不展开介绍了,总体来说,TabNine能提供长序列的代码补全,但是与其他工具相同,会推荐出不完整的代码以及存在语法错误的代码。我也了解到有部分同学喜欢TabNine即时学习代码模式的能力。
四、GitHub Copilot GitHub近期发布的的代码智能生成插件,目前支持VSCode、JetBrains等IDE平台,不同于其他代码补全工具只提供最多一行的补全结果,Copilot能通过代码上下文以及语言描述,生成整个代码片段,无疑是开发者的编码利器。
它是如何做到的呢?上文提到TabNine使用的是GPT-2深度学习模型,而Copilot使用的是OpenAI据说烧了数千万美元研发出来的GPT-3模型,Copilot在GPT-3模型基础之上通过对GitHub的开源代码进行学习,得到了Codex模型,该模型具备强大的代码生成能力。但是由于该模型非常庞大,需要有足够的硬件支撑,所以Copilot目前只能通过邀测的形式小范围试用。从FAQ中的信息显示,Copilot未来可能不会大面积免费开放,未来想要尝试该工具的开发者要准备好预算。
支持功能
- 只提供了远程服务模式,需要将代码上传到远端,所以如果是企业的开发者可能要注意数据安全了
- 能够通过代码上下文、注释及语言描述生成方法级的代码片段
1)用同样的示例,Copilot能将整行进行补全,并且自动将inputStream填充到参数中。
文章图片
2)Copilot也能自动识别到上文中出现过的workbook变量及其getSheetAt方法,没有发生语法错误的问题。
文章图片
3)虽然在上一个例子中补全效果较好,没有出现语法错误的问题,但是Copilot依然会在很多情况下生成存在语法错误的代码片段。如下图所示,StringUtils类是在本地工程中创建的,类下面只有一个readTestFile方法,然而Copilot却生成了print方法,因为Copilot是根据数亿的开源代码学习到的,不能及时的去学习本地工程的代码信息,所以本质上跟TabNine一样是会存在语法错误的问题,只是由于模型更强大,所以错误的概率更小,但是一旦涉及到本地工程的代码,错误的概率就会非常高。
文章图片
4)用Copilot写单元测试是非常方便的,它能帮助我生成很多测试数据,减少我Mock数据的烦恼。
文章图片
5)Copilot方法级的代码生成也有很多错误的时候,比如生成读取XML文件的代码,结果生成的是读取Excel的代码,可能是因为类开头import了较多Excel相关的API。
文章图片
如果我把import去掉,那么它就无法生成了,只会根据注释生成另一段注释。
文章图片
有时候它生成的代码会陷入无限重复,比如下图中陷入了生成Insert的死循环。
文章图片
总的来说,GitHub Copilot是一款非常好用的代码生成工具,适合生成通用的工具代码、leetcode算法、单元测试等场景的高频代码,而对业务代码的生成则依然存在语法错误的问题,希望以后收费不用太贵。
五、微软IntelliCode 要说做开发工具哪家强,那肯定是微软最厉害,上面提到的GitHub Copilot使用的GPT-3模型,其研究组织OpenAI也是受微软10亿美元投资的,所以Copilot也有微软的功劳。微软自己开发的另一款工具IntelliCode,在2018年7月发布,支持C#、C++、Java、Python、SQL Server、TypeScript/JavaScript、XAML,并且在2021年初发布Visual Studio IntelliCode Insiders插件。跟其他众多补全工具一样,提供了代码智能补全的能力,目前支持VSCode以及Visual Studio。效果较好的语言:C#、C++
支持功能
- 代码智能补全
- 单API补全,跟IDE自带补全类似,但是在排序上有所优化
- 适配企业/私有代码(只支持C++、C#)
- 支持离线模式
- 代码重构
- 开发者修改代码时,提示并自动帮助开发者修改在重复代码上的问题
- 代码评审
- 用官方主页的话来说“在代码评审时,Visual Studio IntelliCode 就像是开发者一双额外的眼睛,它可根据代码改动、复杂度和历史记录等因素,将需要额外关注的更改提取出来”。因为该功能目前无法体验到,所以不做过多介绍。
- IntelliCode Insiders独立插件
- API代码示例搜索(仅支持Python),能够搜索Python语言的API代码示例。
- 日期pattern识别(仅支持TypeScript/JavaScript)
文章图片
下面附上官方在Python语言的使用效果示例,我们能看到IntelliCode只能进行单个API的推荐,更多是对IDE自带补全结果的排序优化,所以在VSCode上使用体验较为一般。
文章图片
说完了国外的,我们再来说说国产的。
六、阿里云Cosy 阿里云的智能编码插件Cosy于2021年10月份发布,到现在才两个月时间,是个相对年轻的工具。目前仅支持Java语言。通过其帮助文档了解到,它使用深度学习模型加语法分析结合的技术,通过深度学习模型强力的学习能力生成长序列代码,同时又通过结合语法分析的能力去纠正模型生成的错误。对此我理解为Cosy是想解决其他AI代码生成工具普遍存在的生成错误代码的问题,从使用体验上感觉错误代码确实相对来说少很多,但也依然存在。我个人比较喜欢的是Cosy的代码搜索功能,它从GitHub和StackOverflow中抽取出了常用的代码片段,让我能很方便的在IDE中直接搜索需要的信息。
支持功能 由于刚发布不久,目前仅提供IntelliJ IDEA插件,支持Java语言,相比于其他工具支持的语言种类比较少。
- 代码智能补全
- 支持整行的代码补全结果
- 离线模式,Cosy会在首次启动时把模型下载到本地,之后便可断网使用
- 代码示例搜索
- 在IDE内支持指定API的代码示例搜索
- 在IDE内支持通过功能描述搜索StackOverflow、GitHub等来源的开源代码片段
1)Cosy识别代码上下文的能力还不错,能生成长序列的补全结果,在下图的示例中没有语法错误,并且能自动将inputStream填充到参数中。
文章图片
2)Cosy能根据上文自动的识别出当前位置需要XSSFSheet。
文章图片
当给与了XSSFSheet的强制类型转换信息后,Cosy能提供getSheetAt方法的长序列代码补全结果。
文章图片
3)但是Cosy对于for循环的补全稍微弱一点,只能一段一段的补出,但是for循环很多时候通过IDEA的fori的代码模板能够快速生成。
文章图片
4)Cosy有时候也会存在语法错误的问题,比如下图中生成的World类在当前工程中是不存在的。
文章图片
5)让我感受比较惊艳的是Cosy提供了比较不错的代码搜索工具,它不像Codota只能搜API的代码示例,Cosy也能通过功能描述或者多个关键词去搜索代码示例,从结果中可以看到有来自GitHub、StackOverflow等来源的代码示例结果。之前IDEA有一个StackOverflow的插件,但是那个插件是基于Google搜索的,所以对于国内开发者不太能用,而Cosy插件体验下来感觉不是基于Google搜索的,不需要科学上网。
Cosy的简单体验就到这里,后面会有更详细的评测文章。
七、AIXcoder AIXcoder从天眼查了解到其成立于2017年,根据官网主页的信息,它也采用了深度学习的技术,并且对模型进行了压缩,以便于提升用户下载模型的速度,减少用户本地CPU的开销。AIXcoder提供了对用户本地代码库学习的工具,但是免费版有次数限制,而且学习本地代码库的时候电脑会比较卡。让我有点疑惑的是,AIXcoder官网主页视频中演示了IDE内的代码搜索功能,但是在实际插件中只提供了一个跳转到浏览器中的按钮,并不能在IDE内直接搜索(难道是需要付费的?)。目前发布了Jetbrains及VSCode插件,主要支持Java、Python、C/C++、JavaScript、Typescript、Go、PHP等语言。效果较好的语言:Java
支持功能
- 代码智能补全
- 远程服务模式,代码需要上传到远程服务器,速度更快一点,卡顿感会减少
- 离线模式,会把模型下载到本地,并且会根据当前正在写的代码,动态的去下载相应的模型
- 适配企业/私有代码,是需要收费的
- 代码示例搜索(支持Java、C++、Python)
- IDE插件端内部不支持,需要跳出到网页中搜索
- 网页蛋支持代码示例搜索、自然语言搜索、相似代码搜索等
- 适配企业/私有代码,是需要收费的
- 度量分析
- 编码时长、智能补全采纳率、节省时间等,普通版本不支持
1)AIXcoder也会存在语法错误的问题,在下图的示例中只是简单的根据前面定义的类信息进行new实例化,但是Workbook是一个接口,是不能直接实例化的。而且AIXcoder没有对inputStream进行参数的自动填充。
文章图片
2)在我明确要实例化XSSFWorkbook类时,AIXcoder也只是跟IDE一样提供了单个API的补全,当然,排序上会好很多。
文章图片
3)当我想去获取XSSFSheet对象时,AIXcoder依然只提供了XSSFWorkbook的补全项,缺少对代码上下文的识别能力。
文章图片
当代码信息稍微明确后,AIXcoder才能给出稍长的补全结果。
文章图片
4)AIXcoder的这个补全项比较奇怪,实际上我想要的是getSheetAt,IDE自带的补全已经将其排在了第一位,但是AIXcoder却提供了两个createSheet。
文章图片
5)for循环的补全不够完整,也只补了半截。
文章图片
6)AIXcoder有个比较不好的地方是会把其他补全工具的结果图标替换成自己的,比如下图中第一项是TabNine提供的结果,但是TabNine的图标被换成了AIXcoder的,IDE自带的补全结果也无法幸免。
文章图片
AIXcoder我们先简单体验到这儿,后续会有更详细的对比评测文章。
总结 这几款开发工具,我都使用过一段时间,最后简单总结一下:
- Codota类似于IDEA代码模板的补充,但现在已经不怎么维护了;
- TabNine每种语言都能提供比较长的代码补全结果,但是如果是离线模式,内存占用非常高(我会经常把它禁用掉),对数据安全没有疑虑的开发者可以考虑远程服务模式,但Pro版本是需要收费的,有点小贵;
- GitHub Copilot很好用,尤其是在写单元测试的时候,它会帮我把单元测试的Mock数据生成出来,还是比较惊艳的,可惜只提供了远程服务模式,我个人会比较在意这一点,并且它未来也可能会收费;
- IntelliCode在Visual Studio的效果好一些,在VSCode中跟IDE自带差别不大,补全结果的排序有一定优化;
- 阿里云Cosy在Java语言上的代码补全体验还不错,但是我个人更喜欢它的代码搜索功能,体验很流畅,希望能尽快支持其他语言类型;
- AIXcoder代码搜索体验一般,代码补全在Java语言上感觉比IDE自带好一点;
【程序员编码加速器,代码智能补全工具盘点】后续的文章我会对这些开发工具进行更详细的对比评测,感谢大家支持。
推荐阅读
- Java程序员阅读源码的小技巧,原来大牛都是这样读的,赶紧看看!
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- 程序员客栈TOP收入的萌系开发者心得|程序员客栈TOP收入的萌系开发者心得 - 雨晴
- 程序员需要知道的缩写和专业名词【转】
- 程序员如何“忽悠”老板
- swift|swift 编码规范收集
- 程序员之间的斗图,火药味十足!把我吓得躲得远远的!
- python深度学习实现自编码器Autoencoder神经网络异常检测心电图ECG时间序列
- 程序员周刊(第3期)(识别未来新技术的趋势)
- 一份月薪过万程序员的面试复习资料!你难道还不看看吗()