掌桥专利:专业的专利平台
掌桥专利
首页

一种共享方法及装置

文献发布时间:2024-04-18 20:01:23


一种共享方法及装置

本申请要求在2022年7月28日提交中华人民共和国知识产权局、申请号为202210901542.0、发明名称为“集成开发环境插件底座框架”的中国专利申请的优先权,其全部内容通过引用结合在本申请中。

技术领域

本申请涉及计算机技术领域,尤其涉及一种共享方法及装置。

背景技术

现代程序开发基本都需要依赖集成开发环境(integrated developmentenvironment,IDE)架构实现,当前业界IDE种类繁多,功能侧重点也各有不同,业界主流的IDE技术架构都做到了架构分离,即将内核(core)与插件(plugin)相分离,内核主要负责完成对操作系统的隔离,插件负责完成对功能的隔离。

IDE架构中包括多个代码分析类的插件,比如代码跳转、代码补全和代码生成等多个语言服务类插件。IDE架构中多个插件之间互相隔离,存在多个插件可能需要具备某个相同能力,甚至需要执行某项相同操作,导致资源浪费的问题。

发明内容

本申请提供一种共享方法及装置,用于解决IDE架构中资源浪费的问题。

第一方面,本申请提供一种共享方法,该共享方法适用于IDE架构,IDE架构包括共享装置、第一插件和第二插件,共享方法由共享装置执行。

其中,共享装置中存储有第一插件提供的M个知识数据,M为正整数。方法包括:共享装置接收第二插件的数据获取请求;共享装置根据数据获取请求,从M个知识数据中查找目标知识数据;共享装置向第二插件发送目标知识数据。

上述技术方案中,共享装置中存储有第一插件提供的M个知识数据,当第二插件需要使用M个知识数据中的某个知识数据(即目标知识数据)时,第二插件可直接向共享装置请求该目标知识数据,而无需再对代码文件进行分析得到,有助于节省计算资源。

在一种可能的实现方式中,共享装置接收第二插件的数据获取请求之前,还包括:共享装置接收第一插件的数据注册请求,数据注册请求中包括M个知识数据的标识;共享装置记录M个知识数据的标识。

上述技术方案中,第一插件可以先向共享装置注册M个知识数据的标识,从而共享装置能够确定当前共享装置中是否存在数据获取请求所要请求的目标知识数据。

在一种可能的实现方式中,共享装置记录M个知识数据的标识之后,还从第一插件中获取M个知识数据,并存储该M个知识数据;其中,M个知识数据是第一插件对工作空间中的代码文件进行分析得到的;或者,M个知识数据是第一插件对基础数据分析得到的,基础数据是共享装置对工作空间中的代码文件进行分析得到的;第一插件和第二插件共同作用于该工作空间中;基础数据是抽象语法树、令牌(token)序列中一项或多项;M个知识数据包括代码索引、静态单赋值、控制流图、程序依赖图中一项或多项。

上述技术方案中,共享装置从第一插件中同步M个知识数据,从而共享装置能够从其存储的M个知识数据中,查找到数据获取请求所要请求的目标知识数据。

在一种可能的实现方式中,共享装置存储M个知识数据之后,共享装置还从第一插件中获取M'个知识数据的变更信息;共享装置根据M'个知识数据的变更信息,更新M个知识数据中的M'个知识数据;其中,M'个知识数据的变更信息是第一插件根据工作空间中的代码文件的变更信息,进行增量分析得到的;或者,M'个知识数据的变更信息是第一插件根据基础数据的变更信息,进行增量分析得到的,基础数据的变更信息是共享装置根据工作空间中的代码文件的变更信息,进行增量分析得到的。

上述技术方案中,共享装置还能从第一插件中获取知识数据的变更信息,并根据知识数据的变更信息更新本地对应的知识数据,从而保障共享装置中存储的知识数据与第一插件分析得到的知识数据相同,即保障共享装置中存储的知识数据为最新的知识数据。

在一种可能的实现方式中,共享装置向第二插件发送目标知识数据之后,还接收第二插件对目标知识数据的订阅请求,其中,订阅请求用于获取目标知识数据的变更信息;共享装置在从第一插件中接收目标知识数据的变更信息之后,还向第二插件发送目标知识数据的变更信息。

上述技术方案中,共享装置在确定目标知识数据发生变更时,还向第二插件发送目标知识数据的变更信息,从而保障第二插件获取到的目标知识数据为最新的知识数据。

在一种可能的实现方式中,共享装置中存储有生产插件提供的m个知识数据,生产插件包括第一插件,m为正整数;在用户开发第三插件的过程中,共享装置还向前端模块发送m个知识数据的描述信息,以使得用户根据前端模块中显示的、m个知识数据的描述信息,从m个知识数据中选择第三插件能够从共享装置中获取的知识数据。

上述技术方案中,共享装置将其存储的m个知识数据的描述信息展示在前端模块中,用户在开发第三插件的过程中,可以得知哪些知识数据能够直接从共享装置中获取,所以设置第三插件从共享装置中请求该知识数据,而无需再次对代码文件进行分析,即避免多个插件重复分析代码文件,有助于节省计算资源。

第二方面,本申请提供一种共享方法,适用于IDE架构,IDE架构包括共享装置、第一插件和第二插件,共享方法由共享装置执行。

其中,共享装置中注册有第一插件提供的N个服务,N为正整数。方法包括:共享装置接收第二插件的服务调用请求;共享装置根据服务调用请求,调用N个服务中的目标服务;共享装置接收第一插件提供目标服务得到的操作结果,向第二插件发送操作结果。

上述技术方案中,共享装置中注册有第一插件提供的N个服务,当第二插件需要使用N个服务中的某个服务(即目标服务)时,第二插件可直接向共享装置请求调用该目标服务,而无需在第二插件中实现该目标服务,有助于节省计算资源。

在一种可能的实现方式中,第一插件和第二插件作用于同一个工作空间,操作结果是第一插件对工作空间提供目标服务到的。

在一种可能的实现方式中,共享装置接收第二插件的服务调用请求之前,还接收第一插件的服务注册请求,服务注册请求中包括N个服务的第一接口地址,服务的第一接口地址用于共享装置调用服务;共享装置根据N个服务的第一接口地址,生成N个服务的第二接口地址,服务的第二接口地址用于第二插件调用服务;共享装置记录N个服务的第一接口地址和第二接口地址。

上述技术方案中,第一插件可以先向共享装置注册N个服务的第一接口地址,从而共享装置能够确定当前共享装置中是否提供服务调用请求所要请求的目标服务。

在一种可能的实现方式中,共享装置记录N个服务的第一接口地址和第二接口地址之后,还接收第二插件的服务查询请求,服务查询请求中包括目标服务的标识,N个服务中包括目标服务;共享装置向第二插件发送目标服务的第二接口地址。相应的,共享装置根据服务调用请求,调用N个服务中的目标服务,具体可以是,共享装置根据服务调用请求中的目标服务的第二接口地址,确定目标服务的第一接口地址;共享装置根据目标服务的第一接口地址,调用目标服务。

上述技术方案中,共享装置将向第二插件发送目标服务的第二接口地址,从而第二插件在需要请求调用目标服务时,向共享装置发送包含有目标服务的第二接口地址的服务调用请求,共享装置根据服务调用请求中目标服务的第二接口地址,根据目标服务的第一接口地址,调用目标服务。

在一种可能的实现方式中,共享装置中注册有生产插件提供的n个服务,生产插件包括第一插件,n为正整数;在用户开发第三插件的过程中,方法还包括:共享装置向前端模块发送n个服务的描述信息,以使得用户根据前端模块显示的、n个服务的描述信息,从n个服务中选择第三插件能够从共享装置中调用的服务。

上述技术方案中,共享装置将注册于该共享装置中的n个服务的描述信息,展示在前端模块中,用户在开发第三插件的过程中,可以得知哪些服务能够直接从共享装置中请求调用,所以设置第三插件从共享装置中请求调用该服务,而无需在第三插件中实现该服务,即避免在多个插件中实现相同的服务,有助于节省计算资源。

第三方面,本申请提供一种共享装置,适用于IDE架构,IDE架构包括装置、第一插件和第二插件;装置中存储有第一插件提供的M个知识数据,M为正整数;

装置包括:

数据查询模块,用于接收第二插件的数据获取请求;根据数据获取请求,从M个知识数据中查找目标知识数据;

数据下载模块,用于向第二插件发送目标知识数据。

在一种可能的实现方式中,装置还包括:数据注册模块;在数据查询模块接收第二插件的数据获取请求之前,数据注册模块用于接收第一插件的数据注册请求,数据注册请求中包括M个知识数据的标识;记录M个知识数据的标识。

在一种可能的实现方式中,装置还包括:数据上传模块;在数据注册模块记录M个知识数据的标识之后,数据上传模块用于:从第一插件中获取M个知识数据,存储M个知识数据;其中,M个知识数据是第一插件对工作空间中的代码文件进行分析得到的;或者,M个知识数据是第一插件对基础数据分析得到的,基础数据是装置对工作空间中的代码文件进行分析得到的;第一插件和第二插件共同作用于工作空间中;基础数据是抽象语法树、token序列中一项或多项;M个知识数据包括代码索引、静态单赋值、控制流图、程序依赖图中一项或多项。

在一种可能的实现方式中,数据上传模块存储M个知识数据之后,还用于:从第一插件中获取M'个知识数据的变更信息;根据M'个知识数据的变更信息,更新M个知识数据中的M'个知识数据;其中,M'个知识数据的变更信息是第一插件根据工作空间中的代码文件的变更信息,进行增量分析得到的;或者,M'个知识数据的变更信息是第一插件根据基础数据的变更信息,进行增量分析得到的,基础数据的变更信息是装置根据工作空间中的代码文件的变更信息,进行增量分析得到的。

在一种可能的实现方式中,数据下载模块向第二插件发送目标知识数据之后,还用于:接收第二插件对目标知识数据的订阅请求,订阅请求用于第二插件获取目标知识数据的变更信息;相应的,在数据上传模块从第一插件中接收目标知识数据的变更信息之后,数据下载模块还用于向第二插件发送目标知识数据的变更信息。

在一种可能的实现方式中,装置中存储有生产插件提供的m个知识数据,生产插件包括第一插件,m为正整数;在用户开发第三插件的过程中,数据查询模块还用于:向前端模块发送m个知识数据的描述信息,以使得用户根据前端模块显示的、m个知识数据的描述信息,从m个知识数据中选择第三插件能够从装置中获取的知识数据。

第四方面,本申请提供一种共享装置,适用于IDE架构,IDE架构包括装置、第一插件和第二插件;装置包括:

服务注册模块,用于注册第一插件提供的N个服务,N为正整数;

服务调用模块,用于接收第二插件的服务调用请求;根据服务调用请求,调用N个服务中的目标服务;接收第一插件提供目标服务得到的操作结果;向第二插件发送操作结果。

在一种可能的实现方式中,第一插件和第二插件作用于同一个工作空间,操作结果是第一插件对工作空间提供目标服务到的。

在一种可能的实现方式中,服务调用模块接收第二插件的服务调用请求之前,服务注册模块用于:接收第一插件的服务注册请求,服务注册请求中包括N个服务的第一接口地址,服务的第一接口地址用于装置调用服务;根据N个服务的第一接口地址,生成N个服务的第二接口地址,服务的第二接口地址用于第二插件调用服务;记录N个服务的第一接口地址和第二接口地址。

在一种可能的实现方式中,还包括:服务发现模块;在服务注册模块记录N个服务的第一接口地址和第二接口地址之后,服务发现模块用于:接收第二插件的服务查询请求,服务查询请求中包括目标服务的标识,N个服务中包括目标服务;向第二插件发送目标服务的第二接口地址。

在一种可能的实现方式中,服务调用模块在根据服务调用请求,调用N个服务中目标服务时,具体用于:根据服务调用请求中的目标服务的第二接口地址,确定目标服务的第一接口地址;根据目标服务的第一接口地址,调用目标服务。

在一种可能的实现方式中,服务注册模块中注册有生产插件提供的n个服务,生产插件包括第一插件,n为正整数;装置还包括:服务发现模块;在用户开发第三插件的过程中,服务发现模块用于:向前端模块发送n个服务的描述信息,以使得用户根据前端模块显示的、n个服务的描述信息,从n个服务中选择第三插件能够从装置中调用的服务。

第五方面,本申请提供一种计算设备集群,包括至少一个计算设备,每个计算设备包括处理器和存储器;至少一个计算设备的处理器用于执行至少一个计算设备的存储器中存储的指令,以使得计算设备集群执行上述第一方面或第一方面的任一种可能的实现方式中的方法,或者,执行上述第二方面或第二方面的任一种可能的实现方式中的方法。

第六方面,本申请提供一种包含指令的计算机程序产品,当指令被计算设备集群运行时,使得计算设备集群执行上述第一方面或第一方面的任一种可能的实现方式中的方法,或者,执行上述第二方面或第二方面的任一种可能的实现方式中的方法。

第七方面,本申请提供一种计算机可读存储介质,包括计算机程序指令,当计算机程序指令由计算设备集群执行时,计算设备集群执行上述第一方面或第一方面的任一种可能的实现方式中的方法,或者,执行上述第二方面或第二方面的任一种可能的实现方式中的方法。

第八方面,本申请提供一种共享系统,包括:上述第三方面或第三方面的任一种可能的实现方式中的装置,以及上述第四方面或第四方面的任一种可能的实现方式中的装置。

上述第三方面至第八方面中任一方面可以达到的技术效果可以参照上述第一方面或第二方面中有益效果的描述,此处不再重复赘述。

附图说明

图1为一种语言服务器分析代码的过程;

图2为一种IDE架构的示意图;

图3为本申请提供的一种IDE架构的示意图;

图4为本申请提供的一种第一插件向共享装置提供知识数据的流程示意图;

图5为本申请提供的一种数据注册表的示意图;

图6为本申请提供的一种代码文件和控制流图的示意图;

图7为本申请提供的另一种代码文件和控制流图的示意图;

图8为本申请提供的一种第二插件向共享装置请求知识数据的流程示意图;

图9为本申请提供的一种知识共享的交互示意图;

图10为本申请提供的再一种知识共享的交互示意图;

图11为本申请提供的一种第一插件向共享装置提供服务的流程示意图;

图12为本申请提供的一种服务注册表的示意图;

图13为本申请提供的一种第二插件向共享装置请求服务的流程示意图;

图14为本申请提供的一种服务共享的交互示意图;

图15为本申请提供的再一种服务共享的交互示意图;

图16为本申请提供的一种知识数据的共享装置的结构示意图;

图17为本申请提供的一种服务的共享装置的结构示意图;

图18为本申请提供的一种共享系统的结构示意图;

图19为本申请提供的一种计算设备的结构示意图;

图20为本申请提供的一种计算设备集群的结构示意图。

具体实施方式

为了更好的解释本申请实施例,先对本申请中的相关术语或技术解释:

1、集成开发环境(integrated development environment,IDE):一种辅助编程人员实现软件开发的应用软件,通常包括语言编辑器、自动构建工具等功能,属于一种开发工具。

IDE架构中通常分为内核层与插件层,其中,内核层负责实现操作系统底层指令的调用并实现部分基础公共能力,例如,环境服务和文件系统服务等;插件层利用内核层的应用程序编程接口(application programming interface,API)对基础公共能力进行调用与编排,从而实现相对应的插件功能,例如,代码定义跳转、引用查找等。

2、插件:是一种遵循预设规范的应用程序接口编写出来的程序,插件只能运行在程序规定的系统平台下,而不能脱离该规定的系统平台而单独运行。

3、语言服务协议(language server protocol,LSP):IDE与语言服务器(languageserver)二者作为通讯双方,均需要遵循的协议。

图1示例性示出的语言服务器分析代码的过程,其中,语言服务器可提供比如代码跳转、代码补全、代码生成、代码重构、代码缺陷检测、代码修复、测试用例检测等语言服务类的插件,该各插件均需要对代码进行分析并提取出与该代码相对应的知识数据。具体的,各插件通过对代码进行词法分析,生成令牌(token);然后通过对代码进行语法分析,生成抽象语法树(abstract syntax tree,AST),其中,token和抽象语法树可作为代码的基础数据。随后,各插件在抽象语法树和token的基础上提取得到代码的知识数据,知识数据例如是代码索引、静态单赋值(static single-assignment,SSA)、控制流图(control flowgraph,CFG)、程序依赖图(program dependence graph,PDG)等。

4、工作空间(workspace)包含以下资源:项目、文件、文件夹。工作空间有明显的层次结构,其中,项目在最高级,项目中有文件和文件夹,插件可以通过IDE的内核层提供的API来管理工作空间的资源。用户可以在项目启动时开启一个工作空间。

5、文件:是指包括软件代码的文件(也可称为是代码文件),以Java为例,该文件的文件后缀为.java,以C++为例,该文件的文件后缀为.cpp。

下面将结合附图,对本申请实施例进行详细描述。

如图2为一种IDE架构的示意图,IDE架构可以部署于开发装置中,开发装置包含于终端设备(如电脑)中。开发装置中可包括插件模块和前端模块。插件模块中包括K个插件,K为大于1的整数,其中,插件比如是语言服务类的插件,插件可用于开发应用程序。前端模块用于与用户交互。

示例性的,用户在前端模块中执行操作,比如打开一个用于开发应用程序的工作空间,或者,对已经打开的该工作空间中代码文件进行代码编辑等。相应的,前端模块根据用户执行的操作,生成用户交互事件,将用户交互事件发送至插件模块。

示例性的,用户在前端模块中打开一个工作空间时,前端模块生成的用户交互事件即用于指示用户打开的该工作空间。相应的,插件模块加载作用于该工作空间的K个插件,其中,K个插件中每个插件分析该工作空间中代码文件,以得到该代码文件的知识数据。用户通过前端模块对代码文件进行编辑时,前端模块生成的用户交互事件即用于指示用户对该代码文件进行编辑的内容,相应的,K个插件中每个插件根据用户对代码文件进行编辑的内容,以及编辑之前的代码文件,确定出最新的代码文件,并分析该最新的代码文件,以得到该最新的代码文件的知识数据。

本申请中,插件对代码文件进行的分析,均可认为是静态分析。

上述方案中,每个插件对应用程序进行开发时,都需要使用工作空间中的代码文件的知识数据,所以,每个插件都需要对代码文件分析得到知识数据。而多个插件分析该同一个代码文件得到的知识数据是相同的,存在重复分析的问题。

基于此,本申请在图2的基础上提供一种IDE架构,该IDE架构相比于图2中的IDE架构新增共享装置,本申请提供的IDE架构的示意图可参见图3。其中,共享装置用于实现插件模块中多个插件之间的知识数据的共享。

共享装置可以位于终端设备中,具体的,共享装置和开发装置位于同一个终端设备中,或者,共享装置和开发装置位于不同的终端设备中。共享装置比如是IDE架构中的语言服务类插件。此外,共享装置还可以位于远端,比如位于服务器中,或者位于边缘设备中。

以用户在前端模块中打开某个工作空间为例,前端模块生成的用户交互事件用于指示用户打开的工作空间。相应的,插件模块根据用户交互事件,依次加载作用于该工作空间的K个插件,比如插件模块依次加载插件1至插件K。插件1先分析该工作空间中代码文件,以得到代码文件的知识数据,插件1向共享装置发送该代码文件的知识数据,插件2至插件K中的任一个插件无需再次分析该代码文件,而是从共享装置中请求该代码文件的知识数据,从而实现作用于该工作空间中的K个插件中只需要有一个插件分析该代码文件即可,避免重复分析计算的问题。

相应的,本申请提供一种知识数据的共享方法,该知识数据的共享方法可适用于IDE架构,IDE架构中包括共享装置和开发装置,其中,开发装置包括第一插件和第二插件,共享装置与第一插件、第二插件分别连接。

结合图3示出的IDE架构示意图,比如,第一插件和第二插件分别是插件1和插件2,再比如,第一插件和第二插件分别是插件1和插件K等。

第一插件和第二插件可作用于同一个工作空间,工作空间中包括某个正在开发的应用程序的代码文件,也可以理解,第一插件和第二插件可用于共同开发该应用程序。其中,第一插件能够分析代码文件得到代码文件的知识数据,将分析得到的知识数据同步到共享装置中,第二插件能够从共享装置中请求该第一插件分析得到的知识数据。

本申请中,可将第一插件理解为知识数据的生产者,第二插件理解为知识数据的消费者。也可以理解,第一插件属于生产插件,第二插件属于消费插件。

如下分两部分解释说明本申请提供的数据共享方法,其中,第一部分:第一插件向共享装置提供知识数据;第二部分:第二插件从共享装置中请求知识数据。

参见图4示例性示出的第一插件向共享装置提供知识数据的流程示意图解释第一部分:

步骤401,第一插件对工作空间中代码文件进行分析得到M个知识数据,其中M为正整数。示例性的,M个知识数据包括代码索引、静态单赋值、控制流图、程序依赖图中一项或多项。

一个可能实现方式中,第一插件获取工作空间中代码文件,对代码文件进行分析,以得到M个知识数据,具体分析过程可参见图1相关实施例中描述。

可选的,在步骤401之前,第一插件先向共享装置请求获取M个知识数据,在确定共享装置的知识数据库中尚未存在该M个知识数据之后,对代码文件进行分析得到知识数据。一个可能实现方式中,第一插件向共享装置发送数据获取请求,数据获取请求中包括M个知识数据的标识,相应的,共享装置在确定当前不存该M个知识数据的情况下,向第一插件发送请求失败的响应。第一插件在接收到请求失败的响应之后,对代码文件进行分析,以得到该代码文件的M个知识数据。

步骤402,第一插件向共享装置发送数据注册请求,其中,数据注册请求中包括第一插件提供的M个知识数据的注册信息。

在一个可能实现方式中,共享装置在接收到数据注册请求之后,可先对请求来源方(即第一插件)的身份信息进行验证与鉴权,并在确定第一插件的身份信息通过验证与鉴权之后,从数据注册请求中获取M个知识数据的注册信息。

以M个知识数据中的一个知识数据为例说明:知识数据的注册信息中包括该知识数据的标识。可选的,知识数据的注册信息中还包括知识数据的描述、类型和数据结构中一项或多项。举例来说,知识数据是控制流图,控制流图的注册信息中包括控制流图的标识“codElf.CFG”,控制流图的描述“代码控制流图数据”,控制流图的类型“CFG”,以及控制流图的数据结构“点数据结构”。再举例来说,知识数据是程序依赖图,程序依赖图的注册信息中包括程序依赖图的标识“codElf.PDG”,程序依赖图的描述“代码程序依赖数据”,程序依赖图的类型“PDG”,以及程序依赖图的数据结构“边数据结构”。

需要指出的是,不限定步骤401和步骤402的先后顺序。第一插件可以先向共享装置发送数据注册请求(即执行步骤402),再对工作空间中代码文件进行分析得到知识数据(即执行步骤401)。或者,第一插件先执行步骤402,再执行步骤401。

步骤403,共享装置记录第一插件提供的M个知识数据的注册信息。

可选的,共享装置中包括数据统计信息,共享装置在从数据注册请求中获取M个知识数据的注册信息之后,将该M个知识数据的注册信息记录于数据统计信息中。

可以理解,数据统计信息中记录有m个知识数据的注册信息,该m个知识数据的注册信息是由一个或多个生产插件提供的。也即,一个或多个生产插件中包括第一插件,m个知识数据的注册信息中包括M个知识数据的注册信息,m为大于或等于M的整数。

比如,插件A和插件B均属于生产插件,插件A向共享装置发送数据注册请求A,数据注册请求A中包括知识数据1至知识数据10的注册信息,共享装置将知识数据1至知识数据10的注册信息记录在数据统计信息中;插件B向共享装置发送数据注册请求B,数据注册请求B中包括知识数据11至知识数据20的注册信息,共享装置将知识数据11至知识数据20的注册信息记录在数据统计信息中;插件B是第一插件。

数据统计信息比如是数据注册表,如图5为本申请示例性提供的一种数据注册表的示意图,数据注册表中包括m个知识数据的注册信息,比如包括控制流图的注册信息和程序依赖图的注册信息,注册信息中各字段可参见步骤402中描述。

步骤404,共享装置从第一插件中获取M个知识数据。

在一个可能实现方式中,共享装置根据注册请求中该M个知识数据的注册信息,从第一插件中获取/同步M个知识数据。示例性的,共享装置向第一插件发送数据同步请求,该数据同步请求中包括该M个知识数据的标识,相应的,第一插件将该M个知识数据同步给共享装置。

在另一个可能实现方式中,第一插件不仅主动向共享装置发送数据注册请求,还主动向共享装置发送数据注册请求对应的M个知识数据。一个可能示例中,插件模块在加载第一插件时,第一插件将数据注册请求发送给共享装置,插件模块在调用第一插件时,第一插件执行静态代码分析生成M个知识数据,将M个知识数据发送给共享装置。

步骤405,共享装置将M个知识数据存储于知识数据库中。

在一个可能实现方式中,共享装置中包括知识数据库,共享装置在接收到来自第一插件的M个知识数据之后,将第一插件的M个知识数据存储于知识数据库中。如此,知识数据库中存储有来自一个或多个生产插件的m个知识数据。

可以理解,知识数据库与数据统计信息是具有对应关系的。当共享装置需要查找某个知识数据时,可先确定数据统计信息中是否记录有该知识数据的注册信息,若确定数据统计信息中记录有该知识数据的注册信息,则从知识数据库中查找该知识数据。

可选的,共享装置在将知识数据存储于知识数据库中时,还可获取知识数据存储于知识数据库中的地址,然后将该地址记录在数据统计信息中。若共享装置确定数据统计信息中记录有该知识数据的注册信息,则进一步获取该知识数据存储于知识数据库中的地址,进而根据获取到的地址从知识数据库中获取该知识数据。

需要补充的是,代码文件还可能发生变化,比如,用户在原有代码文件的基础上,修改原有代码文件中的内容,其中,修改可包括在原有代码文件的基础上新增某个/某些新的代码文件、修改代码文件中代码、删除某个代码文件或者某个代码文件中的代码等。为了保障知识数据更准确的表达变化后的代码文件,第一插件可以根据变化后的代码文件进行增量的分析(可称为是增量分析),以确定变化之后的知识数据。

可以理解,用户在修改原有代码文件中的内容时,第一插件不仅需要对工作空间中的代码文件的变更信息进行分析,还需要对代码文件的变更信息所关联的其他代码文件进行增量的分析。示例性的,代码文件中包括代码文件1和代码文件2,用户在代码文件1和代码文件2的基础上,新增代码文件3,而代码文件3与代码文件1二者可以相互影响。为此,第一插件不仅需要分析代码文件3,还需要分析与代码文件3相关联的代码文件1,也即,第一插件确定需要增量分析的代码文件中包括代码文件1和代码文件3。

在一种可能的实现方式中,第一插件获取代码文件的变更信息,根据代码文件的变更信息,确定工作空间中受影响的代码文件(即需要进行增量分析的代码文件)。第一插件对该工作空间中受影响的代码文件进行增量分析,以得到M’个知识数据的变更信息,其中M’为小于或等于M的正整数。举例来说,代码文件中包括代码文件1和代码文件2,第一插件对代码文件1和代码文件2进行分析,得到代码索引、静态单赋值、控制流图、程序依赖图,即4个知识数据。进一步的,用户在代码文件1和代码文件2的基础上新增代码文件3,第一插件根据新增的代码文件3,确定需要增量分析的代码文件为代码文件1和代码文件3,进一步的,第一插件分析代码文件1和代码文件3得到代码索引的变更信息和控制流图的变更信息,即2个知识数据的变更信息。

在第一插件获取代码文件的变更信息的实现方式中,第一插件可以定周期的检测当前的代码文件中是否存在变更信息,当第一插件确定当前的代码文件中存在变更信息时,根据代码文件的变更信息,确定需要进行增量分析的代码文件。或者,用户在修改原有代码文件中的内容之后,触发第一插件获取需要进行增量分析的代码文件,也即,第一插件还可响应于用户指令,从当前的代码文件中获取代码文件的变更信息。

第一插件还需要将M’个知识数据的变更信息同步至共享装置中。可选的,第一插件在将知识数据的变更信息同步至共享装置时,还携带变更指示,该变更指示即用于指示知识数据是基于增量分析得到的。可选的,该变更指示还用于指示该知识数据的变更信息更新至原有知识数据中时的更新位置。共享装置根据M’个知识数据的变更信息和M’个变更指示,更新知识数据库中当前存储的M’个知识数据,从而得到更新之后的M’个知识数据。

结合上述例子,共享装置从第一插件中获取代码索引的变更信息和变更指示,共享装置根据代码索引的变更信息和变更指示,更新知识数据库中当前存储的代码索引;共享装置还从第一插件中获取控制流图的变更信息和变更指示,共享装置根据控制流图的变更信息和变更指示,更新知识数据库中当前存储的控制流图。

如下以控制流图为例解释:

第一插件获取的原始代码文件如图6中(a)所示,第一插件分析原始代码文件,得到的控制流图如图6中(b)所示,每个圆圈表示一个基本块(basic block,BB),其中,圆圈1表示输入块,圆圈8表示输出块,圆圈3表示一个if语句。第一插件将获取的控制流图发送至共享装置,共享装置存储该控制流图。

随后,用户在原始代码文件中的第5行和第9行之前分别增加两行代码后,得到的修改后的代码文件如图7中(a)所示,第一插件对该修改后的代码文件进行增量分析,确定控制流图的变更信息是:在圆圈3之前新增圆圈2,以及在圆圈8之前新增圆圈7,其中,圆圈2表示while语句,圆圈2的两个分支分别指向圆圈3和圆圈7,圆圈6进一步指向圆圈2。相应的,第一插件根据控制流图的变更信息,更新得到的控制流图如图7中(b)所示。第一插件还将该控制流图的变更信息发送至共享装置,共享装置根据控制流图的变更信息,更新得到的控制流图同样如图7中(b)所示。

此外,在上述步骤404中,第一插件还可向共享装置发送M个知识数据的变更指示。此处,变更指示可用于指示对应的知识数据是否是基于增量分析得到的。比如,变更指示占用1比特(bit),当变更指示取值为1时,指示其对应的知识数据是基于增量分析得到的;当变更指示取值为0时,指示其对应的知识数据不是基于增量分析得到的。相应的,第一插件在向共享装置同步M个知识数据时,携带的各知识数据的变更指示的取值为0,第一插件在向共享装置同步M’个增量的知识数据时,携带的变更指示的取值为1。

需要补充的是,共享装置还具备基础的代码分析能力。示例性的,共享装置获取代码文件,根据代码文件进行基础分析,得到代码的基础数据(比如抽象语法树和token),然后共享装置将该代码的基础数据存储于知识数据库中。

进一步的,共享装置还可根据代码文件的变更信息,获取工作空间中受影响的代码文件(即需要进行增量分析的代码文件),根据工作空间中受影响的代码文件,确定基础数据的变更信息,根据基础数据的变更信息更新知识数据库中的基础数据。当第一插件需要进行分析时,能够直接从知识数据库中获取最新的基础数据,对该最新的基础数据进一步分析得到知识数据。

如此,多个插件可从共享装置中获取基础数据,而无需各自分析代码文件先得到基础数据,再分析基础数据得到知识数据,有助于减少插件的计算量。

可选的,共享装置还可以将数据统计信息中记录的m个知识数据的描述信息发送至前端模块,相应的,前端模块中显示该m个知识数据的描述信息。

其中,知识数据的描述信息是共享装置根据知识数据的注册信息确定的。示例性的,知识数据的描述信息包括知识数据的标识、描述、类型和数据结构。

前端模块中显示的m个知识数据的描述信息,可用于用户在开发第三插件时,选择第三插件能够从共享装置中直接访问的知识数据。理解为,共享装置将其知识数据库中存储的m个知识数据的描述信息,展示在前端模块中,用户在开发第三插件的过程中,可以得知哪些知识数据能够直接从共享装置的知识数据库中获取,所以设置第三插件从共享装置中请求该知识数据,而无需再次对代码文件进行分析,节省计算资源。

可选的,用户可以在前端模块中查询当前已经注册于共享装置中的知识数据,具体的,前端模块响应于用户指令,向共享装置发送数据查询请求。共享装置根据数据查询请求,将当前已经注册于共享装置中的m个知识数据的描述信息发送至前端模块中,前端模块显示该m个知识数据的描述信息。用户根据前端模块中显示的m个知识数据的描述信息,从m个知识数据中选择第三插件能够直接从共享装置中请求的知识数据,并将该选择出的知识数据的标识设置于第三插件的配置中。

参见图8示例性示出的第二插件向共享装置请求知识数据的流程示意图解释第二部分:

步骤801,第二插件向共享装置发送数据获取请求,相应的,共享装置接收来自第二插件的数据获取请求。

在一个可能实现方式中,第二插件在作用于工作空间时,需要依赖于该工作空间中代码文件的知识数据(可称为目标知识数据),该目标知识数据比如是代码文件的代码索引、静态单赋值、控制流图、程序依赖图等。相应的,用户在前端模块中调用第二插件之后,第二插件可向共享装置请求该目标知识数据。

在一个可能实现方式中,第二插件确定目标知识数据的标识,将目标知识数据的标识包含于数据获取请求中。相应的,共享装置接收来自第二插件的数据获取请求,从数据获取请求中获取到目标知识数据的标识。

步骤802,共享装置根据数据获取请求中目标知识数据的标识,从知识数据库中查找目标知识数据。其中,目标知识数据是第一插件提供的M个知识数据中的一个,也即,目标知识数据是第一插件对代码文件进行分析得到的。

在一个可能实现方式中,共享装置根据目标知识数据的标识,确定数据统计信息中是否记录有该目标知识数据的注册信息。示例性的,共享装置若确定数据统计信息中记录有该目标知识数据的标识,则确定数据统计信息中记录有该目标知识数据的注册信息;共享装置若确定数据统计信息中未记录有该目标知识数据的标识,则确定数据统计信息中未记录有该目标知识数据的注册信息。

共享装置在确定数据统计信息中记录有该知识数据的注册信息之后,从知识数据库中查找该目标知识数据。示例性的,共享装置从数据统计信息中获取目标知识数据的注册信息,根据该注册信息中记录的目标知识数据的地址,从知识数据库中查找该目标知识数据。

步骤803,共享装置向第二插件发送目标知识数据。

相应的,第二插件接收来自共享装置的目标知识数据。第二插件可以根据该目标知识数据,对应用程序开发,而无需再对应用程序的代码文件进行分析。

可选的,第二插件在接收到来自共享装置的目标知识数据之后,还向共享装置发送目标知识数据的订阅请求,该订阅请求即用于第二插件从共享装置中获取目标知识数据的变更信息。在一个可能实现中,第一插件确定代码文件发生变化时,确定目标知识数据的变更信息,将目标知识数据的变更信息发送给共享装置。相应的,共享装置将该目标知识数据的变更信息发送给第二插件。

此外,共享装置根据数据获取请求中目标知识数据的标识,从知识数据库中未查找目标知识数据的情况下,共享装置可向第二插件发送请求失败的响应。相应的,第二插件在接收到请求失败的响应之后,对应用程序的代码文件进行分析,以得到该代码文件的知识数据。可选的,第二插件还可以将分析得到的该知识数据,注册至共享装置中,具体注册方式可参见上述图4相关实施例中描述。

在一个可能实现方式中,共享装置包括数据注册模块、数据上传模块、数据查询模块、数据下载模块和知识数据库。

数据注册模块,用于接收来自第一插件的数据注册请求,数据注册请求中包括M个知识数据的注册信息,知识数据的注册信息中比如包括知识数据的标识、描述、类型和数据结构。数据注册模块还用于将注册请求中M个知识数据的注册信息记录在数据统计信息中。可选的,数据注册模块中存储有该数据统计信息。

数据上传模块,用于从第一插件中获取第一插件对应用程序的代码文件进行分析得到的M个知识数据,将M个知识数据存储于知识数据库中。

数据查询模块,用于根据第二插件的数据获取请求,从知识数据库中查找数据获取请求中标识指示的目标知识数据。

数据下载模块,用于第二插件下载目标知识数据。

基于上述图3示出的架构图以及共享装置中的数据注册模块、数据上传模块、数据查询模块、数据下载模块,如图9和图10分别提供两种可能的知识共享的交互示意图。

预先指出的是,第一插件比如是插件1,第二插件比如是插件2。图9中序号1至12指示各步骤之间的先后顺序;图10中序号1至4同样指示各步骤之间的先后顺序。图9和图10中未详尽描述的内容,均可参见上述图4至图8相关实施例中描述。

在图9示出的交互示意图中:

当用户在前端模块中打开一个工作空间时,插件模块会自动加载插件1和插件2。

插件模块在加载插件1时,插件1向数据注册模块发送控制流图(即知识数据的一个例子)的注册信息。数据注册模块将控制流图的注册信息存储于数据统计信息中。

进一步的,当用户在前端模块中调用插件1时,插件1分析代码文件,得到控制流图(即知识数据的一个例子),插件1将控制流图上传到数据上传模块,相应的,数据上传模块将控制流图存储于知识数据库中。此外,插件1还可将插件1根据控制流图,执行插件1中服务得到的结果1返回给前端模块。

当用户在前端模块中调用插件2时,插件2需要获取的目标知识数据是控制流图,插件2向数据查询模块发送数据获取请求,数据获取请求中包括控制流图的标识(比如图5中的codElf.CFG),相应的,数据查询模块根据控制流图的标识,从知识数据库中获取控制流图,将控制流图发送至插件2。插件2获取到控制流图之后,使用该控制流图,而无需在分析应用程序的代码文件,得到控制流图。此外,插件2还可将插件2根据控制流图,执行插件2中服务得到的结果2返回给前端模块。

在图10示出的交互示意图中:

在用户开发第三插件的过程中,前端模块还可以响应于用户查询知识数据的指令,向数据查询模块发送数据查询请求。数据查询模块根据数据查询请求,将m个知识数据的描述信息发送至前端模块中,前端模块显示该m个知识数据的描述信息。用户可以根据前端模块中显示的m个知识数据的描述信息,选择第三插件可以直接从共享装置中查询的知识数据,将该选择出的知识数据的标识设置于第三插件的配置中。

此外,本申请还提供一种服务的共享方法,该服务的共享方法可适用于IDE架构中,IDE架构中包括共享装置和开发装置,其中,开发装置中包括第一插件和第二插件。共享装置与第一插件、第二插件分别连接。

结合图3示出的IDE架构示意图,比如,第一插件和第二插件分别是插件1和插件2,再比如,第一插件和第二插件分别是插件1和插件K等。

第一插件和第二插件可作用于同一个工作空间,工作空间中包括某个正在开发的应用程序的代码文件,也可以理解,第一插件和第二插件可用于共同开发该应用程序。其中,第一插件可将第一插件能够提供的服务注册至共享装置中。第二插件能够向共享装置请求调用第一插件所提供的服务。

本申请中,可将第一插件理解为服务的生产者,第二插件理解为服务的消费者。也可以理解,第一插件属于生产插件,第二插件属于消费插件。

如下分两部分解释说明本申请提供的服务共享方法,其中,第1部分:第一插件向共享装置提供服务;第2部分:第二插件从共享装置中请求服务。

参见图11示例性示出的第一插件向共享装置提供服务的流程示意图解释第1部分:

步骤1101,第一插件向共享装置发送服务注册请求。相应的,共享装置接收来自第一插件的服务注册请求。其中,服务注册请求中包括第一插件提供的N个服务的注册信息。

在一种可能的实现方式中,第一插件确定第一插件能够提供的N个服务,N为正整数,此处的服务可认为是原子服务,即第一插件能够提供的最小的、不可再拆分的服务,原子服务又可称为是原子能力。示例性的,第一插件确定的第一插件能够提供的N个原子服务中包括代码自动生成服务和代码修复服务。

其中,以N个服务中的一个服务为例,服务的注册信息中包括服务的标识和接口地址,接口地址即用于调用该标识对应的服务。可选的,服务的注册信息中还包括服务的描述、类型、调用参数和返回结果中一项或多项。

比如,第一插件提供的服务是代码自动生成服务,代码自动生成服务的注册信息中可以包括代码自动生成服务的标识“codElf.generate”,代码自动生成服务的接口地址“API1”,代码自动生成服务的描述“生成函数级的代码片段”,代码自动生成服务的类型“code generate”,代码自动生成服务的调用参数“cursor position:int:光标位置;codecontext:JOSN:待生成代码上下文”,以及代码自动生成服务的返回结果“generate:string:生成代码片段;position:int:插入代码位置”。

再比如,第一插件提供的服务是代码修复服务,代码修复服务的注册信息中可包括代码修复服务的标识“codElf.fix”,代码修复服务的接口地址“API2”,代码修复服务的描述“修复代码缺陷”,代码修复服务的类型“code fix”,代码修复服务的调用参数“codeto be fix:string:待修复代码片段;code context:JOSN:代码修复代码上下文”,以及代码修复服务的返回结果“is fixed:bool:是否实现修复;code after fix:string:修复后代码片段”。

步骤1102,共享装置记录第一插件提供的N个服务的注册信息。

在一个可能实现方式中,共享装置在接收到服务注册请求之后,可以先对请求来源方(即第一插件)的身份信息进行验证与鉴权,并在确定第一插件的身份信息通过验证与鉴权之后,从服务注册请求中获取N个服务的注册信息。

进一步的,共享装置中包括服务统计信息,共享装置可将N个服务的注册信息记录于服务统计信息中。可以理解的是,服务统计信息中记录有n个服务的注册信息,该n个服务的注册信息是由一个或多个生产插件提供的。也即,该一个或多个生产插件中包括第一插件,n个服务的注册信息中包括N个服务的注册信息,n为大于或等于N的整数。

比如,插件A和插件B均属于生产插件,插件A向共享装置发送服务注册请求A,该服务注册请求A中包括服务1至服务10的注册信息,共享装置将服务1至服务10的注册信息记录在服务统计信息中;插件B向共享装置发送服务注册请求B,该服务注册请求B中包括服务11至服务20的注册信息,共享装置将服务11至服务20的注册信息记录在服务统计信息中;插件B是第一插件。

步骤1103,共享装置根据第一插件提供的N个服务的接口地址,生成第二插件可调用的N个接口地址。

仍以N个服务中的一个服务为例,第一插件提供的该服务的接口地址,具体是用于共享装置调用该第一插件提供的该服务的接口地址(记为第一接口地址),也即,共享装置在调用第一接口地址时,第一插件可以执行该服务对应的操作。

进一步的,共享装置还需要生成与第一接口地址相对应的、用于第二插件调用的、共享装置中的接口地址(记为第二接口地址)。

步骤1104,共享装置将生成的N个接口地址(即第二接口地址)发送至第二插件。相应的,第二插件获取到该共享装置生成的N个接口地址。

一个示例中,共享装置将服务的标识和服务的第二接口地址发送给第二插件。

又一个示例中,第二插件可以向共享装置发送接口地址查询请求,接口地址查询请求中包括服务的标识,共享装置根据服务的标识,向第二插件发送该服务的第二接口地址(或者服务的标识和服务的第二接口地址)。

可以理解,当第二插件需要使用服务时,可向共享装置请求调用第二接口地址,共享装置根据第二接口地址和第一接口地址的对应关系,调用第一插件的第一接口地址。

需要补充的是,第二插件还可以从共享装置中获取其他生产插件提供的服务的第二接口地址。示例性的,第二插件向共享装置发送接口地址查询请求,相应的,第二插件从共享装置中获取当前注册于共享装置中的n个服务的标识和第二接口地址。

此外,共享装置在生成服务的第二接口地址之后,还可以将服务的第二接口地址记录在服务统计信息内。

结合上述例子,当服务是代码自动生成服务时,代码自动生成服务的第一接口地址是API1,共享装置生成与API1对应的第二接口地址是API1-1,共享装置将API1-1记录在服务统计信息内。当服务是代码修复服务时,代码修复服务的第一接口地址是API2,共享装置生成与API2对应的第二接口地址是API2-1,共享装置将API2-1记录在服务统计信息内。

服务统计信息比如是服务注册表,如图12为本申请示例性提供的服务注册表的示意图,比如,服务注册表中包括代码自动生成服务的注册信息,以及代码自动生成服务的第二接口地址;服务注册表中还包括代码修复服务的注册信息,以及代码修复服务的第二接口地址。图12中,注册信息中各字段可参见步骤1001中描述。

在一个可能实现方式中,共享装置还可将服务统计信息中的n个服务的描述信息发送至第二插件。可选的,第二插件向共享装置发送服务查询请求,共享装置向第二插件发送n个服务的描述信息。第二插件从n个服务的描述信息中获取n个服务的第二接口地址。

可选的,共享装置还可以将服务统计信息中的n个服务的描述信息发送至前端模块,相应的,前端模块中显示该n个服务的描述信息。

其中,服务的描述信息是共享装置根据服务的注册信息确定的。示例性的,服务的描述信息中包括服务的标识、描述、类型、调用参数和返回结果。

该前端模块中显示的n个服务的描述信息,可用于用户在开发第三插件时,选择第三插件能够从共享装置中直接调用的服务。理解为,共享装置可以将注册于共享装置中的n个服务的描述信息展示在前端模块中,用户在开发第三插件的过程中,可以得知哪些服务能够直接从共享装置中调用,所以设置第三插件从共享装置中调用服务,而无需在第三插件中实现该服务。如此,避免在多个插件中实现相同的服务,有助于节省计算资源。

可选的,用户可以在前端模块中查询当前已经注册于共享装置中的n个服务,具体的,前端模块响应于用户指令,向共享装置发送服务查询请求。共享装置根据服务查询请求,将当前已经注册于共享装置中的n个服务的描述信息发送至前端模块中,前端模块显示该n个服务的描述信息。用户根据前端模块显示的n个服务的描述信息,从n个服务中选择第三插件能够直接从共享装置中调用的服务,并将该选择出的服务的标识设置于第三插件的配置中。

参见图13示例性示出的第二插件向共享装置请求服务的流程示意图解释第2部分:

步骤1301,第二插件向共享装置发送服务调用请求,相应的,共享装置接收来自第二插件的服务调用请求。

在一个可能实现方式中,用户在前端模块中调用第二插件之后,第二插件向共享装置发送服务调用请求。其中,服务调用请求中包括第二插件请求调用的服务(记为目标服务)的第二接口地址。可选的,服务调用请求中还包括目标服务的标识。

结合图12中相关例子,目标服务是代码自动生成服务,第二插件向共享装置发送服务调用请求,该服务调用请求中包括代码自动生成服务的第二接口地址“API1-1”,或者,该服务调用请求中包括代码自动生成服务的标识“codElf.generate”和第二接口地址“API1-1”。

步骤1302,共享装置根据服务调用请求中目标服务的第二接口地址,确定目标服务的第一接口地址。

其中,共享装置的服务统计信息中记录有当前注册的n个服务的注册信息,以及n个服务的第二接口地址。共享装置根据目标服务的第二接口地址,从服务统计信息中查找目标服务的注册信息,再从目标服务的注册信息中获取目标服务的第一接口地址。

也可以理解,共享装置的服务统计信息中记录有当前注册的n个服务的第一接口地址和第二接口地址的对应关系。共享装置根据目标服务的第二接口地址,从服务统计信息中确定目标服务的第二接口地址对应的第一接口地址。

步骤1303,共享装置根据目标服务的第一接口地址,调用第一插件提供的目标服务。

步骤1304,第一插件对工作空间执行目标服务对应的操作,得到操作结果。

举例来说,目标服务是代码自动生成服务,第一插件对工作空间执行代码自动生成服务,即执行的操作是自动生成代码,该自动生成的代码即目标服务对应的操作结果。

步骤1305,第一插件向共享装置发送操作结果。相应的,共享装置接收来自第一插件的操作结果。

步骤1306,共享装置向第二插件发送操作结果。

在一个可能实现方式中,共享装置包括服务注册模块、服务发现模块和服务调用模块。

服务注册模块,用于接收来自第一插件的服务注册请求,其中,服务注册请求中包括N个服务的注册信息,每个服务的注册信息中比如包括该服务的标识、接口地址(即第一接口地址)、描述、类型、调用参数和返回结果。服务注册模块,还用于将N个服务的注册信息记录于服务统计信息中;以及,根据服务的第一接口地址,生成服务的第二接口地址,将服务的第二接口地址记录在服务统计信息内。

服务发现模块,用于接收来自第二插件的接口地址查询请求,其中接口地址查询请求中包括第二插件请求调用的目标服务的标识。服务发现模块还用于根据该目标服务的标识,向第二插件发送该目标服务的第二接口地址。

服务调用模块,用于接收第二插件的服务调用请求,从服务调用请求中获取第二插件请求调用的目标服务的第二接口地址,从服务统计信息中确定第二接口地址对应的第一接口地址,根据第一接口地址,调度第一插件提供的该目标服务。

基于上述图3示出的架构图以及共享装置中的服务注册模块、服务发现模块和服务调用模块,如图14和图15分别提供两种可能的服务共享的交互示意图。

预先指出的是,第一插件比如是插件1,第二插件比如是插件2。图14中序号1至9指示各步骤之间的先后顺序;图15中序号1至4同样指示各步骤之间的先后顺序。图14和图15中未详尽描述的内容,均可参见上述图11至图13相关实施例中描述。

在图14示出的交互示意图中:

当用户在前端模块中打开一个工作空间时,插件模块会自动加载插件1和插件2。

插件模块在加载插件1时,插件1向服务注册模块发送代码自动生成服务(即服务的一个例子)的注册信息,相应的,服务注册模块将代码自动生成服务的注册信息存储于服务统计信息中。

插件模块在加载插件2时,插件2向服务发现模块发送接口地址查询请求,其中接口地址查询请求中包括代码自动生成服务的标识(比如图12中的codElf.generate),相应的,服务发现模块根据代码自动生成服务的标识和服务统计信息,确定代码自动生成服务的第二接口地址。服务发现模块向第二插件返回代码自动生成服务的第二接口地址。

当用户在前端模块中调用插件2时,插件2向服务调用模块发送服务调用请求,服务调用请求中包括代码自动生成服务的第二接口地址,相应的,服务调用模块根据服务调用请求中包括的第二接口地址,确定第二接口地址对应的第一接口地址,进而根据第一接口地址调用代码自动生成服务。插件1对代码空间执行代码自动生成服务对应的操作,也即在代码空间中自动生成代码。随后,插件1将操作结果发送至服务调用模块,服务调用模块进而将操作结果发送至插件2,插件2将操作结果返回至前端模块。

在图15示出的交互示意图中:

在用户开发第三插件的过程中,前端模块还可以响应于用户查询服务的指令,向服务发现模块发送服务查询请求。服务发现模块根据服务查询请求,将n个服务的描述信息发送至前端模块中,前端模块显示该n个服务的描述信息。用户可以根据前端模块中显示的n个服务的描述信息,选择第三插件可以从共享装置中直接调用的服务,将该选择出的服务的标识设置于第三插件的配置中。

基于相同的发明构思,本申请还提供一种共享装置1600,该共享装置1600可用于实现上述图4至图10相关方法实施例中方法,即用于实现插件之间的知识数据共享。该共享装置1600适用于IDE架构中,IDE架构包括共享装置1600、第一插件和第二插件。该共享装置1600比如是图3中的共享装置。

共享装置1600中存储有第一插件提供的M个知识数据,M为正整数。

如图16所示,共享装置1600中包括:

数据查询模块1601,用于接收第二插件的数据获取请求;根据数据获取请求,从M个知识数据中查找目标知识数据;

数据下载模块1602,用于向第二插件发送目标知识数据。

在一种可能的实现方式中,共享装置1600还包括:数据注册模块1603;在数据查询模块1601接收第二插件的数据获取请求之前,数据注册模块1603用于接收第一插件的数据注册请求,数据注册请求中包括M个知识数据的标识;记录M个知识数据的标识。

在一种可能的实现方式中,共享装置1600还包括:数据上传模块1604;在数据注册模块1603记录M个知识数据的标识之后,数据上传模块1604用于:从第一插件中获取M个知识数据,存储M个知识数据;其中,M个知识数据是第一插件对工作空间中的代码文件进行分析得到的;或者,M个知识数据是第一插件对基础数据分析得到的,基础数据是共享装置1600对工作空间中的代码文件进行分析得到的;第一插件和第二插件共同作用于工作空间中;基础数据是抽象语法树、token序列中一项或多项;M个知识数据包括代码索引、静态单赋值、控制流图、程序依赖图中一项或多项。

在一种可能的实现方式中,数据上传模块1604存储M个知识数据之后,还用于:从第一插件中获取M'个知识数据的变更信息;根据M'个知识数据的变更信息,更新M个知识数据中的M'个知识数据;其中,M'个知识数据的变更信息是第一插件根据工作空间中的代码文件的变更信息,进行增量分析得到的;或者,M'个知识数据的变更信息是第一插件根据基础数据的变更信息,进行增量分析得到的,基础数据的变更信息是共享装置1600根据工作空间中的代码文件的变更信息,进行增量分析得到的。

在一种可能的实现方式中,数据下载模块1602向第二插件发送目标知识数据之后,还用于:接收第二插件对目标知识数据的订阅请求,订阅请求用于第二插件获取目标知识数据的变更信息;相应的,在数据上传模块1604从第一插件中接收目标知识数据的变更信息之后,数据下载模块1602还用于向第二插件发送目标知识数据的变更信息。

在一种可能的实现方式中,共享装置1600中存储有生产插件提供的m个知识数据,生产插件包括第一插件,m为正整数;在用户开发第三插件的过程中,数据查询模块1601还用于:向前端模块发送m个知识数据的描述信息,以使得用户根据前端模块显示的、m个知识数据的描述信息,从m个知识数据中选择第三插件能够从共享装置1600中获取的知识数据。

需要说明的是,在其他实施例中,数据查询模块1601可以用于执行图4至图10相关方法实施例中的任意步骤,数据下载模块1602可以用于执行图4至图10相关方法实施例中的任意步骤,数据注册模块1603可以用于执行图4至图10相关方法实施例中的任意步骤,数据上传模块1604可以用于执行图4至图10相关方法实施例中的任意步骤。可以理解,数据查询模块1601、数据下载模块1602、数据注册模块1603和数据上传模块1604负责实现的步骤可根据需要指定,通过数据查询模块1601、数据下载模块1602、数据注册模块1603和数据上传模块1604分别实现图4至图10相关方法实施例中不同的步骤来实现图16中共享装置1600的全部功能。

基于相同的发明构思,本申请还提供一种共享装置1700,该共享装置1700可用于实现上述图11至图15相关方法实施例中方法,即用于实现插件之间的服务共享。该共享装置1700适用于IDE架构中,IDE架构包括共享装置1700、第一插件和第二插件。该共享装置1700比如是图3中的共享装置。

如图17所示,共享装置1700中包括:

服务注册模块1701,用于注册第一插件提供的N个服务,N为正整数;

服务调用模块1702,用于接收第二插件的服务调用请求;根据服务调用请求,调用N个服务中的目标服务;

服务调用模块1702,还用于接收第一插件提供目标服务得到的操作结果;向第二插件发送操作结果。

在一种可能的实现方式中,第一插件和第二插件作用于同一个工作空间,操作结果是第一插件对工作空间提供目标服务到的。

在一种可能的实现方式中,服务调用模块1702接收第二插件的服务调用请求之前,服务注册模块1701用于:接收第一插件的服务注册请求,服务注册请求中包括N个服务的第一接口地址,服务的第一接口地址用于共享装置1700调用服务;根据N个服务的第一接口地址,生成N个服务的第二接口地址,服务的第二接口地址用于第二插件调用服务;记录N个服务的第一接口地址和第二接口地址。

在一种可能的实现方式中,还包括:服务发现模块1703;在服务注册模块1701记录N个服务的第一接口地址和第二接口地址之后,服务发现模块1703用于:接收第二插件的服务查询请求,服务查询请求中包括目标服务的标识,N个服务中包括目标服务;向第二插件发送目标服务的第二接口地址。

在一种可能的实现方式中,服务调用模块1702在根据服务调用请求,调用N个服务中目标服务时,具体用于:根据服务调用请求中的目标服务的第二接口地址,确定目标服务的第一接口地址;根据目标服务的第一接口地址,调用目标服务。

在一种可能的实现方式中,服务注册模块1701中注册有生产插件提供的n个服务,生产插件包括第一插件,n为正整数;共享装置1700还包括:服务发现模块1703;在用户开发第三插件的过程中,服务发现模块1703用于:向前端模块发送n个服务的描述信息,以使得用户根据前端模块显示的、n个服务的描述信息,从n个服务中选择第三插件能够从共享装置1700中调用的服务。

需要说明的是,在其他实施例中,服务注册模块1701可以用于执行图11至图15相关方法实施例中的任意步骤,服务调用模块1702可以用于执行图11至图15相关方法实施例中的任意步骤,服务发现模块1703可以用于执行图11至图15相关方法实施例中的任意步骤。可以理解,服务注册模块1701、服务调用模块1702和服务发现模块1703负责实现的步骤可根据需要指定,服务注册模块1701、服务调用模块1702和服务发现模块1703分别实现图11至图15相关方法实施例中不同的步骤来实现图17中共享装置1700的全部功能。

在图16相关实施例中,数据查询模块1601、数据下载模块1602、数据注册模块1603和数据上传模块1604均可以通过软件实现,或者可以通过硬件实现。在图17相关实施例中,服务注册模块1701、服务调用模块1702和服务发现模块1703均可以通过软件实现,或者可以通过硬件实现。

接下来以数据查询模块1601为例,介绍数据查询模块1601的实现方式。类似的,图16相关实施例中的数据下载模块1602、数据注册模块1603和数据上传模块1604的实现方式可以参考数据查询模块1601的实现方式。类似的,图17相关实施例中的服务注册模块1701、服务调用模块1702和服务发现模块1703的实现方式也可以参考数据查询模块1601的实现方式。

模块作为软件功能单元的一种举例,数据查询模块1601可以包括运行在计算实例上的代码。其中,计算实例可以包括物理主机(计算设备)、虚拟机、容器中的至少一种。进一步地,上述计算实例可以是一台或者多台。例如,数据查询模块1601可以包括运行在多个主机/虚拟机/容器上的代码。需要说明的是,用于运行该代码的多个主机/虚拟机/容器可以分布在相同的区域(region)中,也可以分布在不同的region中。进一步地,用于运行该代码的多个主机/虚拟机/容器可以分布在相同的可用区(availability zone,AZ)中,也可以分布在不同的AZ中,每个AZ包括一个数据中心或多个地理位置相近的数据中心。其中,通常一个region可以包括多个AZ。

同样,用于运行该代码的多个主机/虚拟机/容器可以分布在同一个虚拟私有云(virtual private cloud,VPC)中,也可以分布在多个VPC中。其中,通常一个VPC设置在一个region内,同一region内两个VPC之间,以及不同region的VPC之间跨区通信需在每个VPC内设置通信网关,经通信网关实现VPC之间的互连。

模块作为硬件功能单元的一种举例,数据查询模块1601可以包括至少一个计算设备,如服务器等。或者,数据查询模块1601也可以是利用专用集成电路(application-specific integrated circuit,ASIC)实现、或可编程逻辑器件(programmable logicdevice,PLD)实现的设备等。其中,上述PLD可以是复杂程序逻辑器件(complexprogrammable logical device,CPLD)、现场可编程门阵列(field-programmable gatearray,FPGA)、通用阵列逻辑(generic array logic,GAL)或其任意组合实现。

数据查询模块1601包括的多个计算设备可以分布在相同的region中,也可以分布在不同的region中。数据查询模块1601包括的多个计算设备可以分布在相同的AZ中,也可以分布在不同的AZ中。同样,数据查询模块1601包括的多个计算设备可以分布在同一个VPC中,也可以分布在多个VPC中。其中,多个计算设备可以是服务器、ASIC、PLD、CPLD、FPGA和GAL等计算设备的任意组合。

本申请还提供一种共享系统,如图18所示,共享系统中包括:图16中的共享装置1600和图17中的共享装置1700。也可以理解,共享装置1600可用于实现上述图4至图10相关方法实施例中方法;共享装置1700可用于实现上述图11至图15相关方法实施例中方法。

共享装置1600和共享装置1700均可以通过软件实现,或者可以通过硬件实现。示例性的,接下来介绍共享装置1600的实现方式。类似的,共享装置1700的实现方式可以参考共享装置1600的实现方式。

模块作为软件功能单元的一种举例,共享装置1600可以包括运行在计算实例上的代码。其中,计算实例可以是物理主机(计算设备)、虚拟机、容器等计算设备中的至少一种。进一步地,上述计算设备可以是一台或者多台。例如,共享装置1600可以包括运行在多个主机/虚拟机/容器上的代码。需要说明的是,用于运行该应用程序的多个主机/虚拟机/容器可以分布在相同的region中,也可以分布在不同的region中。用于运行该代码的多个主机/虚拟机/容器可以分布在相同的AZ中,也可以分布在不同的AZ中,每个AZ包括一个数据中心或多个地理位置相近的数据中心。其中,通常一个region可以包括多个AZ。

同样,用于运行该代码的多个主机/虚拟机/容器可以分布在同一个VPC中,也可以分布在多个VPC中。其中,通常一个VPC设置在一个region内。同一region内两个VPC之间,以及不同region的VPC之间跨区通信需在每个VPC内设置通信网关,经通信网关实现VPC之间的互连。

模块作为硬件功能单元的一种举例,共享装置1600可以包括至少一个计算设备,如服务器等。或者,共享装置1600也可以是利用ASIC实现、或PLD实现的设备等。其中,上述PLD可以是CPLD、FPGA、GAL或其任意组合实现。

共享装置1600包括的多个计算设备可以分布在相同的region中,也可以分布在不同的region中。共享装置1600包括的多个计算设备可以分布在相同的AZ中,也可以分布在不同的AZ中。同样,共享装置1600包括的多个计算设备可以分布在同一个VPC中,也可以分布在多个VPC中。其中,多个计算设备可以是服务器、ASIC、PLD、CPLD、FPGA和GAL等计算设备的任意组合。

本申请还提供一种计算设备100。如图19所示,计算设备100包括:处理器101、总线102、存储器103和通信接口104。处理器101、存储器103和通信接口104之间通过总线102通信。计算设备100可以是服务器或终端设备。应理解,本申请不限定计算设备100中的处理器、存储器的个数。

总线102可以是外设部件互连标准(peripheral component interconnect,PCI)总线或扩展工业标准结构(extended industry standard architecture,EISA)总线等。总线可以分为地址总线、数据总线、控制总线等。为便于表示,图19中仅用一条线表示,但并不表示仅有一根总线或一种类型的总线。总线104可包括在计算设备100各个部件(例如,存储器103、处理器101、通信接口104)之间传送信息的通路。

处理器101可以包括中央处理器(central processing unit,CPU)、图形处理器(graphics processing unit,GPU)、微处理器(micro processor,MP)或者数字信号处理器(digital signal processor,DSP)等处理器中的任意一种或多种。

存储器103可以包括易失性存储器(volatile memory),例如随机存取存储器(random access memory,RAM)。处理器101还可以包括非易失性存储器(non-volatilememory),例如只读存储器(read-only memory,ROM),快闪存储器,机械硬盘(hard diskdrive,HDD)或固态硬盘(solid state drive,SSD)。

存储器103中存储有可执行的程序代码,处理器101执行该可执行的程序代码以分别实现前述数据查询模块1601、数据下载模块1602、数据注册模块1603和数据上传模块1604的功能,从而实现上述图4至图10相关方法实施例中方法。也即,存储器103上存有用于执行图4至图10相关方法实施例中方法的指令。

或者,存储器103中存储有可执行的程序代码,处理器101执行该可执行的程序代码以分别实现前述服务注册模块1701、服务调用模块1702和服务发现模块1703的功能,从而实现上述图11至图15相关方法实施例中方法。也即,存储器103上存有用于执行图11至图15相关方法实施例中方法的指令。

或者,存储器103中存储有可执行的程序代码,处理器101执行该可执行的程序代码以分别实现前述共享装置1600和共享装置1700的功能,从而实现上述图4至图15相关方法实施例中方法。也即,存储器103上存有用于执行图4至图15相关方法实施例中方法的指令。

通信接口104使用例如但不限于网络接口卡、收发器一类的收发模块,来实现计算设备100与其他设备或通信网络之间的通信。

本申请实施例还提供了一种计算设备集群。该计算设备集群包括至少一台计算设备。该计算设备可以是服务器,例如是中心服务器、边缘服务器,或者是本地数据中心中的本地服务器。在一些实施例中,计算设备也可以是台式机、笔记本电脑或者智能手机等终端设备。

如图20所示,计算设备集群包括至少一个计算设备100。

在一些可能的实现方式中,计算设备集群中的一个或多个计算设备100中的存储器103中可以存有相同的用于执行图4至图10相关方法实施例中的指令。在一些可能的实现方式中,该计算设备集群中的一个或多个计算设备100的存储器103中也可以分别存有用于执行图4至图10相关方法实施例中的部分指令。换言之,一个或多个计算设备100的组合可以共同执行用于图4至图10相关方法实施例中的指令。

或者,计算设备集群中的一个或多个计算设备100中的存储器103中可以存有相同的用于执行图11至图15相关方法实施例中方法的指令。在一些可能的实现方式中,该计算设备集群中的一个或多个计算设备100的存储器103中也可以分别存有用于执行图11至图15相关方法实施例中的部分指令。换言之,一个或多个计算设备100的组合可以共同执行用于图11至图15相关方法实施例中的指令。

或者,计算设备集群中的一个或多个计算设备100中的存储器103中可以存有相同的用于执行图4至图15相关方法实施例中方法的指令。在一些可能的实现方式中,该计算设备集群中的一个或多个计算设备100的存储器103中也可以分别存有用于执行图4至图15相关方法实施例中的部分指令。换言之,一个或多个计算设备100的组合可以共同执行用于图4至图15相关方法实施例中的指令。

如下以计算设备集群用于执行图4至图10相关方法实施例为例说明:

计算设备集群中的不同的计算设备100中的存储器103可以存储不同的指令,分别用于执行共享装置1600的部分功能。也即,不同的计算设备100中的存储器103存储的指令可以实现数据查询模块1601、数据下载模块1602、数据注册模块1603和数据上传模块1604中的一个或多个模块的功能。

在一些可能的实现方式中,计算设备集群中的一个或多个计算设备可以通过网络连接。其中,网络可以是广域网或局域网等等。

图20示出了一种可能的实现方式。如图20所示,两个计算设备100A和100B之间通过网络进行连接。具体地,通过各个计算设备中的通信接口与网络进行连接。在这一类可能的实现方式中,计算设备100A中的存储器103中存有执行数据查询模块1601和数据下载模块1602的功能的指令。同时,计算设备100B中的存储器103中存有执行数据注册模块1603和数据上传模块1604的功能的指令。

应理解,图20中示出的计算设备100A的功能也可以由多个计算设备100完成。同样,计算设备100B的功能也可以由多个计算设备100完成。

本申请实施例还提供了一种包含指令的计算机程序产品。计算机程序产品可以是包含指令的,能够运行在计算设备上或被储存在任何可用介质中的软件或程序产品。当计算机程序产品在至少一个计算设备上运行时,使得至少一个计算设备执行图4至图10相关方法实施例中方法,或者执行图11至图15相关方法实施例中方法的指令,或者执行图4至图15相关方法实施例中方法的指令。

本申请实施例还提供了一种计算机可读存储介质。计算机可读存储介质可以是计算设备能够存储的任何可用介质或者是包含一个或多个可用介质的数据中心等数据存储设备。可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如固态硬盘)等。该计算机可读存储介质包括指令,指令指示计算设备执行图4至图10相关方法实施例中方法,或者执行图11至图15相关方法实施例中方法的指令,或者执行图4至图15相关方法实施例中方法的指令。

最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的保护范围。

相关技术
  • 基于闪存微控制器的固件升级方法和系统及闪存微控制器
  • 一种信号控制器的输入方法及信号控制器系统
  • 控制器软件架构、控制器软件升级方法、控制器和装置
  • 升级从控制器的方法、主控制器及从控制器
技术分类

06120116552254