一种基于程序分析的Node.JS代码片段环境依赖性的自动推断方法技术

技术编号:33699067 阅读:9 留言:0更新日期:2022-06-06 08:04
本发明专利技术为一种基于程序分析的Node.JS代码片段环境依赖性的自动推断方法:首先,根据libraries.io数据集中的SourceRank构建已知npm包的知识库;其次,使用静态分析,动态分析和关联规则挖掘的组合来发现有关包依赖性的信息,并根据其互相之间的关系建模为相互依赖图,使用图形数据库存储;然后,对于给出的新的Node.JS代码片段,解析目标代码并提取所有导入资源的列表,将其映射回一组可以安装的软件包,再利用一种用于遵循安装顺序的直接依赖和传递依赖性的推理算法,查找到的依赖项进行正确排序,得到最后的返回结果。得到最后的返回结果。得到最后的返回结果。

【技术实现步骤摘要】
一种基于程序分析的Node.JS代码片段环境依赖性的自动推断方法


[0001]本专利技术属于计算机
尤其是软件
本专利技术提出了一种基于程序分析的Node.JS代码片段环境依赖性的自动推断的方法,能够有效地针对当前在各大代码交流平台共享的代码无法运行、难以复现的问题,从而促进代码技术交流、提高开发效率。

技术介绍

[0002]Node.JS是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。因此在几年的时间里,Node.JS逐渐发展成一个成熟的开发平台,吸引了许多开发者。有许多大型高流量网站都采用Node.JS进行开发,此外,开发人员还可以使用它来开发一些移动Web框架。
[0003]Node.JS的成功原因除了它采用了前端js相同的语法,直接吸引了一大波前端开发者作为初始用户之外,它内置的包管理器npm也居功至伟。npm是世界上最大的软件注册表,每星期大约有30亿次的下载量,包含超过600000个包(package)。来自各大洲的开源软件开发者使用npm互相分享和借鉴。包的结构使开发者能够轻松跟踪依赖项和版本。npm能够很好的管理Node.JS项目的依赖,也使得开发者发布自己的包变的异常容易。这样一来,不论你使用别人的包,还是自己发布包给别人使用,成本都不大。
[0004]当前,由于代码开源社区越来越繁荣,代码开源在开发者圈中越来越被关注,诸如StackOverFlow、GitHub Gist和Jupyter社区等平台注册用户非常多且活跃,其上已经累积了成千上万的代码共享片段。这相当于为用户提供了一个非常有用的应用商店,所有人都可以自由地下载所需要的代码片段或项目,这为开发者提供了巨大便利。
[0005]Node.JS的大规模应用扩大了开发者间交流的需求。诸如StackOverFlow、GitHub Gist和Jupyter社区等平台为用户提供了一个交流技术、共享代码的途径。在这些平台的诸多问题的解答中,回答者通常会附加相应的代码片段。这些代码片段通常经过了回答者的验证,可以用于解决问题。
[0006]虽然代码共享提供了许多便利,但这些共享的代码通常存在着无法运行、难以复现的问题。据研究,Gist平台上超过50%的代码在原生环境下无法顺利运行。虽然存在着代码本身有错误的可能,但通常来说,主要是不同用户的运行环境不一致所导致的,其中相关依赖库缺失是最主要的问题。C.Parnin的调查显示,开发人员为代码配置其运行环境依赖的时间消耗通常不小于20分钟。因此,Nodejs代码片段环境依赖性的自动推断的方法对促进技术交流、提高开发效率具有很强的现实意义。

技术实现思路

[0007]本专利技术的主要工作是提出一种基于程序分析的Node.JS代码片段环境依赖性的自动推断方法。首先,本专利技术关注的是Node.JS代码片段中的函数调用和包含该函数声明的依赖包之间的关系。其次,本专利技术使用脱机知识库来正确推断目标脚本的依赖关系。此知识库
包含包,其版本和资源以及它们之间的关系。它是通过对Libraries.io数据集中的已知的包应用静态和动态分析而构建的。其中,静态分析枚举包的已知资源以供以后检索,动态分析收集有关传递依赖性的信息。然后,公共Python项目中依赖关系的关联规则挖掘利用了开发人员生成的系统级传递依赖关系的知识。最后,针对给出的陌生的代码片段,在脱机知识库的基础上,使用了遵循安装顺序的直接依赖和传递依赖的推理算法。针对以上问题,本专利技术的工作和贡献如下:
[0008]1.一种使用静态分析、动态分析以及挖掘利用开发人员的行为生成的系统级传递依赖关系的知识源来计算包依赖关系的技术。本专利技术根据libraries.io数据集中的SourceRank来分析npm上使用率高的前万个包,根据源级别选择包来包含最常用的库,因为常用的库可以影响大部分的包生态系统,而整个包生态系统的大小无法进行全面分析。通过静态分析来找出并列举出已知的常用包资源。对于某些软件包可能无法正确列出依赖项的情况,我们同样通过使用来自Libraries.io数据集中的SourceRank的前万个包进行动态分析来解决。
[0009]2.一种用于遵循安装顺序的直接依赖和传递依赖性的推理算法。对于代码片段的环境依赖项,还有一个附加约束,即在推断后必须以正确的方式返回依赖项,否则可能会因为依赖包之间的直接依赖和传递依赖等问题,导致出现错误。推理算法首先从目标应用程序中提取导入的资源,然后询问静态分析生成的知识库,以确定资源可能属于的包集合,然后遍历包集合之间的依赖关系图以确定传递依赖性。
附图说明
[0010]图1为本专利技术知识库中最终建模而成的相互依赖图
[0011]图2为本专利技术用于遵循安装顺序的直接依赖和传递依赖性的推理算法流程示意图
[0012]图3为本专利技术基于程序分析的Node.JS代码片段环境依赖性的自动推断生成示意图
具体实施方式
[0013]本专利技术具体包括以下步骤:
[0014]1)首先根据libraries.io数据集中的SourceRank的源级别选择最常用的包。通过静态分析枚举包的已知资源以供以后检索。
[0015]2)对于无法正确列出依赖项的软件包,我们使用动态分析来解决。尝试使用npm install安装软件包,记录成功安装的资源,对于安装失败的资源,解析其错误输出,并根据输出,我们的动态分析过程将依赖记录输入知识库。
[0016]3)我们将知识库建模为相互依赖图,使用图形数据库存储。其中节点表示知识库中的现有对象,有向边表示它们之间的关系。
[0017]4)对于给出的新的Node.JS代码片段,解析目标代码并提取所有导入资源的列表,这一步主要通过构建源代码的抽象语法树(AST)来进行实现。
[0018]5)知道了代码的资源后,就可以将其映射回一组可以安装的软件包。我们通过查询我们的知识库和潜在匹配记录的包管理系统来执行此反向查找。
[0019]6)在5)中得到所需的依赖包后,根据3)中的相互依赖图,以包的直接依赖和传递
依赖性来对查找到的依赖项进行正确排序,得到最后的返回结果。
[0020]步骤1)中静态分析的流程如下:对于libraries.io数据集中的SourceRank的源级别排序中前万个npm的包,尝试使用npm install进行安装,如果安装成功,则记录包资源。对于少部分无法安装的软件包,我们尝试手动下载和解析包的分发。
[0021]步骤2)某些软件包可能无法正确列出其依赖项,从而阻止npm在安装期间自动处理解析。我们会在安装失败时,解析输出以查找其错误输出,例如:“no module named<name>”、“cannot find<name>”等,这表明依赖于某些不存在的包,并根据它的提示,将其依赖记录输入知识库。
[002本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于程序分析的Node.JS代码片段环境依赖性的自动推断方法:首先,根据libraries.io数据集中的SourceRank构建已知npm包的知识库;其次,使用静态分析,动态分析和关联规则挖掘的组合来发现有关包依赖性的信息,并根据其互相之间的关系建模为相互依赖图,使用图形数据库存储;然后,对于给出的新的Node.JS代码片段,解析目标代码并提取所有导入资源的列表,将其映射回一组可以安装的软件包,再利用一种用于遵循安装顺序的直接依赖和传递依赖性的推理算法,查找到的依赖项进行正确排序,得到最后的返回结果。2.根据权利要求1所描述的一种基于程序分析的Node.JS代码片段环境依赖性的自动推断方法,其特征包括以下几个步骤:1)首先根据libraries.io数据集中的SourceRank的源级别选择最常用的包。通过静态分析枚举包的已知资源以供以后检索。2)对于无法正确列出依赖项的软件包,我们使用动态分析来解决。尝试使用npm install安装软件包,记录成功安装的资源,对于安装失败的资源,解析其错误输出,并根据输出,我们的动态分析过程将依赖记录输入知识库。3)我们将知识库建模为相互依赖图,使用图形数据库存储。其中节点表示知识库中的现有对象,有向边表示它们之间的关系。4)对于给出的新的Node.JS代码片段,解析目标代码并提取所有导入资源的列表,这一步主要通过构建源代码的抽象语法树(AST)来进行实现。知道了代码的资源后,就可以将其映射回一组可以安装的软件包。我们通过查询我们的知识库和潜在匹配记录的包管理系统来执行此反向查找。5)在4)中得到所需的依赖包后,根据3)中的相互依赖图,以包的直接依赖和传递依赖性来对查找到的依赖项进行正确排序,得到最后的返回结果。3.根据权利要求2所述的基于程序分析的Node.JS代码片段环境依赖性的自动推断方法,其特征是步骤1)中,一种使用静态分析生成的系统级传递依赖关系的知识源来计算包依赖关系的技术。根据libraries.io数据集中的SourceRank的源级别选择最常用的包。通过静态分析枚举包的已知资源以供以后检索,即建立一个脱机知识库。4.根据权利要求2所述的基于程序分析的Node.JS代码片段环境依赖性的自动推断方法,其特征是步骤2)中,对于无法正确列出依赖项的软件包,我们使用动态分析来解决的方法。某些软件包可能无法正确列出其依赖项,从而阻止npm在安装期间自动处理解析。我们会在安装失败时,解析输出以查找其错误输出,例如:“no module named<name>”、“canno...

【专利技术属性】
技术研发人员:张卫丰黄泽龙周国强
申请(专利权)人:南京邮电大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1