代码搜索!人工智能新领域

avatar
阿里巴巴 前端委员会智能化小组 @阿里巴巴

文/ 阿里云 - 秦奇

本文章为系列文章,主要介绍代码智能(Code Intelligence)领域涉及的众多有趣的任务(Task),具体会从这些任务的简介、历史和现状等维度展开介绍,希望让大家对于代码智能有一个深切的认识。

本文的主角是 代码搜索(Code Search),即用一段自然语言能够搜索出最符合程序员意图的代码出来。 ​

可以看出这个task本身偏文本理解和语义分析,主要模拟的场景就是开发者查找意向的代码。其实作为程序员这个功能大家应该都不陌生,和百度(谷歌)搜索类似,通过关键字或一段话搜索想要的内容。我们这里的“代码搜索”尽可能宽泛一些,所有和代码搜索相关的我们都来聊一聊,并不单指 如何使用机器学习训练之后在固定的数据集上进行代码搜索的任务。

常见的代码搜索场景

代码搜索最常用的场景莫过于程序员对某个功能、工具不太熟悉时,搜索一些常用的用法和实践。一般也分为几种情况:

  1. 不知道某个功能如何实现。 比如 如何使用JS实现字符串反转?
  2. 不知道某个具体API的用法。 比如 JS for-of怎么用?
  3. 一些大型的框架、软件包等的最佳实践。比如 React JS

以上很常见的两种场景,一般借助于强大的搜索引擎的能力,可以很方便的搜索出相关的文档。第一种场景的结果一般是一些博客、论坛或者代码交流平台,比如stack overflow;第二种则一般是文档中心,比如前端常用的MDN等;第三种一般是对应的 Github 或者官网。




以上都是通过强大的搜索引擎能力来找到对应的代码,毕竟善于运用谷歌也是程序员的必备能力。 ​

代码搜索常用网站

同时也有一些专门用于代码搜索网站,期望帮助程序员更好的找到想要的代码。

这些搜索方式类似,都是基于一套包含语法的表达式进行搜索的,比如在github中可以通过react stars:>100的表达式 搜索出包含 react关键字,并且所在仓库的star数必须大于100的仓库,就是类似于拼出对应的sql代码直接去数据库里执行。这类语法往往具备高度的灵活性,可以自由组合成为复杂的搜索表达式,以满足用户各式各样的搜索诉求。


但是,高度灵活性其实又带来一定的上手难的问题,要能够快速找到目标的代码,就必须熟悉这套语法,,并且要进行灵活组合,甚至加入and/or/not等逻辑,复杂度直线上升。不过说回来,一般情况下也很少用到这般复杂的搜索表达式。 ​

基于语义的代码搜索

对比于这类搜索,如果有一些通过自然语言描述就可以完成的搜索无疑是更好的选择,这类搜索方式上手成本极低,类似于平常的语言沟通,比如 show me the code about js string reverse的搜索,可以快速搜索出关于 字符串反转的实际代码。因为没有找到自然语言代码搜索支持相对较好的服务或者网站,这里还是以谷歌搜索为例,可以看出不管是 关键字 还是 自然语言,谷歌分析处理的还是比较好的,方便用户快速找到想找的代码。


另外,也有Facebook(现在应该交Meta)基于机器学习实现的自然语言代码搜索模型:NCSUNIF,分别是基于无监督和有监督的方式探索机器学习能力对于自然语言代码搜索的提升。以下是一些例子(代码来自于Facebook博客): Q:How to get the ActionBar height? (如何获取 ActionBar 高度?) A:

  • NCS
public int getActionBarHeight() {
	return mActionBarHeight;
}
  • UNIF
public static int getActionBarHeightPixel(Context context) {
	TypedValue tv = new TypedValue();
	if (context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
		return TypedValue.complexToDimensionPixelSize(tv.data,
			context.getResources().getDisplayMetrics());
	} else if (context.getTheme().resolveAttribute(R.attr.actionBarSize, tv, true)) {
		return TypedValue.complexToDimensionPixelSize(tv.data,
			context.getResources().getDisplayMetrics());
	} else {
		return 0;
	}
}

可以看出,根据自然语言描述确实推荐出了相关的代码,只是能否真正用于生产还需要考虑验证下,并且搜索出的代码是否会有Licence问题同样需要考虑。 ​

代码搜索的未来

在日常的开发过程中,代码搜索必不可少,查文档、查用法、查最佳实践。。。查询的过程也是学习进步的过程。目前来说,还是谷歌更好用一些,不过语意化的代码搜索也在飞速进步中,其中的核心还是语义分析的能力。不止是在代码搜索,在其他领域语义分析的应用也极其广泛,比如nl2sql(自然语言生成SQL),一句话进行数据分析等等也是很热门的场景。总之一句话,未来可期,期待更智能、更好用的代码搜索工具的诞生。

代码智能相关系列文章