函数程序持久化的方法、电子设备及存储介质转让专利
申请号 : CN201810174438.X
文献号 : CN108399068B
文献日 : 2021-07-02
发明人 : 刘诗聪 , 武红华
申请人 : 上海赞控网络科技有限公司
摘要 :
权利要求 :
1.一种函数程序持久化的方法,其特征在于,包括:执行目标程序时,判断所述目标程序的函数是否需要被保存,若需要被保存,则保存所述需要被保存的函数的上下文环境及运行代码;其中,所述被保存的函数为具备闭包恢复过程的持久化编译函数;
判断是否需要恢复所述被保存的函数,在需要恢复所述被保存的函数时,读取所述被保存的函数的上下文环境及运行代码,并对所述被保存的函数进行现场编译,得到可运行的持久化编译函数;
执行所述可运行的持久化编译函数;
其中,对所述被保存的函数进行现场编译,得到可运行的持久化编译函数,具体包括:对需要被恢复的函数的运行代码进行编译得到用于生成函数对象的函数类;
将保存的上下文环境中的所述需要被恢复的函数的实例传递给所述函数类,并运行所述函数类,以生成一个函数对象;
递归地执行上述一个函数对象的生成步骤,直到所述需要被恢复的函数的上下文环境中的所有函数对象均被重新生成;
所述具备闭包恢复过程的持久化编译函数通过以下方式实现:通过预设的编译程序或预设编译器从待持久化的原程序中提取出所有函数以及各函数的闭包;
确定并记录所述各函数的上下文环境;
在各所述函数中写入用于恢复所述闭包的运行代码以生成所述持久化编译函数。
2.根据权利要求1所述的函数程序持久化的方法,其特征在于,所述需要被保存的函数的上下文环境具体包括:
需要被保存的函数的实例、所述需要被保存的函数的祖实例以及所述祖实例的运行代码。
3.根据权利要求2所述的函数程序持久化的方法,其特征在于,所述保存所述需要被保存的函数的上下文环境及运行代码,具体包括:获取所述需要被保存的函数的上下文环境及运行代码,并转换成预设格式的文件;
保存所述预设格式的文件。
4.根据权利要求3所述的函数程序持久化的方法,其特征在于,在所述保存所述需要被保存的函数的上下文环境及运行代码中,将需要被保存的函数的实例与需要被保存的函数对象一一对应关联。
5.根据权利要求1所述的函数程序持久化的方法,其特征在于,判断所述目标程序的函数是否需要被保存具体为:
若目标程序的函数被赋予所述目标程序中的变量,则判定所述目标程序的函数需要被保存。
6.一种电子设备,其特征在于,包括:至少一个处理器;以及,
与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行如权利要求1至5中任一所述的函数程序持久化的方法。
7.一种计算机可读存储介质,存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至5中任一项所述的函数程序持久化的方法。
说明书 :
函数程序持久化的方法、电子设备及存储介质
技术领域
背景技术
程序的持久化:如电商应用中,下单步骤会生成一个“订单”作为持久化的对象。持久化是将
程序数据在持久状态和瞬时状态间转换的机制。在目前所有程序设计语言所定义的程序
中,变量均属于瞬时状态,程序中断运行后该变量数据就会丢失,因而部分关键数据需要经
过持久化才能维持业务的正常运转。目前相关技术还都需要开发人员自行决定哪些数据需
要持久化。
盘或数据库中。虽然这些方案能够解决持久化问题,然而这些持久化方案会使得程序代码
多出来一些专门用于持久化的冗余代码,此外这些方案并不能帮助开发者判断何时应将变
量持久化,何时读出变量。因此这些方案虽然提供了持久化方案,但对于初级程序员而言极
容易误用,对于高级程序员而言又制约他们的开发效率。
要手工操作编写的困难。这类工具在客户端上的应用较为流行。
家卖家用户,而卖家又对应店铺等。对于带循环引用的数据结构持久化,也是一个必需解决
的问题。目前的做法主要依靠手工设计数据库来实现,并通过外键进行关联。另外也有
circular‑json等可以解决循环引用的对象序列化方案从而可以对复杂对象持久化。
工具虽然能够避免手工写数据库操作语句的工作,但仍然无法减轻开发者的劳动强度或降
低出错率。首先这些持久化类无法对函数进行持久化。其次持久化的时机、读数据库的时机
仍然要人工判断。对于复杂的服务端程序,一个业务流程会涉及到多段交互,因而需要多次
存储和还原程序运行状态的代码;何时持久化、何时解变量、是否应当进入下一步仍然需要
人工判断。自动产生持久化类的方案也只能是稍微减轻了开发者劳动量,并不能本质上解
决存储和还原程序运行状态的问题。
serializer等序列化工具也具备一定的序列化。这些工具为储存复杂的程序运行状态提供
了良好的底层环境。这些序列化工具本质上仍然不能对函数进行持久化,因而也无法直接
解决存储和还原程序运行状态的问题。但是这些工具对于复杂对象嵌套的解析能力为对复
杂的程序运行时的变量进行解析和存储提供了良好的基础。
发明内容
目的,从而使得开发者在基于函数式程序开发互联网应用时,无需手工进行持久化操作,可
极大地提高互联网应用的开发效率、降低出错率。
述需要被保存的函数的上下文环境及运行代码;其中,所述被保存的函数为具备闭包恢复
过程的持久化编译函数;判断是否需要恢复所述被保存的函数,在需要恢复所述被保存的
函数时,读取所述被保存的函数的上下文环境及运行代码,并对所述被保存的函数进行现
场编译,得到可运行的持久化编译函数;执行所述可运行的持久化编译函数。
行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行如上
所述的函数程序持久化的方法。
保存的上下文环境以及运行代码,并进行现场编译得到可运行的持久化编译函数,继续执
行该可运行的持久化编译函数即可。持久化编译函数是指与开发人员编写的函数等价的,
但是自身具备闭包恢复过程的函数。因此,本发明通过存储函数及其闭包,并对函数进行现
场编译,从而使得函数式程序能够自动实现持久化,进而可以大大提高互联网应用的开发
效率,降低开发人员工作量以及出错率。
上下文环境中的所述需要被恢复的函数的实例传递给所述函数类,并运行所述函数类,以
生成一个函数对象;递归地执行上述一个函数对象的生成步骤,直到所述需要被恢复的函
数的上下文环境中的所有函数对象均被重新生成,从而提供了一种现场编译的具体实现方
式。
各所述函数中写入用于恢复所述闭包的运行代码以生成所述持久化编译函数,从而提供了
一种持久化编译函数的具体实现方式。
及其闭包的具体存储方式。
设格式的文件。
附图说明
非有特别申明,附图中的图不构成比例限制。
具体实施方式
式中,为了使读者更好地理解本申请而提出了许多技术细节。但是,即使没有这些技术细节
和基于以下各实施方式的种种变化和修改,也可以实现本申请所要求保护的技术方案。
序持久化中存在的需要人工决定持久化哪些变量、指定持久化时机、编写准许重入判断、变
量恢复函数等的繁琐复杂操作,本发明通过自动生成持久化程序代码,使得函数对象能够
持久化并传递,从而使得函数式编程方法仍然有效,并且使得程序中断、升级后,原有业务
流程可以继续运行,因此能够提高开发效率。
开发者的其他程序组件混合,达到持久化运行的效果。如开发者在开发互联网App时,可用
本方案编写业务逻辑的处理程序,然后使用编译后的代码和通用的网络库对接,生成完整
的代码。
上下文环境及运行代码,其中,被保存的函数为具备闭包恢复过程的持久化编译函数,判断
是否需要恢复被保存的函数,在需要恢复被保存的函数时,读取被保存的函数的上下文环
境及运行代码,并对被保存的函数进行现场编译,得到可运行的持久化编译函数,执行可运
行的持久化编译函数。本发明实施方式相对于现有技术而言,在执行目标程序时,当判断出
目标程序中的函数需要被保存时,则保存该函数的上下文环境及运行代码,在需要恢复该
函数时,读取保存的上下文环境以及运行代码,并进行现场编译得到可运行的持久化编译
函数,继续执行该可运行的持久化编译函数即可。持久化编译函数是指与开发人员编写的
函数等价的,但是自身具备闭包恢复过程的函数。因此,本发明通过存储函数及其闭包,并
对函数进行现场编译,从而使得函数式程序能够自动实现持久化,进而可以大大提高互联
网应用的开发效率,降低开发人员工作量以及出错率。下面对本实施方式的函数程序持久
化的方法的实现细节进行具体的说明,以下内容仅为方便理解提供的实现细节,并非实施
本方案的必须。
步骤101。
称和函数对象标识符。在实例库中保存该函数对象所对应的实例。
应的实例的实例标识符,根据实例标识符,从实例库中找到储存的闭包,以此生成一个实例
对象。根据函数对象记录的函数名称,从函数对象列表找到函数对象的构造方法,生成一个
函数对象。使用找到的实例对象作为对应的实例对象。调用该函数对象的执行方法。需要说
明的是,编译后的程序代码通过一个预先设定的函数使用该功能。
式对于目标程序的函数是否需要被保存的具体判断方式不作限制。
记录下来。具体地说:具备闭包恢复过程的持久化编译函数通过以下方式实现:从待持久化
的原程序中提取出所有函数以及各函数的闭包,确定并记录各函数的上下文环境,在各函
数中写入用于恢复闭包的运行代码以生成持久化编译函数。换句话说,即是对需要持久化
的程序做如下处理:获取需要持久化的程序,读取其中的每个函数,并找到每个函数的闭
包,并对其中的每个函数执行以下操作:通过预设编译程序(亦可称为预设编译器)编写一
个新函数,并对新函数的执行方法增加一个恢复闭包的过程。对于被定义在函数内的函数,
预设编译器会将其改写为对预设编译器编译出来的函数的创建。其中,待持久化的原程序
包括:变量以及函数。在函数式编程中,函数本身也是一种变量。一般而言,函数的运行不可
被打断,当事件触发完毕等待下一个事件时可以被打断。
序。
下文环境,并对各函数的上下文环境与各函数的对应关系进行记录,然后由预设的编译程
序将各函数改写成新的对应的函数。改写后的函数与改写前的函数在功能上完全等价,但
是在改写的过程中,在各函数中写入了用于存储以及恢复该函数的代码,从而使得通过预
设编译程序编译后的函数成为可运行的持久化编译函数,在对需要持久化的程序中的所有
函数均完成编译之后,还需要将编译后的程序与外部数据库对接,例如与通用的网络库进
行对接,从而生成目标程序的完整的代码。
存下来。然后特定代码在存储和恢复时会循环执行。其中,执行特定代码的时候,若是用于
恢复,就恢复函数对象,恢复完成时,遇到定义的需要保存的函数对象,则会保存它。
数,即对原函数进行重新改写,使得该函数的函数对象的构造函数接受一个实例标识符
(ID),并具有执行方法。对每个声明函数的语句,改写成使用当前函数上下文(函数实际运
行时才会被决定),对预设编译器新写的对应函数进行构造(例如在每个函数的开始位置增
加构造函数代码),构造函数的代码在函数运行时才会被执行。对每个函数调用的语句,改
写成对应函数对象的对执行方法的调用。生成一个函数对象列表,记录所有函数名称和函
数对象的构造方法的对应关系。其中,函数需要上下文才能执行。函数对象是将这些函数
“可执行化”。
对应的函数的函数名称。其中,函数是一段代码,但该代码在没有指定上下文(即父实例)时
不能运行。函数对象则具有上下文(父实例),可以运行。函数对象的“执行”(The execution
of a function object)是实例。
执行实际的函数代码。执行完毕后,检查所有闭包变量的更改并更新到该函数对象所对应
的运行实例库中。最后检查该函数对象所对应的运行实例是否还被其它函数对象或运行实
例所引用,若无引用则删除对应的运行实例。最后检查该函数对象是否还被其他实例所关
联或存在于其它实例的储存的闭包中,若无则删除该对象。删除函数对象时,递归地检查父
实例是否还被其它函数对象或运行实例引用,若无引用则删除该运行实例。
体地说,保存函数对象包括:获取需要被保存的函数的上下文环境及运行代码,并转换成预
设格式的文件,保存预设格式的文件。其中,可以利用诸如circular‑json、serializer等序
列化工具将获取的需要被保存的函数的上下文环境转换成预设格式的文件,预设格式的文
件即能够被外部数据库保存的文件格式的任意一种,例如数字、文本以及字符串等,本实施
方式对其不作具体限制。然后将保存为预设格式的文件存储到外部数据库中,数据库存储
方法为本领域技术人员所熟知,此处不再赘述。
例里面存在一个父实例,父实例也可以包含一些变量,这些变量对应的对象是函数对象,这
些函数对象的实例也需要一并保存。
方式来实现。
户定义的代码才能继续运行。具体地说,目标程序在执行时,会将保存的函数设置为事件,
该事件具有触发条件,触发条件可以从开发者提供的待持久化的程序中提取。当满足事件
的触发条件时,即可判断为需要恢复被保存的函数。
码生成一个函数对象,上述步骤亦称为现场编译。
运行该函数类,以生成一个函数对象,以上为生成一个函数对象的具体步骤。递归地执行上
述一个函数对象的生成步骤,直到需要被恢复的函数的上下文环境中的所有函数对象均被
重新生成。
函数,构造完成得到一个函数对象,在构造的过程中,函数对象的生成需要涉及到构造其他
的函数类时,则递归地执行上述函数对象的构造过程。
递给其一个实例作为参数,因此,就需要先恢复该实例,若在恢复该实例时,该实例的变量
为普通变量,则可以立刻恢复,若该实例的变量对应的是一个函数对象,则需要递归地创建
这个函数对象,以恢复该实例所引用的函数对象,直到所有需被恢复的函数对象均被重新
生成。
数的运行代码,然后初始化(即构造函数运行一遍),也就是声明一遍,就可使用动态语言进
行现场编译。
的上下文以及主程序里面的代码,编译这些代码,对上下文以及函数的代码进行初始化,以
完成现场编译,现场编译完之后,继续执行编译好的代码。
数里面定义了A函数,这样,A函数的上下文环境就包含Main函数的上下文环境,以及main函
数在执行时额外产生的上下文环境,这就是A函数的一个上下文环境。
保存的上下文环境以及运行代码,并进行现场编译得到可运行的持久化编译函数,继续执
行该可运行的持久化编译函数即可。持久化编译函数是指与开发人员编写的函数等价的,
但是自身具备闭包恢复过程的函数。因此,本发明通过存储函数及其闭包,并对函数进行现
场编译,从而使得函数式程序能够自动实现持久化,进而可以大大提高互联网应用的开发
效率,降低开发人员工作量以及出错率。
内;对算法中或者流程中添加无关紧要的修改或者引入无关紧要的设计,但不改变其算法
和流程的核心设计都在该专利的保护范围内。
指令,指令被至少一个处理器执行,以使至少一个处理器能够执行如第一实施方式所述的
函数程序持久化的方法。
设备、稳压器和功率管理电路等之类的各种其他电路连接在一起,这些都是本领域所公知
的,因此,本文不再对其进行进一步描述。总线接口在总线和收发机之间提供接口。收发机
可以是一个元件,也可以是多个元件,比如多个接收器和发送器,提供用于在传输介质上与
各种其他装置通信的单元。经处理器处理的数据通过天线在无线介质上进行传输,进一步,
天线还接收数据并将数据传送给处理器。
使用的数据。
得一个设备(可以是单片机,芯片等)或处理器(processor)执行本申请各个实施例所述方
法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read‑Only
Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程
序代码的介质。