CN115328679A - 异构函数库的自动化集成方法、计算设备及其*** - Google Patents
异构函数库的自动化集成方法、计算设备及其*** Download PDFInfo
- Publication number
- CN115328679A CN115328679A CN202211009638.2A CN202211009638A CN115328679A CN 115328679 A CN115328679 A CN 115328679A CN 202211009638 A CN202211009638 A CN 202211009638A CN 115328679 A CN115328679 A CN 115328679A
- Authority
- CN
- China
- Prior art keywords
- library
- dynamic
- function
- parameters
- dynamic library
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/547—Remote procedure calls [RPC]; Web services
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/36—Software reuse
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
提供了异构函数库的自动化集成方法、计算设备及其***。所提供的方法包括:获取库函数的源代码;根据库函数的源代码生成动态库接口适配代码,其中动态库接口适配代码包括动态库接口、库函数接口转换代码以及调用所述库函数的代码;其中所述库函数接口转换代码用于将动态库接口传递的动态库参数转换为调用所述库函数所需的库函数参数;编译与构建所述源代码以及所述动态库接口适配代码以生成封装了所述库函数的动态库;加载所述动态库,利用所述库函数响应对所述库函数的调用请求。
Description
技术领域
本申请属于软件领域,具体地涉及异构函数库的自动化集成方法、其计算设备与***。
背景技术
在诸如水声处理与应用中,用到多种水声处理算法。这些处理算法被实现为多种函数库。随着算法或其实现的演进,函数库被相应地更新。一些应用中还尝试或比较各种算法的优劣,因而需要较频繁替换新的函数库。
不同的函数库可能具有不同的函数签名(函数声明),例如,不同的函数名称、输入参数和/或输出参数,函数所需的参数的数量和/或类型也可能不同(称为异构函数库)。并且,由于分工或软件工程的原因,函数库的开发人员与函数库的使用人员通常不同,并且各自使用不同的运行环境。因而在函数库更新后,在应用***中使用函数库时,需要将新函数库导入应用***,根据新函数库的函数签名重新调整相应代码,编译修改后的代码,以在应用***中调用或使用函数库。在函数库频繁更新时,这些操作造成对时间、资源的开源,也容易引入错误。
例如,水声的频谱分析算法研发过程中,通常先使用例如MATLAB、R等工具用脚本语言进行算法设计,在经过准确性验证之后,将脚本语言实现的算法翻译成C语言实现的函数库。由脚本语言实现的算法到C语言函数库的转换过程可由软件工具自动完成,这属于现有技术的一部分。C语言函数库被传递给应用***。应用***开发者根据收到的函数库的函数签名编写适配代码。但是在例如进行效率优化的工作时,需要不停的对应用***中所使用多种库进行切换,来对比哪个函数库所实现的算法的效率更高、消耗更低。这个过程让应用***开发者消耗了大量的时间,导致开发效率的降低。
图1展示了现有技术中使用函数库的应用***的***结构示意图。
图1中,应用***包括例如应用程序与函数库,分别由不同的人员开发。函数库包括多个库函数(记为库函数1、库函数2与库函数3)。库函数包括函数声明(函数签名)与函数体。多个库函数可以是同一算法的不同实现、不同版本、或者实现了不同算法。从而各库函数的函数声明可以相同或不同。
函数库开发人员向应用程序开发人员交付函数库的源代码,例如由C语言实现。应用程序通过调用库函数来使用库函数所提供的功能。由于各库函数的函数声明可能不同,应用开发人员需要根据所使用的具体库函数的函数声明编写适配代码,以向所调用的库函数提供其所需的参数,并且提供的参数的数量与类型需要同库函数的函数声明一致。进而编译并构建应用程序,并运行应用程序。
上述过程中,每次函数库更新,应用程序都可能需要做相应的源代码级别的调整,还需要编译、构建以及在运行环境中部署更新的应用程序。这引入了额外的开源,又可能引入错误。
发明内容
希望解决在应用***中使用异构函数库时,需要重复开发适配代码、编译、构建应用软件所引入的耗时且容易引入错误的问题。
根据本申请的实施例,通过两阶段的技术改进解决上面提到的一个或多个技术问题。在第一阶段中,将异构的库函数自动封装为独立的、可被运行环境动态加载并在运行期间随时替换的函数库。在第二个阶段中,在运行环境中支持用户指定库函数,并为用户应用提供统一的调用库函数的接口,从而应用可在运行期间选择/改变要使用的库函数,并在不修改应用程序源代码的情况下,以统一(或相同)的方式调用多种库函数,而由运行环境根据用户选择的库函数,“热加载”对应的函数库并完成对库函数的调用。该过程中,应用程序、运行环境的源代码都无需修改,也无需被重新构建和/或重启。
根据本申请的第一方面,提供了根据本申请第一方面的第一异构库函数的自动化集成方法,包括:获取库函数的源代码;根据库函数的源代码生成动态库接口适配代码,其中动态库接口适配代码包括动态库接口、库函数接口转换代码以及调用所述库函数的代码;其中所述库函数接口转换代码用于将动态库接口传递的动态库参数转换为调用所述库函数所需的库函数参数;编译与构建所述源代码以及所述动态库接口适配代码以生成封装了所述库函数的动态库;加载所述动态库,利用所述库函数响应对所述库函数的调用请求。
根据本申请第一方面的第一异构库函数的自动化集成方法,提供了根据本申请第一方面的第二异构库函数的自动化集成方法,还包括:响应于接收到来自所述客户端的对所述库函数的调用请求,从所述调用请求中提取一个或多个数据域,每个数据域对应于调用所述库函数所需的参数之一,每个数据域记录了其对应的参数的类型与值;将从所述一个或多个数据域提取的参数传递给所述动态库,以通过所述动态库调用所述动态库封装的所述库函数。
根据本申请第一方面的第二异构库函数的自动化集成方法,提供了根据本申请第一方面的第三异构库函数的自动化集成方法,还包括:从所述动态库获取调用所述库函数的执行结果,并传递给所述客户端作为对所述调用请求的响应。
根据本申请第一方面的第二或第三异构库函数的自动化集成方法,提供了根据本申请第一方面的第四异构库函数的自动化集成方法,其中对从所述一个或多个数据域提取的每个参数,擦除所提取的参数类型,将擦除了类型的一个或多个参数组合为变长参数,将所述变长参数传递给所述动态库。
根据本申请第一方面的第四异构库函数的自动化集成方法,提供了根据本申请第一方面的第五异构库函数的自动化集成方法,其中所述数据域还包括目标字段,目标字段同库函数对应;根据目标字段的值确定数据域所承载的参数所适用的库函数。
根据本申请第一方面的第五异构库函数的自动化集成方法,提供了根据本申请第一方面的第六异构库函数的自动化集成方法,其中对于来自客户端的对不同库函数的不同调用请求,无论从不同调用调用请求提取的调用库函数所述的参数的数量是否相同以及从不同调用请求所提取的各参数的类型是否对应相同,所生成的传递给相同或不同动态库的参数具有相同的形式。
根据本申请第一方面的第六异构库函数的自动化集成方法,提供了根据本申请第一方面的第七异构库函数的自动化集成方法,其中所生成的传递给相同或不同动态库的参数是变长参数,且变长参数所携带的各元素的类型都被擦除,或者各元素都具有相同的指定类型;或者所生成的传递给相同或不同动态库的参数是指定数量的参数,并且所述指定数量的参数的类型都被擦除,或者所述指定数量的参数各自具有相同的指定类型。
根据本申请第一方面的第七异构库函数的自动化集成方法,提供了根据本申请第一方面的第八异构库函数的自动化集成方法,其中所述库函数接口转换代码用于提取传递给动态库的参数作为动态库参数,根据所述库函数的函数签名获取调用所述库函数所需的各参数的类型,对动态库参数进行类型转换,以及各动态库参数依次转换为从所述库函数的函数签名获取的参数类型,其中各动态库参数的类型转换结果同调用所述库函数所需的各参数的类型按顺序一一对应;调用所述库函数的代码用于将转换了类型的各动态库参数提供给所述库函数。
根据本申请第一方面的第八异构库函数的自动化集成方法,提供了根据本申请第一方面的第九异构库函数的自动化集成方法,其中对于不同的动态库,传递给不同动态库的参数具有相同的形式;以及当所述不同的动态库各自封装的库函数所需的接口参数不同时,所述库函数接口转换代码从动态库参数生成的调用库函数所需的参数不同。
根据本申请第一方面的第九异构库函数的自动化集成方法,提供了根据本申请第一方面的第十异构库函数的自动化集成方法,其中对所述库函数的调用请求中,用具有指定值的字节分隔各数据域;当数据域中记录的参数的类型与值中要出现具有所述指定值的字节时,用连续的两个具有所述指定值的字节代表单一的具有所述指定值的字节。
根据本申请第一方面的第一异构库函数的自动化集成方法,提供了根据本申请第一方面的第十一异构库函数的自动化集成方法,其中将生成的所述动态库添加到文件***的指定位置,使得所述动态库可被加载并使用;将文件***中的一个或多个动态库加载到内存中成为内存动态库;选择内存动态库之一作为响应对所述库函数的调用请求的当前动态库。
根据本申请第一方面的第十一异构库函数的自动化集成方法,提供了根据本申请第一方面的第十二异构库函数的自动化集成方法,还包括:卸载一个或多个内存动态库,其中根据最近最少使用策略或先进先出策略选择被卸载的内存动态库。
根据本申请第一方面的第一异构库函数的自动化集成方法,提供了根据本申请第一方面的第十三异构库函数的自动化集成方法,其中动态库创建单元执行所述获取库函数的源代码的步骤,所述根据库函数的源代码生成动态库接口适配代码的步骤;以及所述编译与构建所述源代码以及所述动态库接口适配代码以生成封装了所述库函数的动态库的步骤;运行环境执行加载所述动态库的步骤。
根据本申请的第二方面,提供了根据本申请第二方面的第一异构库函数的自动化集成***,包括动态库创建单元与运行环境;所述动态库创建单元获取库函数的源代码;根据库函数的源代码生成动态库接口适配代码,其中动态库接口适配代码包括动态库接口、库函数接口转换代码以及调用所述库函数的代码;其中所述库函数接口转换代码用于将动态库接口传递的动态库参数转换为调用所述库函数所需的库函数参数;编译与构建所述源代码以及所述动态库接口适配代码以生成封装了所述库函数的动态库;所述运行环境加载所述动态库,利用所述库函数响应对所述库函数的调用请求。
根据本申请第二方面的第一异构库函数的自动化集成***,提供了根据本申请第二方面的第二异构库函数的自动化集成***,其中所述运行环境响应于接收到来自所述客户端的对所述库函数的调用请求,从所述调用请求中提取一个或多个数据域,每个数据域对应于调用所述库函数所需的参数之一,每个数据域记录了其对应的参数的类型与值;将从所述一个或多个数据域提取的参数传递给所述动态库,以通过所述动态库调用所述动态库封装的所述库函数。
根据本申请第二方面的第二异构库函数的自动化集成***,提供了根据本申请第二方面的第三异构库函数的自动化集成***,还包括客户端;所述客户端根据调用所述库函数所需的一个或多个参数生成包括一个或多个数据域的对所述库函数的调用请求;向所述运行环境发送对所述库函数的调用请求;以及接收所述运行环境提供的所述库函数的执行结果。
根据本申请第三方面,提供了根据本申请第三方面的第一计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现根据本申请第一方面的第一至第十三异构库函数的自动化集成方法之一。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。
图1展示了现有技术中使用函数库的应用***的***结构示意图。
图2展示了根据本申请实施例的异构函数库自动集成***的***结构框图。
图3展示了根据本申请实施例创建动态库的过程的流程图。
图4展示了根据本申请实施例的根据生成的构建配置文件生成动态库的流程图。
图5A展示了根据本申请实施例客户端调用所集成的库函数的流程图。
图5B展示了承载库函数的调用请求的网络数据包的示意图。
图6展示了根据本申请的实施例的客户端调用库函数的流程图。
具体实施方式
下面结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
图2展示了根据本申请实施例的异构函数库自动集成***的***结构框图。
根据本申请实施例的异构函数库自动继承***包括客户端(用户应用程序)、运行环境与函数库。
用户应用程序与运行环境以“客户端-服务器”模式交互。用户应用程序作为客户端,以统一的形式(接口形式或数据包格式)向服务器请求调用库函数,并接收服务器提供给库函数调用结果。即使所调用的库函数的函数声明改变(利用,需要不同类型、数量的参数,和/或使用不同的函数名),客户端可以不感知或不适配这种改变,而用单一的方向通过服务器调用指定的库函数。
运行环境作为服务器,接收来自应用程序的对库函数的调用请求,从调用请求中解析出一个或多个参数,并加载或调用容纳了所调用库函数的动态库。不同版本的库函数各自被封装为不同的动态库。作为一种实施方式,不同的动态库向运行环境导出(呈现)统一的接口,从而运行环境以统一的方式调用动态库所提供的接口,例如,动态库所提供的接口所需的参数数量与类型同客户端提供的调用请求中提供的参数的数量与类型对应一致。运行环境将客户端的调用请求中所提供的参数都传递给动态库所提供的接口。
动态库各自包括接口(动态库接口)、库函数接口转换代码、调用库函数的调用以及库函数。作为举例,图2中,运行环境容纳了多个动态库(动态库1、动态库2与动态库3)。运行环境是例如计算机或服务器,动态库被存储在数据库或者运行环境的文件***中。各动态库有例如统一的动态库接口,但由于各动态库所封装的库函数不同,因而各动态库有各自的库函数接口转换代码与调用库函数的代码。作为举例,动态库1封装了库函数1,并具有库函数接口转换代码1与调用库函数1的代码。类似地,动态库2封装了库函数2,并具有库函数接口转换代码2与调用库函数2的代码;动态库3封装了库函数3,并具有库函数接口转换代码3与调用库函数3的代码。
库函数有函数声明(也称为函数签名)与函数体。库函数1包括函数声明1与函数体1,库函数2包括函数声明2与函数体2,库函数3包括函数声明3与函数体3。由于函数声明1、函数声明2与函数声明3彼此可能不同,因而各动态库中,其库函数接口转换代码与调用库函数的代码也相应的不同。
动态库中,调用库函数的代码根据所封装的库函数的库函数声明,向库函数传递其所需的参数,并调用该库函数。而库函数接口转换代码,则用于将从动态库接口接收的统一形式的一个或多个参数的每个,转换为所封装的库函数所需的形式。可选地,库函数接口转换代码,还区分所封装的库函数的输入参数与输出参数,将输入参数用于调用库函数,以及用输出接口接收库函数的处理结果。
根据本申请实施例,还包括动态库创建单元,用于根据新交付的库函数构成对应的动态库,并导入运行环境。动态库的创建与客户端对动态库的调用发生在不同时间,因而图2中未展示动态库创建单元。动态库创建单元是计算机或服务器。动态库创建单元与运行环境是相同或不同的计算机或服务器。
动态库创建单元由例如软件实现。当交付了新的库函数,新库函数的源代码被交付。动态库创建单元根据新库函数的函数声明,获取调用该库函数所需的一个或多个参数(及其数据类型),并根据各动态库的统一动态库接口提供的各参数与该新库函数的函数声明中描述的各参数的差异,为函数声明中的每个参数生成转换代码,将统一动态库接口的参数类型转换为函数声明中指定的参数类型。在参数有多个时,将统一动态库接口传输的参数,按指定顺序(例如,从前到后或从后到前的顺序)一一映射到函数声明中的各参数。从而,需要统一动态库接口所提供的参数数量,大等于函数声明中的参数数量。动态库创建单元所生成的代码,还包括用转换了类型的参数调用库函数的代码,以及可选地,接收库函数执行结果的代码。
例如,动态库接口传输的参数包括T1、T2、T3……Tn,这些参数各自可不具有类型、被类型参数或默认的数据类型;而库函数的函数声明中描述的参数包括int a,float b,char c。动态库创建单元根据从函数声明中获取该库函数需要3个参数,数据类型分别为int(整型)、float(浮点型)与char(字符型),相应地,动态库创建单元从动态库接口传输的函数中,选择其前3个参数(T1、T2与T3),为这3个参数分别生成类型转换代码,以得到适合于提供给库函数的3个参数,并生成代码来调用该库函数。
动态库创建单元还编译所生成的代码与对应的库函数,以构建出同该库函数对应的动态库。根据本申请的实施例,对于异构的库函数,所构建的动态库的动态库接口是相同的。例如,基于设计需求或者经验,所使用的多种库函数中,其函数声明中所描述的参数数量例如会小于某个值(例如,100),那么在统一的动态库接口中提供100个参数,从而对于各库函数,该参数数量都满足库函数的需要。
根据本申请的又一实施例,为了使运行环境调用动态库接口时,对于封装不同库函数的多种动态库不需要修改运行环境中应的调用代码,在动态库同运行环境的“耦合”(接口)处传递的输入和输出参数遵循统一的方式,所使用的动态库接口采用变长形式参数、且可进行类型擦除的参数类型。类型擦除指去除参数的类型信息,使得不同参数的类型看起来相同或无需区分。变长的形式参数可传递任意数量的参数,从而适应不同库函数所需的不同数量的参数。利用类型擦除和变长参支持不同库函数中不同的类型/数量的形参的任意组合。
从而,根据本申请的实施例,在所生成的动态库之外的运行环境中无需提供其他的用于兼容或类型转换的代码,而被添加的代码仅存在于动态库中,使得在更新库函数时仅需编译并构建动态库,而无需重编译/构建整个运行环境。
动态库创建单元可选地,还将所构建的动态库加入运行环境。例如,将动态库添加到文件***的指定目录,或者数据库的指定位置,使得运行环境扫描指定目录或数据库来加载新生成的动态库。
动态库的生成属于前述第一阶段技术。
运行环境包括动态库管理单元与库函数代理单元。动态库管理单元加载或释放动态库。例如,周期性地扫描文件***的指令目录或数据库,以识别新动态库的出现并加载到运行环境。库函数代理单元在网络上监听来自客户端的库函数调用请求,从库函数调用请求中解析出例如一个或多个参数,以及可选地要调用的库函数,调用对应的动态库并将调用请求中的参数传输地被调用的动态库。可选地,库函数调用代理还将动态库提供的库函数调用结果返回给客户端。依然可选地,库函数调用代理还接收客户端对库函数的选择,以获知要调用的同所选库函数对应的动态库。
处理来自客户端的库函数调用请求属于第二阶段技术。
继续参看图2,当客户端要调用指定的库函数,将对库函数的调用请求打包在网络数据包中并发送给服务器(运行环境)。调用请求中携带了指定数量(例如,100个)的参数。客户端知晓要调用的库函数的函数声明。从而,即使要调用的库函数仅需要3个参数,但客户端依然将指定数量(例如100个)的参数打包在库函数调用请求中,而其中仅前3个参数被设置了有意义的值(要被传递给库函数),而其他参数可被填充随机数或指定值。
库函数调用代理单元接收来自客户端的调用请求,用调用请求中的例如所有参数调用同要调用库函数对应的动态库。各动态库的接口是统一的,也包括例如指定数量(例如,100个)的参数。由于客户端提供的库函数调用请求与动态库的动态库接口各自的参数在形式上相同,从而即使客户端调用不同的库函数,库函数代理也能依据调用请求提供的参数来调用动态库接口。可选地或进一步地,客户端提供的调用请求的各参数的类型同动态库接口的各参数类型对应相同,以避免调用动态库时发生参数类型不一致错误。依然可选地,动态库接口的各参数是无类型、类型被擦除或默认类型,以便动态库接口能接收调用请求中提供的多种类型的参数。
响应于动态库接口被调用,动态库接口转换代码被执行,将动态库接口中指定位置与指定数量的参数(例如从头开始的3个参数)分别转换为调用库函数所需的数据类型。以及库函数调用代码被执行来调用库函数,并将转换了数据类型的参数传递给库函数,从而完成对库函数的调用。
可选地,库函数代理单元还将动态库提供的调用库函数的返回参数打包成网络数据包并提供给客户端。库函数代理单元返回给客户端的网络数据包也具有指定的格式,从而对于不同的库函数的多种形式的返回值,客户端能以统一的方式接收。
客户端与库函数代理单元之间,通过例如Socket、共享内存、管道等方式通信或交互信息。客户端与库函数代理之间通信所使用的协议是双方彼此知晓数据包格式的多种协议。在协议中,调用库函数的参数可以被显式定义或隐藏。当库函数的参数被显式定义,运行环境得以从数据包提取各参数,并在擦除类型后传递给动态库接口。当库函数的参数被隐藏,运行环境可将数据包的整体或指定部分作为变长参数而传递给动态库接口。
依然可选地,为了能够让客户端应用知晓哪些库函数已被成功加入到本***中,库函数代理还将已经加载的库函数列表发送给客户端,使得客户端能够将从多种库函数中选择自己提供的库函数来调用。依然可选地,库函数列表还附加库函数来源信息,使得客户端能知晓哪些库函数是自己提供的,或是由指定的供应方提供的。
图3展示了根据本申请实施例创建动态库的过程的流程图。
当库函数被更新,根据新的库函数生成封装了该库函数的动态库。对动态库的生成,可响应于库函数的更新而被触发。例如,当提交了新库函数的代码,图3所示的处理流程被执行。
获取被更新的库函数的源代码(310),添加动态库接口适配代码,将调用动态库时向动态库接口传递的一个或多个动态库参数转换为调用库函数所需的库函数参数(320)。所添加的动态库接口适配代码包括例如动态库接口、库函数接口转换代码以及调用被更新的库函数的代码。动态库接口包括动态库接口的名称与所使用的形式参数。作为举例,动态库接口使用的形式参数包括例如指定数量的参数或者变长参数。根据本申请的实施例,生成动态库接口适配代码时,对于封装了不同库函数的动态库,其动态库接口的形式参数是相同的或统一的。各动态接口的参数类型也是相同或统一的,例如都是被擦除了类型的形式,或者都是指定或默认类型。
生成的库函数接口适配代码用于执行例如步骤322-332的操作。为生成库函数接口转换代码,首先获取动态库接口所传递的动态库参数数量(322)。获取动态库参数数量是可选的,目的在于早期判断从动态库接口传递的参数数量同库函数所需的参数数量是否一致。在动态库接口传递变长参数的情况下,需要添加代码来识别所传递的变长参数的长度(参数数量)。在动态库接口传递指定数量参数的情况下,从动态库接口的显示参数列表可识别出参数的数量。提取调用动态库所使用的各个动态库参数(324)。由于参数类型被擦除,从动态库接口无法获取各动态库参数的类型,而是根据库函数所需的各库函数参数类型来确定各动态库参数的类型。
根据库函数的函数声明,获取调用库函数所需的各库函数参数的类型(326)。由于各库函数的接口形式彼此可以不同(例如具有不同数量的参数),因而需要解析库函数接口形式。例如,从库函数源代码中获取库函数的函数声明,从中识别函数名、参数数量、各参数的类型,可选地还识别参数在函数声明的参数列表中的位置排序。将各动态库参数同各库函数参数建立一对一的映射,例如将动态库参数的第一个参数映射到库函数参数的第一个参数,将动态库参数的第二个参数映射到库函数参数的第二个参数,以此类推。还根据从库函数的函数声明中获取的各库函数参数类型,依次将被擦除了类型的各动态库参数转换为与其对应的库函数参数的类型(328)。可选地,对于用于容纳库函数输出的参数,还生成为其分配内存空间的代码。
作为举例,动态库接口的参数列表为“T…args”,其中T表示默认类型或擦除了类型,“…args”代表变长参数。通过识别args中所包括的元素数量可获得运行时从动态库接口传入的动态库参数的数量。而库函数的函数声明为例如“foo(i nt a,char b,float c,double d)”,其包括4个参数(a、b、c与d),并且各参数具有确定的类型。将变长参数args的第一个元素(记为args[0])转换为int类型(整型),作为传递给库函数的参数a,将变长参数args的第二个元素(记为arg s[1])转换为char类型(字符型),作为传递给库函数的参数b,以此类推。
作为又一个例子,动态库接口的参数列表为“arg1,arg2,arg3,arg4,arg5”,而库函数的函数声明为例如“foo(int a,char b,float c,double d)”。在所生成的将各动态库参数转换为与其对应的库函数参数的类型的代码中,将arg1转换为i nt型,将arg2转换为char型,将arg3转换为float型,将arg4转换为arg4型,而动态库接口中的参数arg5不被使用。依据库函数的函数声明中所使用的参数数量,确定动态库接口中的哪些参数被使用,哪些参数可不被使用。
返回参看图3,根据库函数的函数声明,生成调用库函数的代码,并将已进行了类型转换的各动态库参数作为库函数参数提供给库函数(330)。
库函数可具有返回值,或者通过函数声明中的一个或多个库函数参数传递库函数执行结果(为了简便目的,将库函数返回值或执行结果统称为处理结果)。在需要获取库函数处理结果时,所生成的代码还用于获取库函数的处理结果,并将处理结果转换为动态库的输出参数以传递给运行环境。
编译库函数以及步骤320所生成的动态库接口适配代码,并生成封装了库函数的动态库(340)。
可选地,生成的动态库还被添加到运行环境(也参看图2的运行环境)。
根据本申请的实施例,可选地,在编译库函数之前,还生成用于编译/构建的配置文件。
为了例如满足生成的动态库跨平台的需求,获取用户指定的目标***架构和/或操作***,并根据用户选择的目标架构/目标操作***,生成相应的构建配置文件。在编译/构建过程中利用这个构建配置文件,对动态库接口适配代码与库函数代码进行编译然后生成目标的动态库。
图4展示了根据本申请实施例的根据生成的构建配置文件生成动态库的流程图。
在编译构建动态库工作时,读取构建配置文件,向用户展示可用的一种或多种配置选项(例如,要运行动态库的目标***架构/操作***)。获取用户选择的配置。可选地,采用默认配置而不需要用户选择。响应于所确定的配置(基于用户的选择或默认配置)在构建目录中生成一份新的配置文件,然后编译构建***重新读取这个新的构建配置文件,开始进行编译构建过程。
可选地,为了确保生成的编译构建过程是“可重入”的(即如果编译失败,用户可以不破坏原来的配置,然后重新执行编译构建过程),编译构建时,首先将所使用的构建配置文件复制一份副本。如果用户需要针对本次编译过程对构建配置文件进行修改,在副本上进行,而不更改原来的构建配置文件,用以确保编译构建过程是可重入的。
如果有多个源代码文件,根据获取的构建配置对每个源代码文件进行编译。以及对所有源代码文件的编译结果实施构建以生成目标的动态库。
图5A展示了根据本申请实施例客户端调用所集成的库函数的流程图。
为响应客户端对库函数的调用,运行环境选择并加载同客户端要调用的库函数对应的动态库(510)。该步骤是可选的,运行环境(也参看图2,运行环境)中可加载单一的动态库,从而来自客户端的调用请求都对应对该动态库的调用。在加载后,动态库被保持在运行环境中,从而下次响应调用而无需被再次加载。依然可选地,运行环境中加载了多个动态库,都可响应客户端的调用请求。调用请求中可指定或不指定动态库。依然可选地,依据调用请求中指定的动态库而加载动态库。
客户端提供给运行环境的调用请求是网络数据包,网络数据包包括一个或多个数据域,从数据包中提取各数据域(520),数据域携带了调用库函数所需的参数。
图5B展示了承载库函数的调用请求的网络数据包的示意图。
调用请求包括一个或多个网络数据包。图5B中数据包包括多个数据域,数据域又包括数据类型域数据值。不同数据域的大小是可变的,从而用指定的标记区分相邻数据域的边界。标记是例如具有指定值的字节(例如十进制数“124”)。数据域中由指定位置与长度的区域描述数据类型(例如,int、int[]、int16、float、double等),其余部分为数据值,数据值具有数据类型字段所指示的类型。根据本申请的实施例,库函数调用请求的网络数据包中携带参数的数据类型,使得运行环境得以区分各参数并操作各操作;而在网络环境提供给动态库接口的参数中,类型被擦除或转换为默认类型,使得不同类型的参数能被以统一的方式传递到动态库接口,进而使得运行环境以统一的方式根据接收的库函数调用请求来调用动态库接口,而无需处理动态库所封装的库函数的差异性。
可选地,当采用具有指定值的字节作为边界区分数据包中的数据域时,需要对作为数据值的该指定值实现数据传输。为此目的,当数据包中出现非作为数据域边界的该指定数值(例如单一字节表示的十进制数124)时,就在该字节前面再添加一个十进制数124以形成连续的两个十进制数124,这样的两个连续的十进制数124代表单个十进制数124(而非代表数据域的边界标记)。在运行环境,如果收到单个的十进制数124,则将其识别为是两个数据域的边界,如果收到连续的两个十进制数124则代表其为数据值中的一个十进制数124的字节。从而在数据域的数据值部分不会出现单个的十进制数124,出现的单个十进制数124代表数据域的边界。
依然可选地,一些情况下,单一的调用请求指示了要调用多个库函数,这些库函数被组合地调用,以获得更丰富的功能,例如实现复杂的水声信号处理。对此目的,需要区分调用请求中所携带的多个参数同多个库函数的对应关系。在数据域中添加具有指定长度的目标字段,目标字段的值代表了该数据域所携带的参数所对应的库函数或库函数组。进而,调用请求中具有相同目标的数据域可以有多个,这些数据域各自携带的参数,按其数据域在数据包中出现的先后顺序,一一对应于目标所代表的库函数(或库函数组)所需的各参数。从而,能够将多个库函数所需的参数在一次调用请求中传递给运行环境,也不受库函数参数数量变化的限制。
作为举例,表1展示了DEMON_LOFAR谱图计算算法库中所需的参数。DE MON_LOFAR谱图计算算法库中包括多种算法,例如三级带通滤波器、三级低通滤波器、三级高通滤波器、DEMOM算法和LOFAR算法等,这些算法可分别由对应的库函数或库函数组实现。表1中的备用参数代表用于将来扩展或改进算法库所预留的参数。
通过表1,识别出DEMON_LOFAR谱图计算算法库所需要的参数的总量是有限的(例如,75个,或小于100),以及其包括的算法种类(对应于库函数或库函数组)是有限的(例如,14个)。从而承载调用请求的数据包大小不会过大而适于网络传输,或用于选择合适的服务器-客户端交互方式。以及区分算法种类的目标字段的大小可被确定(例如为表达14种算法可使用1字节大小的目标字段)。
一些动态库接口/函数接口所传递的参数数量受限,依据具体算法库所需的参数数量,还有助于选择用参数列表形式还是变长参数形式在运行环境与动态库之间传递参数。
表1
通过图5B所展示的网络数据包结构,即使随着库函数的更新,要传递的库函数调用请求的参数种类/数量发生变化,也无需改动运行环境接收、解析调用请求并调度动态库接口的代码(通过图5A所展示的处理流程)。从而在运行环境不停机的情况下,可完成对动态库的加载,并用新加载的动态库响应客户端的调用请求。
依然可选地,运行环境对动态库实施管理,包括对动态库的分级加载策略与动态替换策略。
为了能够在无论运行环境运行期间还是关机期间都能随时替换动态库。对动态库采取了分级加载的策略。此策略根据动态库所处的存储层级不同分为三级,分别为文件***动态库、内存动态库以及当前动态库。文件***动态库的动态库被存储于文件***的目录中,在此文件目录中的动态库才有资格被加载到运行环境内存中被运行环境使用。内存动态库是被加载到运行环境内存中的动态库,此类动态库在运行环境运行期间可被随时选中,而被选中来使用的内存动态库则称为当前动态库。
当需要为运行环境添加可以使用的动态库时,需要首先将编译构建后生成的动态库文件复制到指定的文件目录中(使之成为文件***动态库)。运行环境的动态库管理单元(也参看图2)扫描文件***中存在的动态库。文件***动态库是运行环境可用的动态库,并可被客户端查询,使得客户端可以查询并选择指定的动态库加载到运行环境内存中成为内存动态库。客户端可通过发送请求将某个内存动态库指定为当前动态库,相应地,运行环境(动态库管理单元)响应客户端请求将当前动态库替换成客户端选中的动态库。
依然可选地,当前动态库仅有1个,客户端的对库函数的调用请求被提供给当前动态库的动态库接口,从而在调用请求中可以无需指定所使用的动态库。可选地,客户端的调用请求中指定所使用的动态库,而动态库管理单元作为响应,将当运行环境中的当前动态库替换为客户端指定的动态库。
运行环境的资源是有限的,从而内存动态库的数量是有限的。通过分级加载策略与动态替换策略,也有助于降低多种动态库对运行环境的资源(计算资源、存储资源)的开销。例如在启动运行环境之前,设置内存动态库可以容纳的动态库数量。当内存动态库的容量到达运行环境所能容纳的上限时,会对内存动态库中的动态库进行替换。利用先进先出或最近最少使用策略选择被从内存动态库中移出的动态库。最近最少使用替换策略需要进行额外的使用次数统计工作,会造成些许效率低下,但是会将替换动态库引起的***震荡降低到最小的程度。
图6展示了根据本申请的实施例的客户端调用库函数的流程图。
运行环境(也参看图2)管理已封装了库函数的动态库。客户端访问运行环境来使用库函数,并从运行环境获得库函数的调用结果。运行环境与客户端可位于相同或不同的计算机。
为调用库函数,客户端选择要使用的库函数(610)。对库函数的选择体现为例如指示运行环境将指定的动态库设置为当前动态库。步骤610是可选的,而不必每次客户端要调用库函数时都执行步骤610。可选地,运行环境还向客户端提供可用的多个动态库的信息,以便于客户端选择所需的动态库。
客户端知晓库函数的函数声明或所需的参数(及其类型),并且根据调用库函数所需的各个参数生成对应的数据域(也参见图5B的数据域)(620),每个参数生成一个数据域,数据域中描述了参数的类型与值。可选地,数据域中还包括目标字段,以指示其所代表的参数所对应的库函数或库函数组。
客户端将生成的一个或多个数据域打包为网络数据包作为对库函数的调用请求发送给运行环境(630)。响应于收到调用请求,运行环境从网络数据包中解析出调用库函数所需的参数,并传递给动态库的动态库接口。以及运行环境还将动态库给出的调用库函数的结果打包为网络数据包返回给客户端。
客户端接收运行环境提供的网络数据包(640),从中提取库函数的执行结果(650)。
实现本申请实施例提供的运行环境/客户端包括例如计算机、服务器或其他信息处理设备。这些设备包括例如直接或间接地耦合到总线的存储器、一个或更多处理器、一个或更多呈现组件、I/O组件以及电源。总线所代表的可以是一种或更多种总线(比如地址总线、数据总线或其组合)。
尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。
Claims (10)
1.异构库函数的自动化集成方法,包括:
获取库函数的源代码;
根据库函数的源代码生成动态库接口适配代码,其中动态库接口适配代码包括动态库接口、库函数接口转换代码以及调用所述库函数的代码;其中所述库函数接口转换代码用于将动态库接口传递的动态库参数转换为调用所述库函数所需的库函数参数;
编译与构建所述源代码以及所述动态库接口适配代码以生成封装了所述库函数的动态库;
加载所述动态库,利用所述库函数响应对所述库函数的调用请求。
2.根据权利要求1所述的方法,还包括:
响应于接收到来自所述客户端的对所述库函数的调用请求,从所述调用请求中提取一个或多个数据域,每个数据域对应于调用所述库函数所需的参数之一,每个数据域记录了其对应的参数的类型与值;
将从所述一个或多个数据域提取的参数传递给所述动态库,以通过所述动态库调用所述动态库封装的所述库函数。
3.根据权利要求2所述的方法,其中
对从所述一个或多个数据域提取的每个参数,擦除所提取的参数类型,将擦除了类型的一个或多个参数组合为变长参数,将所述变长参数传递给所述动态库。
4.根据权利要求3所述的方法,其中
对于来自客户端的对不同库函数的不同调用请求,无论从不同调用调用请求提取的调用库函数所述的参数的数量是否相同以及从不同调用请求所提取的各参数的类型是否对应相同,所生成的传递给相同或不同动态库的参数具有相同的形式。
5.根据权利要求4所述的方法,其中
所生成的传递给相同或不同动态库的参数是变长参数,且变长参数所携带的各元素的类型都被擦除,或者各元素都具有相同的指定类型;
或者所生成的传递给相同或不同动态库的参数是指定数量的参数,并且所述指定数量的参数的类型都被擦除,或者所述指定数量的参数各自具有相同的指定类型。
6.根据权利要求5所述的方法,其中
所述库函数接口转换代码用于提取传递给动态库的参数作为动态库参数,根据所述库函数的函数签名获取调用所述库函数所需的各参数的类型,对动态库参数进行类型转换,以及各动态库参数依次转换为从所述库函数的函数签名获取的参数类型,其中各动态库参数的类型转换结果同调用所述库函数所需的各参数的类型按顺序一一对应;
调用所述库函数的代码用于将转换了类型的各动态库参数提供给所述库函数。
7.根据权利要求6所述的方法,其中
对于不同的动态库,传递给不同动态库的参数具有相同的形式;以及
当所述不同的动态库各自封装的库函数所需的接口参数不同时,所述库函数接口转换代码从动态库参数生成的调用库函数所需的参数不同。
8.根据权利要求1所述的方法,其中
将生成的所述动态库添加到文件***的指定位置,使得所述动态库可被加载并使用;
将文件***中的一个或多个动态库加载到内存中成为内存动态库;选择内存动态库之一作为响应对所述库函数的调用请求的当前动态库。
9.异构库函数的自动化集成***,包括动态库创建单元与运行环境;所述动态库创建单元获取库函数的源代码;根据库函数的源代码生成动态库接口适配代码,其中动态库接口适配代码包括动态库接口、库函数接口转换代码以及调用所述库函数的代码;其中所述库函数接口转换代码用于将动态库接口传递的动态库参数转换为调用所述库函数所需的库函数参数;编译与构建所述源代码以及所述动态库接口适配代码以生成封装了所述库函数的动态库;所述运行环境加载所述动态库,利用所述库函数响应对所述库函数的调用请求。
10.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,
所述处理器执行所述程序时实现根据权利要求1-8之一所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211009638.2A CN115328679A (zh) | 2022-08-22 | 2022-08-22 | 异构函数库的自动化集成方法、计算设备及其*** |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211009638.2A CN115328679A (zh) | 2022-08-22 | 2022-08-22 | 异构函数库的自动化集成方法、计算设备及其*** |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115328679A true CN115328679A (zh) | 2022-11-11 |
Family
ID=83925098
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211009638.2A Pending CN115328679A (zh) | 2022-08-22 | 2022-08-22 | 异构函数库的自动化集成方法、计算设备及其*** |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115328679A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117806852A (zh) * | 2024-03-01 | 2024-04-02 | 傲拓科技股份有限公司 | 一种接口调用方法、装置、存储介质及处理器 |
-
2022
- 2022-08-22 CN CN202211009638.2A patent/CN115328679A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117806852A (zh) * | 2024-03-01 | 2024-04-02 | 傲拓科技股份有限公司 | 一种接口调用方法、装置、存储介质及处理器 |
CN117806852B (zh) * | 2024-03-01 | 2024-05-14 | 傲拓科技股份有限公司 | 一种接口调用方法、装置、存储介质及处理器 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6622175B1 (en) | System and method for communications in a distributed processing environment | |
USRE43375E1 (en) | System and method for communications in a distributed computing environment | |
US6446137B1 (en) | Remote procedure call system and method for RPC mechanism independent client and server interfaces interoperable with any of a plurality of remote procedure call backends | |
US6385661B1 (en) | System and method for dynamic generation of remote proxies | |
US6629128B1 (en) | System and method for distributed processing in a computer network | |
US6993774B1 (en) | System and method for remote enabling classes without interfaces | |
US6951021B1 (en) | System and method for server-side communication support in a distributed computing environment | |
US6931455B1 (en) | System and method for communications between a CORBA object request broker and a non-CORBA object request broker | |
US6484214B1 (en) | Method for distributed object communications based on dynamically acquired and assembled software components | |
US20030055862A1 (en) | Methods, systems, and articles of manufacture for managing systems using operation objects | |
US20080301638A1 (en) | Method and Apparatus for a System Management Tool to Adapt Command Interface and Behavior Based on Installed Features | |
EP1246059B1 (en) | Dynamic interface aggregation on demand | |
US10579366B2 (en) | Data upgrade framework for distributed systems | |
CN114428728A (zh) | 信息物理测试协议处理***及方法 | |
CN114327477A (zh) | 智能合约执行方法、装置、电子装置和存储介质 | |
CN115328679A (zh) | 异构函数库的自动化集成方法、计算设备及其*** | |
CN112818176B (zh) | 一种数据处理方法、装置、设备及存储介质 | |
CN111324395B (zh) | 调用方法、装置和计算机可读存储介质 | |
CN109388406A (zh) | 转换java代码的方法及装置、存储介质、电子装置 | |
CN102495757A (zh) | 一种适用于java远程调用对象传输的优化方法、装置 | |
US7500248B2 (en) | Systems and methods for implementing aggregation containers | |
CN114115832A (zh) | 一种物联网嵌入式设备与云平台通信协议实现方法 | |
EP1122644A1 (en) | A method and system for dynamically dispatching function calls from a first execution environment to a second execution environment | |
CN113312031A (zh) | 一种软件通信体系结构的命名服务接口 | |
CN112650512A (zh) | 硬件驱动方法及装置、终端、存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |