网页源代码抓取工具( 一个名为Bing开发助手(BDA)的示例代码以学习如何解决与编程相关的问题)

优采云 发布时间: 2022-02-08 02:13

  网页源代码抓取工具(

一个名为Bing开发助手(BDA)的示例代码以学习如何解决与编程相关的问题)

  

  引用:H. Zhang、A. Jain、G. Khandelwal、C. Kaushik、S. Ge、W. Hu,“Bing 开发人员助手:通过推荐示例代码提高开发人员生产力”,软件基础国际研讨会论文集工程,第 956-961 页,2016.

  概括

  在编程实践中,开发人员经常需要示例代码来学习如何解决与编程相关的问题。例如,如何重用大型软件库的应用程序编程接口(API),如何实现某个功能。我们相信,以前编写的代码可以帮助开发人员编写新程序,帮助他们了解其他人是如何解决类似问题的。我们开发了一个名为 Bing Development Assistant (BDA) 的工具,它通过推荐从公共软件存储库(如 GitHub)和网页(如 Stack Overflow)中挖掘的示例代码来提高开发人员的工作效率。BDA 可以自动挖掘实现 API 或回答代码搜索的代码片段。它是作为 Microsoft Visual Studio 的免费插件实现的,自 2014 年 12 月首次发布以来已获得超过 670K 的下载量。

  1.简介

  编程有时很难。在实践中,开发人员经常面临许多与解决问题相关的挑战。例如,开发人员经常想知道如何实现某个功能(例如,如何在 C# 中以 PNG 格式保存图像)。虽然 API(应用程序编程接口,如 .NET Framework 中的 Image.Save 和 Image.Tag 方法)提供了一种重要的软件重用形式并被广泛用于有效解决问题,但开发人员仍然需要知道“如何重用 API? ”。.NET 框架等大型软件框架可能收录数百甚至数千个 API。程序员通常不记得应该如何重用 API 函数。许多 API 也没有很好的文档记录。在 2009 年微软进行的一项调查中,67. 6% 的受访者表示学习 API 的资源不足或缺乏是一个障碍。除了 API 功能,开发人员可能还需要了解公共类、结构或属性的用法。因此,希望开发者遇到编程困难时,IDE提供API使用示例代码。

  多年来,已经开发和部署了数百万个软件程序。这些程序的源代码通常存储在软件存储库(例如 GitHub)中,可以作为开发人员的重要可重用资产。以前编写的程序可以帮助开发人员了解其他人是如何解决类似问题的,并且可以作为编写新程序的基础。此外,Stack Overflow 等以开发人员为中心的在线问答 (QA) 论坛的出现为解决编程相关问题提供了丰富的资源(包括示例代码)。

  许多现代集成开发环境(IDE,例如 Microsoft Visual Studio)为高效开发程序提供了丰富的功能。但是,大多数 IDE 不向开发人员提供示例代码。虽然开发人员可以使用 Bing 或 Google 等常规 Web 搜索引擎来查找解决方案,但他们通常需要经常离开 IDE 环境并在 IDE 和 Web 浏览器之间切换上下文。这会导致生产率降低。此外,某些网络搜索引擎可能无法很好地支持与编程相关的问题,例如使用某个 API。

  我们开发了一种称为 Bing 开发助手 (BDA) 的工具,通过挖掘软件存储库和网页来帮助提高开发人员的工作效率。我们将 BDA 的后端部署为 Microsoft Azure 服务,并将前端实现为 Visual Studio 扩展。BDA 可以通过 Visual Studio 的 IntelliSense 功能自动检测当前编程上下文中正在编辑的 API,并提供收录 API 使用情况的示例代码。BDA 还利用 Bing 搜索引擎来支持基于自由文本的代码搜索查询。BDA 为示例解决方案提供本地入口,以更有效地完成任务。

  目前,BDA 支持 C/C++/C# 语言。它在开发人员中很受欢迎。自 2014 年 12 月首次发布以来,它已吸引了超过 670,000 次下载。BDA 现在可在以下网址下载: 。我们还扩展了 BDA 以支持更多语言(如 Java 和 JavaScript)和更多用例。

  2.从软件仓库获取示例代码

  在本节中,我们描述了一个从软件存储库中提取 API 示例代码的框架。示例代码用于了解各种 API 的使用,包括公共类、函数、结构、属性等。图 1 显示了我们方法的一般框架。我们首先通过 网站 从 MSDN 和 GitHub 等中抓取源代码项目来构建大型软件存储库。存储库收录用不同语言编写的源文件,例如 C/C++/C#/Java。然后,我们利用 Clang[1](用于 C/C++)、Roslyn[2](用于 C#)和 JDT[3](用于 Java)等编译器来静态分析这些源文件并生成中间表示(抽象语法树) . 可以从 AST 中推断出 API 相关的源代码信息。生成的 API 使用数据,包括有关项目、文件、行等的信息,存储在 Azure 表 [4] 中。最后,可以提取相关示例代码使用(Visual Studio IDE等客户端)。特别是,我们开发了一个静态分析器,它将源代码文件解析为 AST,然后在访问每个 AST 节点时执行数据提取。分析器基于编译器前端(例如 Clang 的 LibTooling,一个用于公开 AST 的库)。这样我们就不需要任何 .dll 或 .so 文件或任何特定的运行时环境

  

  图 1:从软件存储库中挖掘 API 使用情况

  静态分析器使用的算法如图2所示:

  

  图 2:提取 API 使用 d 的算法

  它收录三个主要部分:第一个(Main)是将源代码文件解析成一个AST,第二个(Visit)是遍历AST中的节点,第三个(Process_*)是一组AST对应的不同类型的节点功能。给定源代码文件和头文件应该驻留的目录,分析器解析源代码文件和相关的头文件。源代码文件的 AST 和头文件的 AST 组合成一个大的 AST 作为中间表示。在生成组合的 AST 后,分析器执行 AST 的有序遍历。当分析器访问我们感兴趣的节点时,例如函数调用或变量声明,它会按类型进一步处理 AST 节点。在图 2 中,我们只展示了处理函数调用的伪代码。

  我们使用一个 API 调用示例来说明该算法(图 3)。图 3 收录整个 AST 的片段,以及两个相应的源代码文件。当我们访问“ac”的节点时,我们发现一个节点实际上上面是一个函数调用——"foo(1)"。我们使用被调用者的标识符在头文件的AST节点中查找它的有效声明。结果,我们发现声明节点在“ah”是我们想要的。然后我们检查这个文件的来源。在这种情况下,“ah”文件与“ac”来自同一目录,因此我们将其标记为用户定义的API并记录下来以及“ac”中的源代码位置。

  

  图 3:API 调用示例

  我们面临的一个挑战是第 3 方库支持。这实际上体现在图 2 中的 Which_Library 函数中。我们需要知道 foo 来自哪个库 API。如果我们可以解决依赖关系(例如,在 C# 的情况下,它的依赖关系可以在 Nuget[5] 的帮助下解决),我们构建一个对列表。将源代码文件解析成AST,访问AST中的每个节点后,我们就可以提取出我们想知道的API,搜索对应的库名。

  但是,在某些语言(如C/C++)中,由于项目的平台/环境设置,我们通常无法通过执行make文件来成功构建项目。解决所有项目依赖关系也不容易。由于缺乏相关的头文件,某些第三方库的缺乏使得识别第三方库的 API 更具挑战性。考虑图 3 中描述的情况,如果头文件“ah”丢失,我们只知道 foo 是一个函数调用语句,但我们不知道函数在哪里声明。在这种情况下,我们将无法编译源代码文件。

  BDA 支持常用第三方库的列表。我们使用 Nuget 和 GitHub 来选择最流行的第三方库(例如,我们为 C/C++ 选择了 1200 个流行的库),这些库被开发者社区广泛使用。我们还生成了一个对列表,其中 libname 代表第三方库的名称,path 代表头文件的确切路径。在程序分析期间,我们获得了被分析的 API 的路径,并

  在列表中搜索。这样,即使我们无法成功构建项目,也可以获得API所属的第3方库。

  处理完软件仓库中的所有项目后,我们得到API使用数据(包括API名称、所属库、项目、文件、行号等信息)。我们将此数据存储在 Microsoft Azure 表中。根据数据的用途,可以针对各种应用场景轻松检索 API 的示例代码

  在 BDA 客户端中,我们侦听 Visual Studio 的 IntelliSense[6] 接口以获取正在编辑的程序的上下文。IntelliSense 接口可以自动为开发人员提供可在当前编程上下文中使用的 API 列表。此类 API 信息用于在 Visual Studio 环境中触发我们的 BDA 示例代码服务。

  3.从 Bing 搜索引擎获取解决方案

  为了帮助开发者了解如何实现某个功能,我们将代码搜索组件集成到开发者助手中。开发人员可以输入描述问题的自然语言查询(例如,如何保存图像)。BDA 可以使用 Bing 搜索引擎 ( ) 自动调用网络搜索并从返回的网页(例如 Stack Overflow 和 MSDN 网页)中获取相关片段。图 4 显示了使用 Bing 进行挖掘的示例代码的总体框架

  

  图 4:使用 Bing 挖掘示例代码

  给定用户查询,BDA 首先通过附加当前编程上下文中使用的编程语言来扩展原创查询(例如“如何在 c# 中保存图像”)。然后它会调用 Bing 搜索引擎来查找与该查询相关的网页。在检索到前 10 个网页后,BDA 识别并从 HTML 页面中提取代码(基于 HTML 标签,如 hprei、hcodei、hpi 和 hdivi)。BDA 还根据相关性和投票/接受的数量对提取的片段进行排名,并将它们显示在 Visual Studio 环境中。这样,用户无需启动单独的 Web 浏览器即可执行代码搜索查询。我们的用户研究表明,每个查询的平均响应时间为 1.5 秒,提供流畅的用户体验。关于 BDA 代码搜索功能的更多细节可以在 [7] 中找到。

  除了提供代码片段外,BDA 还支持基于用户查询的示例商品推荐。代码示例项目是开发人员可以下载、构建和运行的完整 Visual Studio 解决方案。收到用户查询后,BDA 可以调用 Bing 搜索引擎从 MSDN 和 GitHub 等站点检索最相关的项目。项目信息(如项目 URL、作者、许可证、评级等)将被提取并显示在 Visual Studio 环境中。通过重用整个解决方案可以提高开发人员的工作效率。

  BDA 还可以提供编译错误的解决方案。使用 Visual Studio 编译程序时发生编译错误后,用户只需右键单击并调用上下文搜索即可。BDA 客户端将提取当前上下文(例如错误代码/消息、项目类型、数据类型、正在使用的编程语言等)。然后,它将上下文发送给后端服务,后端服务将从上下文中提取相关功能,生成上下文查询,并调用必应搜索引擎获取编译错误的示例解决方案,并将获取的示例代码返回给用户。例如,假设我们正在编辑一个 C++ 程序并使用“std::string”类来存储“hello world”字符串。如果我们忘记收录头文件“字符串”,Visual Studio 将报告错误消息,如“ string' 不是 'std' 的成员。这个消息可能会让一些新开发者感到困惑。BDA 可以通过提供示例解决方案来帮助他们。错误消息和其他上下文信息会自动组合以形成一个查询,该查询将传递给 BDA 后端服务以进行 Bing 搜索。Bing 搜索结果(在本例中为有关解决相同编译问题的 Stack Overflow 页面)将返回并显示在 Visual Studio 中。

  4.工具实现

  为了从源代码存储库中获取有关 API 使用的示例代码,我们通过从 MSDN 和 GitHub 上抓取项目来构建一个*敏*感*词*的代码库。为了移除虚拟项目,对于 GitHub,我们只抓取至少有一颗星的项目。我们总共抓取了 65,253 个项目。这些项目的总大小约为 437 GB,收录约 350 万个源代码文件。表 1 显示了所得结果的统计数据。

  

  API 使用数据和示例代码存储在世界各地的许多 Microsoft Azure 服务器中。索引和检索过程由 Microsoft Azure Table 执行。客户端是一个支持Microsoft Visual Studio (2012-2016)的扩展。我们挂钩到Visual Studio的IntelliSense接口来获取正在编辑的程序的上下文。IntelliSense提供的API触发后端BDA服务。返回API 示例代码将自动从 Azure 服务器获取并显示在 Visual Studio 中。

  

  图 5:推荐 API 示例代码

  图 5 显示了 BDA Recommendation API 示例代码的屏幕截图。当用户键入不完整的 API 时,Visual Studio(通过其 IntelliSense 功能)将推荐候选 API 列表。如果用户不知道如何使用这些 API,可以在 Visual Studio 环境中查看 BDA 返回的示例代码。在图 5 中,用户输入了一个不完整的 API 'doc.l...',BDA 自动推荐候选函数 'Load' 的代码片段。

  目前,BDA 提供了通过 Bing 搜索从各种网站 中采集的示例代码/项目。这些 网站 包括 Stack Overflow、dotnetperls、C#411、Cppreference 和 MSDN。表 2 显示了截至 2016 年 6 月从两个流行的软件论坛(Stack Overflow 和 MSDN)获得的代码片段总数。

  

  图 6:根据用户 q 推荐示例代码

  

  图7:根据我们推荐样例项目

  图 6 显示了用于回答用户的自由文本代码搜索查询的 BDA 屏幕截图。用户通过 How do I 界面输入如何保存图像的查询。请求被发送到 BDA 后端,从网页中提取的相关代码片段(在本例中为 Stack Overflow 中的代码片段)返回给用户。图 7 显示了推荐示例项目的屏幕截图。通过 BDA 的搜索框,用户可以进行自由文本查询(本例中为“.netcompiler”)并访问许多流行的开源项目站点,例如 GitHub 和 MSDN。图 7 显示了 BDA 检索项目,例如 .NET 编译器平台 Roslyn。为了便于重用,BDA 还可以将这些库拉入用户的 Visual Studio 环境中。

  5.结论

  在本文中,我们将介绍 Bing 开发助手 (BDA),该工具通过推荐从公共软件存储库(如 GitHub)和网页(如 Stack Overflow)中挖掘的 API 示例代码来帮助提高开发人员的工作效率。BDA 提供实现 API 或回答代码搜索查询的代码片段。使用 BDA,开发人员可以从 Visual Studio IDE 中查找和重用大量示例代码。

  我们现在将 BDA 扩展为一项服务,并将其与其他 Microsoft 服务(如 . 通过 Bing 搜索,开发者可以获取 BDA 服务提供的各种编程语言的 API 示例代码。返回的示例代码显示在 Web 浏览器中。API 使用数据和示例代码也可供其他软件工程研究项目使用。Bing Development Assistant 的愿景是为开发人员提供技术帮助。目前它只支持 Visual Studio。我们将很快扩展到其他 IDE 生态系统。

  参考

  [1]

  [2]

  [3]

  [4]

  [5]

  [6]

  [7] Y. Wei 和 N. Chandrasekaran 以及 S. Gulwani 和 Y. Hamadi,Building Bing 开发人员助理,微软技术报告 MSR-TR-2015-36,201 年 5 月5.

  谢谢

  本文由南京大学软件学院2018级硕士袁阳阳翻译转录。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线