近日,科技巨头 Facebook 开源了一款代码到代码的搜索和推荐神器——Aroma,开发者基于此可以轻松找到常见的编码模式而无需手动浏览多个代码片段。



作者 | Celeste Barnaby、Satish Chandra、Frank Luan

译者 | 姜松浩

责编 | 屠敏

出品 | CSDN(ID:CSDNnews)

以下为译文:


成千上万的工程师编写代码来创建我们日常所使用的应用程序,为全球数十亿人提供服务。这不是一项微不足道的任务,因为我们的服务变得如此多样化和复杂,以至于代码库包含数百万行代码,这些代码与从消息传递到图像呈现等各种不同的系统相互交叉。为了简化和加快编写代码会对许多系统产生影响的过程,工程师经常需要一种方法来查找其他人如何处理类似的任务。

因此,我们创建了Aroma,一种code-to-code的搜索和推荐工具,它使用机器学习(ML)使得从大型代码库获得洞察力的过程变得更加容易。


在Aroma之前,现有的工具都没有完全解决这个问题。文档工具并不总是可用而且很可能是过时的,代码搜索工具通常会返回无数匹配结果,并且很难立即找到惯用的使用模式。通过Aroma,工程师可以轻松找到常见的编码模式,而无需手动浏览数十个代码段,从而节省了日常开发工作流程的时间和精力。


除了将Aroma部署到我们的内部代码库之外,我们还在开源项目上创建了Aroma版本。本文中的所有示例均来自GitHub上的5,000个开源Android项目的集合。




什么是代码推荐,何时需要?

 

让我们考虑一下Android工程师想要了解其他人如何编写类似代码的情况。假设工程师编写以下内容来解码Android手机上的位图:
BitmapB  bitmap = BitmapFactory.decodeStream(input);
这个方式可行,但工程师想知道其他人如何在相关项目中实现此功能,尤其是设置了哪些常用选项,或处理了哪些常见错误,以避免应用程序在生产中崩溃。


Aroma使工程师能够使用代码片段本身进行搜索查询。搜索的结果作为代码建议返回。每个代码建议都是从存储库中找到的类似代码片段的集群中创建的,并显示常见的使用模式。以下是Aroma为此示例返回的第一条建议:

 



代码示例1

 
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2; // ... Bitmap bmp = BitmapFactory.decodeStream(is, 
null, options);
这段代码建议是从存储库中找到的五个类似方法的集合中合成的。此处仅显示了方法集群中的公共代码,并在间隙(...部分)中删除了各个方法的具体细节。

这段代码建议试图说什么?嗯,它说在五种不同的情况下,工程师在解码位图时设置了额外的选项。设置样本大小有助于减少解码大位图时的内存消耗,实际上,Stack
Overflow上的一个热门帖子暗示了相同的模式。Aroma通过发现包含此模式的代码片段集自动创建此建议。

让我们看看另一个建议。

 



代码示例2

 
try {   InputStream is = am.open(fileName);
  image = BitmapFactory.decodeStream(is);   is.close(); } catch
 (IOException e) {   // ... }

此代码段是从另外四种方法聚类而来的。它显示了InputStream在解码位图中的惯用用法。此外,此建议演示了在打开InputStream时捕获潜在IOException的良好做法。如果此异常在运行时发生且未捕获,则应用程序将立即崩溃。负责任的工程师应该使用此建议扩展代码并正确处理此异常。



在编码环境中集成的Aroma代码建议。

与传统的代码搜索工具相比,Aroma的代码推荐功能有以下几个优点:

*

Aroma在语法树上执行搜索。Aroma不是寻找字符串级别或符号级别的匹配,而是可以找到语法上与查询代码类似的实例,并通过修剪不相关的语法结构来突出显示匹配的代码。

*
Aroma自动将类似的搜索结果聚集在一起以生成代码建议。这些建议代表惯用的编码模式,比非聚集搜索匹配更容易使用。

*
Aroma足够快,可以实时使用。在实践中,即使对于非常大的代码库,它也会在几秒钟内创建建议,并且不需要提前进行模式挖掘。

*
Aroma的核心算法与语言无关。我们在Hack,JavaScript,Python和Java的内部代码库中都部署了Aroma。

 



Aroma是如何工作的?

 



Aroma在三个主要阶段创建代码建议:

1)基于特征的搜索


首先,Aroma将代码语料库索引为稀疏矩阵。它通过解析语料库中的每个方法并创建其解析树来实现此目的。然后,它从每个方法的解析树中提取一组结构特征。仔细选择这些功能以捕获有关变量用法、方法调用和控制结构的信息。最后,它根据每个方法的特征为每个方法创建一个稀疏向量。最后将所有方法体的特征向量构成索引矩阵,用于搜索检索。




当工程师编写新的代码片段时,Aroma以上述方式创建稀疏矢量,并将该矢量的点积与包含所有现有方法的特征向量的矩阵相乘。将点积最高的前1000个方法体检索为推荐的候选集。尽管代码语料库可能包含数百万种方法,但由于稀疏向量和矩阵的点积的有效实现,这种检索很快。



2)重新排名和聚类


在Aroma检索到具有相似外观的方法的候选集之后,下一阶段是将它们聚类。为了做到这一点,Aroma首先需要通过它们与查询代码片段的相似性来重新排列候选方法。因为稀疏向量仅包含关于存在哪些特征的抽象信息,所以点积的得分低估了代码片段与查询的实际相似性。因此,Aroma在方法语法树上应用修剪的方式用来丢弃方法体的不相关部分,并仅保留与查询片段最匹配的部分,以便根据它们与查询的实际相似性重新排列候选代码片段。

在获得与查询相似的降序的候选代码片段列表之后,Aroma运行迭代聚类算法以找到彼此相似的代码片段的集群,并包含用于代码建议有用的额外语句。



3)相交:创建代码建议的过程


代码片段1(改编自此项目https://github.com/zom/Zom-Android/blob/master/app/src/main/java/org/awesomeapp/messenger/ui/stickers/StickerGridAdapter.java#L67):
InputStream is = ...; final BitmapFactory.Options options = new
 BitmapFactory.Options(); options.inSampleSize = 2;
Bitmap bmp = BitmapFactory.decodeStream(is, null, options);
ImageView imageView = ...; imageView.setImageBitmap(bmp);// some more code

代码片段2(改编自此项目https://github.com/cymcsg/UltimateAndroid/blob/master/deprecated/UltimateAndroidNormal/UltimateAndroid/src/com/marshalchen/common/commonUtils/uiUtils/ImageUtils.java#L231,L239):
BitmapFactory.Options options = new BitmapFactory.Options(); while (...) {   in
 = ...;   options.inSampleSize = 2;   options.inJustDecodeBounds = false;
  bitmap = BitmapFactory.decodeStream(in, null, options); }

代码片段3(改编自此项目https://github.com/guardianproject/ObscuraCam/blob/master/app/src/main/java/org/witness/obscuracam/ui/ImageEditor.java#L419):
BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
// some setup code try {   options.inSampleSize = 2;
  loadedBitmap = BitmapFactory.decodeStream(inputStream, null
, bmpFactoryOptions);   // some code... } catch (OutOfMemoryError oom) { }

相交算法的工作原理是将第一个代码片段作为“基础”代码,然后针对集群中的每个其他方法迭代地对其进行修剪。修剪过程之后的剩余代码将是所有方法中共同的代码,并且它成为代码建议。其他细节在我们关于该主题的论文(https://arxiv.org/abs/1812.01158)中。


在此示例中,每个代码段包含特定于其项目的代码,但它们都包含相同的代码,用于设置解码位图的选项。如上所述,Aroma通过首先修剪第一个代码段中没有出现在第二个片段中的行来找到公共代码。中间结果如下所示:
InputStream is = ...; final BitmapFactory.Options options = new
 BitmapFactory.Options(); options.inSampleSize = 2;
Bitmap bmp = BitmapFactory.decodeStream(is, null, options);

有关ImageView的代码段1中的代码不会出现在代码段2中,因此会被删除。现在Aroma采用这个中间片段并修剪未出现在代码片段3、代码片段4等中的行。生成的代码作为代码建议返回。如代码示例1所示,从此集群创建的代码建议恰好包含所有方法体中常见的三行代码。


其他代码建议以相同的方式从其他集群创建,并且Aroma的算法确保这些建议彼此有明显的不同,因此工程师可以通过查看几个代码片段来学习各种编码模式。例如,代码示例2是从另一个集群计算的建议。

这是使用Aroma的真正优势。而不是手动完成数十个代码搜索结果并手动找出惯用的使用模式,Aroma可以在几秒钟内自动完成!

 



更广泛的图片

 

鉴于已经存在大量代码,我们相信工程师应该能够轻松地在大型代码库中发现重复的编码模式并从中学习。
这正是Aroma促进的能力。Aroma和Getafix只是我们正在开发的几个大型代码项目中的两个,它们利用机器学习来改进软件工程。随着这一领域的进步,我们认为编程应该成为一个半自由的任务,人类只是表达更高层次的想法,详细的实现由计算机本身完成。

我们要感谢Koushik Sen和Di Yang在这个项目上所做的工作。

原文:https://ai.facebook.com/blog/aroma-ml-for-code-recommendation/

本文为 CSDN 翻译,转载请注明来源出处。

2019年人工智能系统学:

https://edu.csdn.net/topic/ai30?utm_source=csdn_bw
<https://edu.csdn.net/topic/ai30?utm_source=csdn_bw>

【END】



作为码一代,想教码二代却无从下手:

听说少儿编程很火,可它有哪些好处呢?

孩子多大开始学习比较好呢?又该如何学习呢?

最新的编程教育政策又有哪些呢?

下面给大家介绍CSDN新成员:极客宝宝(ID:geek_baby)

戳他了解更多↓↓↓



 热 文 推 荐 

微软 Build 2019 对开发者意味着什么?
<https://blog.csdn.net/csdnnews/article/details/89922708>

TIOBE 5 月编程语言排行榜:Python、C++ 竞争白热化,Objective-C 已沦为小众语言
<https://blog.csdn.net/csdnnews/article/details/89879992>

☞社交界的 Linux,为何败给了 Facebook、Twitter?
<http://mp.weixin.qq.com/s?__biz=MjM5MjAwODM4MA==&mid=2650719726&idx=4&sn=f56bec93e1bb870a4a544212adcad15e&chksm=bea6b43d89d13d2bcac52133f93f0bed22ec514ab9fb3745cd36ffeb5bdd9444ec7912e26178&scene=21#wechat_redirect>

让孩子进阶中产的唯一路径是编程?
<https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/78168830>

☞漫画:如何给女朋友解释灭霸的指响并不是真随机"消灭"半数宇宙人口的?
<http://mp.weixin.qq.com/s?__biz=MzA5MzY4NTQwMA==&mid=2651010740&idx=4&sn=915493c0b17e3fb82c60133f94d765cf&chksm=8bad8543bcda0c553682d614b7afbcfb56e26ad47220725a16836289f06ebef713ff3a840c53&scene=21#wechat_redirect>

27亿人的伟大游戏, Facebook推出稳定币已迫在眉睫?
<https://blog.csdn.net/Blockchain_lemon/article/details/89913086>

专访NIPS主席:如何保证论⽂评审的公平性?| 人物志
<https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/89899086>

SpringCloud微服务如何优雅停机及源码分析 | 技术头条
<https://blog.csdn.net/FL63Zv9Zou86950w/article/details/89880034>

☞她说:为啥程序员都特想要机械键盘?这答案我服!
<http://mp.weixin.qq.com/s?__biz=MzA5MjcxNjc2Ng==&mid=2650559816&idx=1&sn=380cfd3d18fb987c0073bf1b8289155a&chksm=88601ef9bf1797ef9e671113fdeed0dac0e1750691de9c6a594dd46706f72aeafa9028b57fe5&scene=21#wechat_redirect>
 
System.out.println("点个在看吧!");
console.log("点个在看吧!");
print("点个在看吧!");
printf("点个在看吧!\n");
cout << "点个在看吧!" << endl;
Console.WriteLine("点个在看吧!");
Response.Write("点个在看吧!");
alert("点个在看吧!")
echo "点个在看吧!"

点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。

你点的每个“在看”,我都认真当成了喜欢

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信