技术领域
[0001] 本发明涉及计算机领域,特别是涉及一种静态流程模型的编译执行方法及系统。
相关背景技术
[0002] 计算机并不能直接接受和执行采用高级语言编写的源代码,先要翻译成机器语言,才能被计算机识别和执行。
[0003] 静态流程模型的执行往往通过解释执行的技术实现,解释执行的效率往往由于需要根据每句计算机语句来实时转为机器指令,从而使得整个系统的执行效率较低。流程模型的一次执行称为该流程对应的实例,一个静态模型执行多次即可产生多条实例,每条实例执行的活动集称为实例对应的轨迹。流程模型的每一次执行都要根据每句计算机语句来实时转为机器指令,即每执行一次就要翻译一次,占用了过多的计算机资源、执行效率低、不适用于复杂的流程实例的运行。
具体实施方式
[0046] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0047] 本发明的目的是提供一种静态流程模型的编译执行方法及系统,能够提高执行静态流程模型的效率,适用于复杂的流程实例的运行。
[0048] 为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
[0049] 图1为本发明实施例静态流程模型的编译执行方法流程图,如图1所示,本发明静态流程模型的编译执行方法步骤如下:
[0050] 步骤101:获取静态流程模型;
[0051] 步骤102:对所述静态流程模型的静态定义进行解析,得到解析后的静态流程模型,所述解析后的静态流程模型包括所述静态流程模型的拓扑结构、所述静态流程模型中的各个元素、各所述元素的参数配置以及所述静态流程模型的全局配置;
[0052] 步骤103:将解析后的静态流程模型存储在内存中,记为内存模型;
[0053] 步骤104:对对所述内存模型进行编码并对代码模板的代码槽进行填充,得到所述内存模型的源代码文件,保存所述源代码文件;
[0054] 步骤105:对所述源代码文件中的源代码进行编译,生成所述源代码对应的动态链接库,保存所述动态链接库;
[0055] 步骤106:当需要执行所述静态流程模型时,加载所述静态流程模型对应的动态链接库到内存中,以实现所述静态流程模型的执行。
[0056] 其中,步骤104具体包括:
[0057] 提取所述内存模型的参数配置,所述内存模型的参数配置包括所述内存模型对应的所述静态流程模型的名称和版本号;
[0058] 根据所述内存模型的参数配置,查询模型仓库中是否存在所述内存模型对应的源代码文件;
[0059] 如果是,则返回所述模型仓库中存在的内存模型对应的源代码文件;
[0060] 如果否,对内存模型进行编码,形成源代码文件。
[0061] 优选的,所述静态流程模型的编译执行方法还包括:
[0062] 在对所述静态流程模型的静态定义进行解析,得到解析后的静态流程模型之后,根据解析后的静态流程模型判断所述静态流程模型在控制流层面和数据流层面是否正确;
[0063] 如果是,则将解析后的静态流程模型存储在内存中,记为内存模型。
[0064] 在上述方法步骤中,所述静态流程模型中的各个元素包括:所述静态流程模型的开始事件、结束事件、中间事件、普通任务、人工任务、脚本任务、选择网关、并行网关等。
[0065] 所述参数配置包括:开始时间、结束时间、执行者、运行jar包路径、运行函数名、运行参数、运行方式、运行脚本、人工信息、默认输出流等。
[0066] 所述全局配置包括所述静态流程模型的名称、创建者、版本号等。
[0067] 作为本发明的又一实施例,静态流程模型为一个确定过程的形式化或图示化描述,为了提高静态流程模型的执行效率,需要建立一个模型解析器读取模型的拓扑结构及参数设置,然后通过代码生成器将模型转化为对应逻辑的程序源代码,并通过编译器将源代码编译成动态链接库,当模型实例需要运行时,加载对应的动态链接库到内存中,即可实现模型实例的执行。最后调度器调度一个流程实例的状态切换还需要同时监控、通过调度算法调度多个流程实例。
[0068] 图2为本发明实施例静态流程模型的执行架构图,如图2所示,模型解析器,模型解析器的主要职责是对静态流程模型的静态定义进行解析,得到静态流程模型的拓扑结构、静态流程模型中的各个元素(例如开始事件、结束事件、中间事件、普通任务、人工任务、脚本任务、选择网关、并行网关等)的相应参数配置(例如开始时间、结束时间、执行者、运行jar包路径、运行函数名、运行参数、运行方式、运行脚本、人工信息、默认输出流等)以及整个静态流程模型的全局配置(例如模型名称、模型创建者、模型版本号等)。
[0069] 图3为本发明实施例静态流程模型的解析流程图,如图3所示,以静态流程模型的静态定义形式为XML文件配置为例,先通过对计算机语言的解析提取出各个标签对应的静态流程模型的全局配置及其拓扑结构,检查静态流程模型的控制流层面的正确性(例如是否含有开始事件和结束时间、是否存在孤立的结点、是否存在不满足元素语义的部分等);在保证静态流程模型的控制流层面的正确性的情况下,提取出各个模型元素的相关参数配置,然后对静态模型的数据流层面进行正确性的检查(例如是否存在没有初始化就作为某活动输入的变量,是否存在自始至终均无使用的变量等);在数据流层正确性保证的情况下,将整个静态流程模型存储在内存中的模型对象中,成为内存模型。该内存模型的拓扑结构、各个元素以及整个模型的参数均从XML定义文件中获得,以此得到了内存模型以供下一步使用。此处,内存模型的拓扑结构、各个元素以及整个模型的参数即为静态流程模型的拓扑结构、各个元素以及整个模型的参数。
[0070] 代码生成器,代码生成器的目的是将内存模型对应的逻辑执行转化为代码的形式。为了避免"路径式"的代码生成方式带来的问题(例如代码过长、不宜处理多重选择等情况),我们设计了一种"过程感知"的代码生成方式,这一设计极大地减少了代码长度,并具有更强的鲁棒性。
[0071] 图4为本发明实施例源代码生成过程的流程图,如图4所示,代码生成器首先需要输入内存模型和代码模板(代码模板是针对各种模型元素的语义进行对应执行的不随模型发生变化的代码内容,对代码模板中的代码槽进行填充以此来适应当前模型对应的内容,代码槽为随模型发生变化的代码内容),在内存模型中提取模型参数配置(例如模型名、版本号等),将这些参数配置填充在代码模板对应的模型参数槽中;然后查询当前的模型仓库中是否存在该内存模型版本相应的文件,若存在,则直接返回之前生成的该内存模型版本的源代码;若不存在,则需要通过对内存模型进行编码,形成相应的编码文件(例如XML、JSON等文件),该编码文件是通过现有技术的编码方式(例如内存对象封装为Json格式文件或XML格式文件等技术)对内存模型进行编码的,执行内存模型时向编码文件中读取源代码,从而使源代码的执行不是"路径式"的僵硬方式而是根据中间文件存储的内存模型进行灵活的"感知式"地执行;最后,创建该内存模型对应的源代码文件,并将填充后的代码模板作为源代码文件存入。
[0072] 编译器,编译器主要是将静态流程模型对应的源代码编译成它对应的动态链接库。动态链接库是一种库,当程序运行中需要加载它时,才加载到内存中。
[0073] 由于流程实例的执行是由对应的静态流程模型的逻辑执行决定的,所以当流程实例运行时,先调用相应的静态流程模型。但是,往往并不是提前将所有的静态流程模型直接加载到内存中,因为这样会造成内存极大的浪费。所以,流程模型要能够被动态地加载到内存中。
[0074] 动态加载是一种计算机程序运行中的加载库或二进制到内存中的机制,检索动态加载库中函数和变量的地址,执行这些函数或访问这些变量,并能从内存中卸载动态链接库。程序在启动的时候不调用这些动态链接库,发现需要调用动态链接库中的函数时,再进行加载。动态加载大多数是由操作系统或者I/O子系统处理。在UNIX,Solaris,Linux中,常用的动态加载库后缀名是“*.so”,Windows系统下的动态加载库后缀名是“*.dll”。也存在系统不支持动态加载,如Plan 9。大多数的计算机语言都提供了对动态链接库的架加载操作,如加载动态连接库,查找静态流程模型逻辑执行的相关方法,处理异常,卸载动态连接库等。
[0075] 图5为本发明实施例加载动态链接库的流程图,如图5所示,将静态流程模型源代码编译成动态链接库,当静态流程模型需要被加载时,加载动态链接库到内存中,当流程实例运行时,查找静态流程模型逻辑执行的相关方法,当不需要使用该静态流程模型时,可卸载动态链接库。
[0076] 调度器,一个流程实例一般具有创建,激活,挂起,终止和完成。创建是指流程实例刚创建。流程实例正常执行的状态叫运行。当暂停此流程实例运行的状态叫挂起,当恢复时,流程状态可变成激活状态。若流程实例运行出现问题或异常的状态叫终止。顺序完成流程模型中所有任务的执行,叫完成。流程实例状态的切换需要由调度器负责,调度器不仅调度一个流程实例的运行,状态切换还需要同时监控、通过调度算法调度多个流程实例。
[0077] 本发明提供的静态流程模型的编译执行方法通过将静态流程模型进行解析,并读取模型的拓扑结构及参数配置,然后将静态流程模型转化为对应逻辑的程序源代码,并将源代码编译成动态链接库,并保存序源代码以及源代码编译成动态链接库,当静态流程模型实例需要运行时,加载对应的动态链接库到内存中,即可实现静态流程模型实例的执行。由于本发明将静态流程模型转化为了对应逻辑的程序源代码以及动态链接库,并对其进行了保存,这使得每次需要执行该静态流程模型时,只需加载动态链接库就可以直接进行执行,无需每次都将静态流程模型的源代码中的语句逐句转为机器指令,进而计算机再执行,避免了对计算机资源的浪费,提高了执行效率。
[0078] 本发明还提供了一种静态流程模型的编译执行系统,图6为本发明实施例静态流程模型的编译执行系统结构示意图,如图6所示,所述系统包括:
[0079] 模型获取单元601,用于获取静态流程模型;
[0080] 模型解析单元602,用于对所述静态流程模型的静态定义进行解析,得到解析后的静态流程模型,所述解析后的静态流程模型包括所述静态流程模型的拓扑结构、所述静态流程模型中的各个元素、各所述元素的参数配置以及所述静态流程模型的全局配置;
[0081] 存储单元603,用于将解析后的静态流程模型存储在内存中,记为内存模型;
[0082] 源代码生成单元604,用于对所述内存模型进行编码并对代码模板的代码槽进行填充,得到所述内存模型的源代码文件,保存所述源代码文件;
[0083] 编译单元605,用于对所述源代码文件中的源代码进行编译,生成所述源代码对应的动态链接库,保存所述动态链接库;
[0084] 加载执行单元606,用于当需要执行所述静态流程模型时,加载所述静态流程模型对应的动态链接库到内存中,以实现所述静态流程模型的执行。
[0085] 其中,所述源代码生成单元604,具体包括:
[0086] 参数配置提取子单元,用于提取所述内存模型的参数配置,所述内存模型的参数配置包括所述内存模型对应的所述静态流程模型的名称和版本号;
[0087] 查询子单元,用于根据所述内存模型的参数配置,查询模型仓库中是否存在所述内存模型对应的源代码文件;
[0088] 返回子单元,用于当模型仓库中存在所述内存模型对应的源代码文件时,返回所述模型仓库中的所述源代码文件;
[0089] 编码子单元,用于当模型仓库中不存在所述内存模型对应的源代码文件时,对内存模型进行编码,形成源代码文件。
[0090] 所述系统还包括:
[0091] 判断单元,用于根据解析后的静态流程模型判断所述静态流程模型在控制流层面和数据流层面是否正确。
[0092] 所述静态流程模型中的各个元素包括:所述静态流程模型的开始事件、结束事件、中间事件、普通任务、人工任务、脚本任务、选择网关、并行网关等。
[0093] 所述参数配置包括:开始时间、结束时间、执行者、运行jar包路径、运行函数名、运行参数、运行方式、运行脚本、人工信息、默认输出流等。
[0094] 所述全局配置包括所述静态流程模型的名称、创建者、版本号等。
[0095] 本发明提供的静态流程模型的编译执行系统通过将静态流程模型进行解析,并读取模型的拓扑结构及参数配置,然后将静态流程模型转化为对应逻辑的程序源代码,并将源代码编译成动态链接库,并保存序源代码以及源代码编译成动态链接库,当静态流程模型实例需要运行时,加载对应的动态链接库到内存中,即可实现静态流程模型实例的执行。由于本发明将静态流程模型转化为了对应逻辑的程序源代码以及动态链接库,并对其进行了保存,这使得每次需要执行该静态流程模型时,只需加载动态链接库就可以直接进行执行,无需每次都将静态流程模型的源代码中的语句逐句转为机器指令,进而计算机再执行,避免了对计算机资源的浪费,提高了执行效率。
[0096] 本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的系统而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
[0097] 本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处。综上所述,本说明书内容不应理解为对本发明的限制。