函数程序持久化的方法、电子设备及存储介质转让专利

申请号 : CN201810174438.X

文献号 : CN108399068B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 刘诗聪武红华

申请人 : 上海赞控网络科技有限公司

摘要 :

本发明实施例涉及应用程序开发技术领域,公开了一种函数程序持久化的方法、电子设备及存储介质。本发明中,该方法包括:执行目标程序时,判断目标程序的函数是否需要被保存,若需要被保存,则保存需要被保存的函数的上下文环境及运行代码;其中,被保存的函数为具备闭包恢复过程的持久化编译函数;判断是否需要恢复被保存的函数,在需要恢复被保存的函数时,读取被保存的函数的上下文环境及运行代码,并对被保存的函数进行现场编译,得到可运行的持久化编译函数;执行可运行的持久化编译函数。本发明通过自动存储函数及其闭包变量并恢复函数及其闭包变量来达到函数式程序持久化的目的,从而可极大地提高互联网应用的开发效率、降低出错率。

权利要求 :

1.一种函数程序持久化的方法,其特征在于,包括:执行目标程序时,判断所述目标程序的函数是否需要被保存,若需要被保存,则保存所述需要被保存的函数的上下文环境及运行代码;其中,所述被保存的函数为具备闭包恢复过程的持久化编译函数;

判断是否需要恢复所述被保存的函数,在需要恢复所述被保存的函数时,读取所述被保存的函数的上下文环境及运行代码,并对所述被保存的函数进行现场编译,得到可运行的持久化编译函数;

执行所述可运行的持久化编译函数;

其中,对所述被保存的函数进行现场编译,得到可运行的持久化编译函数,具体包括:对需要被恢复的函数的运行代码进行编译得到用于生成函数对象的函数类;

将保存的上下文环境中的所述需要被恢复的函数的实例传递给所述函数类,并运行所述函数类,以生成一个函数对象;

递归地执行上述一个函数对象的生成步骤,直到所述需要被恢复的函数的上下文环境中的所有函数对象均被重新生成;

所述具备闭包恢复过程的持久化编译函数通过以下方式实现:通过预设的编译程序或预设编译器从待持久化的原程序中提取出所有函数以及各函数的闭包;

确定并记录所述各函数的上下文环境;

在各所述函数中写入用于恢复所述闭包的运行代码以生成所述持久化编译函数。

2.根据权利要求1所述的函数程序持久化的方法,其特征在于,所述需要被保存的函数的上下文环境具体包括:

需要被保存的函数的实例、所述需要被保存的函数的祖实例以及所述祖实例的运行代码。

3.根据权利要求2所述的函数程序持久化的方法,其特征在于,所述保存所述需要被保存的函数的上下文环境及运行代码,具体包括:获取所述需要被保存的函数的上下文环境及运行代码,并转换成预设格式的文件;

保存所述预设格式的文件。

4.根据权利要求3所述的函数程序持久化的方法,其特征在于,在所述保存所述需要被保存的函数的上下文环境及运行代码中,将需要被保存的函数的实例与需要被保存的函数对象一一对应关联。

5.根据权利要求1所述的函数程序持久化的方法,其特征在于,判断所述目标程序的函数是否需要被保存具体为:

若目标程序的函数被赋予所述目标程序中的变量,则判定所述目标程序的函数需要被保存。

6.一种电子设备,其特征在于,包括:至少一个处理器;以及,

与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行如权利要求1至5中任一所述的函数程序持久化的方法。

7.一种计算机可读存储介质,存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至5中任一项所述的函数程序持久化的方法。

说明书 :

函数程序持久化的方法、电子设备及存储介质

技术领域

[0001] 本发明实施例涉及应用程序开发技术领域,特别涉及一种函数程序持久化的方法、电子设备及存储介质。

背景技术

[0002] 程序运行状态持久化是互联网应用开发的关键问题。一般而言互联网应用都具有复杂的业务,具有多步交互,且一项业务可能会持续很长时间。这需要互联网应用能够做到
程序的持久化:如电商应用中,下单步骤会生成一个“订单”作为持久化的对象。持久化是将
程序数据在持久状态和瞬时状态间转换的机制。在目前所有程序设计语言所定义的程序
中,变量均属于瞬时状态,程序中断运行后该变量数据就会丢失,因而部分关键数据需要经
过持久化才能维持业务的正常运转。目前相关技术还都需要开发人员自行决定哪些数据需
要持久化。
[0003] 当前一些程序设计语言中已具备较为成熟的持久化方案,如Java的Hibernate组件,Python中的Pickle等;这些持久化方案通过显式地对该组件进行调用来将变量写入磁
盘或数据库中。虽然这些方案能够解决持久化问题,然而这些持久化方案会使得程序代码
多出来一些专门用于持久化的冗余代码,此外这些方案并不能帮助开发者判断何时应将变
量持久化,何时读出变量。因此这些方案虽然提供了持久化方案,但对于初级程序员而言极
容易误用,对于高级程序员而言又制约他们的开发效率。
[0004] 目前也有一些工具能够对程序代码自动产生持久化类。如JavaBeans、GreenDao等工具,能够根据数据库表自动创建类并交给程序员使用。这一工具解决了持久化组件的需
要手工操作编写的困难。这类工具在客户端上的应用较为流行。
[0005] 此外,在程序设计时时常需要对复杂的数据结构进行持久化。如多级嵌套、甚至包括循环引用的对象等。该情况是广泛存在的,如电商的店铺会对应若干商品,商品会对应买
家卖家用户,而卖家又对应店铺等。对于带循环引用的数据结构持久化,也是一个必需解决
的问题。目前的做法主要依靠手工设计数据库来实现,并通过外键进行关联。另外也有
circular‑json等可以解决循环引用的对象序列化方案从而可以对复杂对象持久化。
[0006] 发明人发现现有技术中至少存在如下问题:这些持久化类通过人工定义对象的字段来自动生成数据库表、数据库操作等。这些工具相当于一种对数据库的易用性封装。这些
工具虽然能够避免手工写数据库操作语句的工作,但仍然无法减轻开发者的劳动强度或降
低出错率。首先这些持久化类无法对函数进行持久化。其次持久化的时机、读数据库的时机
仍然要人工判断。对于复杂的服务端程序,一个业务流程会涉及到多段交互,因而需要多次
存储和还原程序运行状态的代码;何时持久化、何时解变量、是否应当进入下一步仍然需要
人工判断。自动产生持久化类的方案也只能是稍微减轻了开发者劳动量,并不能本质上解
决存储和还原程序运行状态的问题。
[0007] 数据库外键关联技术能够将具有复杂数据嵌套结构的变量以合理的方式存储在数据库中。当前流行的数据库都已经具备了外键关联技术。此外,诸如circular‑json、
serializer等序列化工具也具备一定的序列化。这些工具为储存复杂的程序运行状态提供
了良好的底层环境。这些序列化工具本质上仍然不能对函数进行持久化,因而也无法直接
解决存储和还原程序运行状态的问题。但是这些工具对于复杂对象嵌套的解析能力为对复
杂的程序运行时的变量进行解析和存储提供了良好的基础。

发明内容

[0008] 本发明实施方式的目的在于提供一种函数程序持久化的方法、电子设备及存储介质,通过自动存储函数及其闭包变量并恢复函数及其闭包变量来达到函数式程序持久化的
目的,从而使得开发者在基于函数式程序开发互联网应用时,无需手工进行持久化操作,可
极大地提高互联网应用的开发效率、降低出错率。
[0009] 为解决上述技术问题,本发明的实施方式提供了一种函数程序持久化的方法,包括:执行目标程序时,判断所述目标程序的函数是否需要被保存,若需要被保存,则保存所
述需要被保存的函数的上下文环境及运行代码;其中,所述被保存的函数为具备闭包恢复
过程的持久化编译函数;判断是否需要恢复所述被保存的函数,在需要恢复所述被保存的
函数时,读取所述被保存的函数的上下文环境及运行代码,并对所述被保存的函数进行现
场编译,得到可运行的持久化编译函数;执行所述可运行的持久化编译函数。
[0010] 本发明的实施方式还提供了一种电子设备,包括:至少一个处理器;以及,与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执
行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行如上
所述的函数程序持久化的方法。
[0011] 本发明的实施方式还提供了一种计算机可读存储介质,存储有计算机程序,所述计算机程序被处理器执行时实现如上所述的函数程序持久化的方法。
[0012] 本发明实施方式相对于现有技术而言,在执行目标程序时,当判断出目标程序中的函数需要被保存时,则保存该函数的上下文环境及运行代码,在需要恢复该函数时,读取
保存的上下文环境以及运行代码,并进行现场编译得到可运行的持久化编译函数,继续执
行该可运行的持久化编译函数即可。持久化编译函数是指与开发人员编写的函数等价的,
但是自身具备闭包恢复过程的函数。因此,本发明通过存储函数及其闭包,并对函数进行现
场编译,从而使得函数式程序能够自动实现持久化,进而可以大大提高互联网应用的开发
效率,降低开发人员工作量以及出错率。
[0013] 另外,对所述被保存的函数进行现场编译,得到可运行的持久化编译函数,具体包括:对需要被恢复的函数的运行代码进行编译得到用于生成函数对象的函数类;将保存的
上下文环境中的所述需要被恢复的函数的实例传递给所述函数类,并运行所述函数类,以
生成一个函数对象;递归地执行上述一个函数对象的生成步骤,直到所述需要被恢复的函
数的上下文环境中的所有函数对象均被重新生成,从而提供了一种现场编译的具体实现方
式。
[0014] 另外,所述具备闭包恢复过程的持久化编译函数通过以下方式实现:从待持久化的原程序中提取出所有函数以及各函数的闭包;确定并记录所述各函数的上下文环境;在
各所述函数中写入用于恢复所述闭包的运行代码以生成所述持久化编译函数,从而提供了
一种持久化编译函数的具体实现方式。
[0015] 另外,所述所述需要被保存的函数的上下文环境具体包括:需要被保存的函数的实例、所述需要被保存的函数的祖实例以及所述祖实例的运行代码,从而提供了一种函数
及其闭包的具体存储方式。
[0016] 另外,所述保存所述需要被保存的函数的上下文环境及运行代码,具体包括:获取所述需要被保存的函数的上下文环境及运行代码,并转换成预设格式的文件;保存所述预
设格式的文件。
[0017] 另外,在所述保存所述需要被保存的函数的上下文环境及运行代码中,将需要被保存的函数的实例与需要被保存的函数对象一一对应关联。
[0018] 另外,判断所述目标程序的函数是否需要被保存具体为:若目标程序的函数被赋予所述目标程序中的变量,则判定所述目标程序的函数需要被保存。

附图说明

[0019] 一个或多个实施例通过与之对应的附图中的图片进行示例性说明,这些示例性说明并不构成对实施例的限定,附图中具有相同参考数字标号的元件表示为类似的元件,除
非有特别申明,附图中的图不构成比例限制。
[0020] 图1是根据本发明第一实施方式函数程序持久化的方法的流程图。

具体实施方式

[0021] 为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合附图对本发明的各实施方式进行详细的阐述。然而,本领域的普通技术人员可以理解,在本发明各实施方
式中,为了使读者更好地理解本申请而提出了许多技术细节。但是,即使没有这些技术细节
和基于以下各实施方式的种种变化和修改,也可以实现本申请所要求保护的技术方案。
[0022] 函数式编程的开发效率较高,然而主流函数式编程工具在网络、多机交互等环境上只能传递普通对象而无法传递函数对象,因此函数式编程方法失效。针对现有函数式程
序持久化中存在的需要人工决定持久化哪些变量、指定持久化时机、编写准许重入判断、变
量恢复函数等的繁琐复杂操作,本发明通过自动生成持久化程序代码,使得函数对象能够
持久化并传递,从而使得函数式编程方法仍然有效,并且使得程序中断、升级后,原有业务
流程可以继续运行,因此能够提高开发效率。
[0023] 本发明的技术构思是:首先通过编译器将开发者给出的需要持久化运行的程序转义为通过本方案运行环境可执行的代码,然后将本方案运行环境和编译后的代码进一步和
开发者的其他程序组件混合,达到持久化运行的效果。如开发者在开发互联网App时,可用
本方案编写业务逻辑的处理程序,然后使用编译后的代码和通用的网络库对接,生成完整
的代码。
[0024] 本发明实施例中,实现持久化功能时包括以下组件:
[0025] 函数对象库:用于记录函数对象标识符、该函数对象对应的函数名称和对应的实例的外部数据库;
[0026] 运行实例库:用于记录实例对象标识符和储存的闭包的外部数据库;
[0027] 构造函数:构造实例对象时,需要给出父实例;
[0028] 储存的闭包:是一个键值对,代表一个函数所创建的临时变量和临时变量的值;
[0029] 获取闭包操作:对自身和祖实例(父实例和父实例的父实例等等)所储存的闭包进行合并操作,儿子实例所存储的闭包中包含的键值对能够覆盖掉祖实例所储存的闭包;
[0030] 存储闭包操作:提供一个键值对。自身和祖实例依次更新自身所对应的键值对并存储到运行实例库中。儿子实例存储过的键值对祖实例不再存储;
[0031] 事件库:储存何时应该调用哪个函数的哪个实例,并记录事件名称、触发条件、触发的函数对象标识符,函数对象所对应的实例对象标识符;
[0032] 运行环境:运行环境保持和外部数据库的连接并维护事件库和函数库。运行环境还每次执行一个函数对象,然后检查是否有事件被触发,或者程序需要关闭等。
[0033] 本发明的第一实施方式涉及一种函数程序持久化的方法,其包括:执行目标程序时,判断所述目标程序的函数是否需要被保存,若需要被保存,则保存需要被保存的函数的
上下文环境及运行代码,其中,被保存的函数为具备闭包恢复过程的持久化编译函数,判断
是否需要恢复被保存的函数,在需要恢复被保存的函数时,读取被保存的函数的上下文环
境及运行代码,并对被保存的函数进行现场编译,得到可运行的持久化编译函数,执行可运
行的持久化编译函数。本发明实施方式相对于现有技术而言,在执行目标程序时,当判断出
目标程序中的函数需要被保存时,则保存该函数的上下文环境及运行代码,在需要恢复该
函数时,读取保存的上下文环境以及运行代码,并进行现场编译得到可运行的持久化编译
函数,继续执行该可运行的持久化编译函数即可。持久化编译函数是指与开发人员编写的
函数等价的,但是自身具备闭包恢复过程的函数。因此,本发明通过存储函数及其闭包,并
对函数进行现场编译,从而使得函数式程序能够自动实现持久化,进而可以大大提高互联
网应用的开发效率,降低开发人员工作量以及出错率。下面对本实施方式的函数程序持久
化的方法的实现细节进行具体的说明,以下内容仅为方便理解提供的实现细节,并非实施
本方案的必须。
[0034] 请参阅图1,本实施方式中的函数程序持久化的方法包括步骤101至步骤105。
[0035] 步骤101:执行目标程序时,判断目标程序的函数是否需要被保存。如果目标程序的函数是否需要被保存,则执行步骤102,如果目标程序的函数不需要被保存,则返回执行
步骤101。
[0036] 目标程序初始化时,连接到事件库、函数库和实例库。然后进入循环,检查事件库是否有需要被触发的事件,如果有则触发该事件,否则进入休眠。
[0037] 其中,设置一个事件的步骤包括:程序代码提供一个事件名称、触发条件,以及函数,等到当前代码执行完毕,在事件库中记录事件名称、触发条件、函数对像对应的函数名
称和函数对象标识符。在实例库中保存该函数对象所对应的实例。
[0038] 触发一个事件的步骤包括:等待当前代码执行完毕,若事件库中某事件所记录的触发要求已满足,则执行以下步骤:根据对应的函数标识符,从函数库中找出该函数对象对
应的实例的实例标识符,根据实例标识符,从实例库中找到储存的闭包,以此生成一个实例
对象。根据函数对象记录的函数名称,从函数对象列表找到函数对象的构造方法,生成一个
函数对象。使用找到的实例对象作为对应的实例对象。调用该函数对象的执行方法。需要说
明的是,编译后的程序代码通过一个预先设定的函数使用该功能。
[0039] 目标程序在执行时,对目标程序的函数的类型进行判断,在该函数被赋予给目标程序中的某个变量时,则判定该函数需要被保存,否则,判定该函数无需被保存。本实施方
式对于目标程序的函数是否需要被保存的具体判断方式不作限制。
[0040] 步骤102:保存需要被保存的函数的上下文环境及运行代码。
[0041] 其中,被保存的函数为具备闭包恢复过程的持久化编译函数。通过编译器达到存储函数对象的目的,原理是:转码用户所编写的代码,使得每一个对上下文环境的修改都被
记录下来。具体地说:具备闭包恢复过程的持久化编译函数通过以下方式实现:从待持久化
的原程序中提取出所有函数以及各函数的闭包,确定并记录各函数的上下文环境,在各函
数中写入用于恢复闭包的运行代码以生成持久化编译函数。换句话说,即是对需要持久化
的程序做如下处理:获取需要持久化的程序,读取其中的每个函数,并找到每个函数的闭
包,并对其中的每个函数执行以下操作:通过预设编译程序(亦可称为预设编译器)编写一
个新函数,并对新函数的执行方法增加一个恢复闭包的过程。对于被定义在函数内的函数,
预设编译器会将其改写为对预设编译器编译出来的函数的创建。其中,待持久化的原程序
包括:变量以及函数。在函数式编程中,函数本身也是一种变量。一般而言,函数的运行不可
被打断,当事件触发完毕等待下一个事件时可以被打断。
[0042] 具体地说,由开发者提供编写好的函数式程序,函数式程序通常指通过函数式编程风格编写的事件化的程序。例如,如定义了“文件读完后”执行“A函数”即为一段函数式程
序。
[0043] 接下来,通过预设的编译程序对该函数式程序进行编译,在编译的过程中,首先提取出所有函数及其闭包,并由预设编译程序自动确定需要持久化的程序中的不同函数的上
下文环境,并对各函数的上下文环境与各函数的对应关系进行记录,然后由预设的编译程
序将各函数改写成新的对应的函数。改写后的函数与改写前的函数在功能上完全等价,但
是在改写的过程中,在各函数中写入了用于存储以及恢复该函数的代码,从而使得通过预
设编译程序编译后的函数成为可运行的持久化编译函数,在对需要持久化的程序中的所有
函数均完成编译之后,还需要将编译后的程序与外部数据库对接,例如与通用的网络库进
行对接,从而生成目标程序的完整的代码。
[0044] 其中,预设编译器对用户定义的函数的改写,主要就是让函数自己给自己一个标识符,另外就是把特定代码写在用户定义的函数里,特定代码用于把函数的上下文环境保
存下来。然后特定代码在存储和恢复时会循环执行。其中,执行特定代码的时候,若是用于
恢复,就恢复函数对象,恢复完成时,遇到定义的需要保存的函数对象,则会保存它。
[0045] 其中,预设编译器还用于确定用户定义的函数对象的上下文环境,然后给每个函数赋值标识符,并记录下来。只有经过预设编译器编译的函数才能够被持久化。
[0046] 下面对本实施例的持久化编译函数的生成过程详细说明如下:预设编译器获取用户定义的原程序,对原程序中出现的所有函数进行自动命名,对每个函数,生成一个新函
数,即对原函数进行重新改写,使得该函数的函数对象的构造函数接受一个实例标识符
(ID),并具有执行方法。对每个声明函数的语句,改写成使用当前函数上下文(函数实际运
行时才会被决定),对预设编译器新写的对应函数进行构造(例如在每个函数的开始位置增
加构造函数代码),构造函数的代码在函数运行时才会被执行。对每个函数调用的语句,改
写成对应函数对象的对执行方法的调用。生成一个函数对象列表,记录所有函数名称和函
数对象的构造方法的对应关系。其中,函数需要上下文才能执行。函数对象是将这些函数
“可执行化”。
[0047] 其中,构造函数在构造函数对象时,首先接受一个函数实例作为父实例并关联该实例,然后创造一个子实例作为该函数对象的运行实例。函数对象也记录了该函数对象所
对应的函数的函数名称。其中,函数是一段代码,但该代码在没有指定上下文(即父实例)时
不能运行。函数对象则具有上下文(父实例),可以运行。函数对象的“执行”(The execution 
of a function object)是实例。
[0048] 函数对象的执行方法首先对函数运行环境中出现的闭包变量进行初始化,并设置一个不会直接被函数代码所访问的“特殊变量”,使得生成的函数可以访问实例对象。然后
执行实际的函数代码。执行完毕后,检查所有闭包变量的更改并更新到该函数对象所对应
的运行实例库中。最后检查该函数对象所对应的运行实例是否还被其它函数对象或运行实
例所引用,若无引用则删除对应的运行实例。最后检查该函数对象是否还被其他实例所关
联或存在于其它实例的储存的闭包中,若无则删除该对象。删除函数对象时,递归地检查父
实例是否还被其它函数对象或运行实例引用,若无引用则删除该运行实例。
[0049] 步骤102中,需要被保存的函数的上下文环境具体包括需要被保存的函数的实例、需要被保存的函数的祖实例以及祖实例的运行代码。
[0050] 其中,存储一个函数对象的原理是:保存声明此函数时,正在运行的函数的实例,保存需要存储的函数的运行代码。即,保存需要被保存的函数的上下文环境及运行代码。具
体地说,保存函数对象包括:获取需要被保存的函数的上下文环境及运行代码,并转换成预
设格式的文件,保存预设格式的文件。其中,可以利用诸如circular‑json、serializer等序
列化工具将获取的需要被保存的函数的上下文环境转换成预设格式的文件,预设格式的文
件即能够被外部数据库保存的文件格式的任意一种,例如数字、文本以及字符串等,本实施
方式对其不作具体限制。然后将保存为预设格式的文件存储到外部数据库中,数据库存储
方法为本领域技术人员所熟知,此处不再赘述。
[0051] 本实施例中,需要被保存的函数的上下文环境是指恢复该函数时所需要的上下文环境。该上下文环境包括需要被保存的函数(亦可成当前函数)的实例,其中,当前函数的实
例里面存在一个父实例,父实例也可以包含一些变量,这些变量对应的对象是函数对象,这
些函数对象的实例也需要一并保存。
[0052] 需要说明的是,在保存函数的上下文环境时,需要将函数的函数对象与函数的实例一一对应关联起来,具体地,可以通过对函数对象以及函数的实例设置对应的标识符的
方式来实现。
[0053] 步骤103:判断是否需要恢复被保存的函数,在需要恢复被保存的函数时,则执行步骤104,否则返回步骤103。
[0054] 本实施例中,经过预设编译器编译后的所有函数均无法运行,只有在被触发时,函数对象才能运行,即目标程序执行时必须要触发一个事件,做一个恢复函数对象的操作,用
户定义的代码才能继续运行。具体地说,目标程序在执行时,会将保存的函数设置为事件,
该事件具有触发条件,触发条件可以从开发者提供的待持久化的程序中提取。当满足事件
的触发条件时,即可判断为需要恢复被保存的函数。
[0055] 步骤104:读取被保存的函数的上下文环境及运行代码,并对被保存的函数进行现场编译,得到可运行的持久化编译函数。
[0056] 其中,恢复一个函数对象的原理是:找到函数运行的上下文环境,读取函数运行的代码,执行一段程序(构造函数),这段程序在函数运行的上下文环境中,使用函数运行的代
码生成一个函数对象,上述步骤亦称为现场编译。
[0057] 具体而言,步骤104中,对需要被恢复的函数的运行代码进行编译得到用于生成函数对象的函数类,将保存的上下文环境中的需要被恢复的函数的实例传递给该函数类,并
运行该函数类,以生成一个函数对象,以上为生成一个函数对象的具体步骤。递归地执行上
述一个函数对象的生成步骤,直到需要被恢复的函数的上下文环境中的所有函数对象均被
重新生成。
[0058] 换句话说,在恢复函数对象时,从外部数据库读取出来的内容包括:实例以及函数的运行代码。先编译一个函数类,然后再把实例作为参数传递给函数类,执行函数类以构造
函数,构造完成得到一个函数对象,在构造的过程中,函数对象的生成需要涉及到构造其他
的函数类时,则递归地执行上述函数对象的构造过程。
[0059] 其中,读取的实例包括函数对象以及实例里的一些变量。读取出来的函数的运行代码为用于生成函数的函数,执行该生成函数的函数,在该生成函数的函数执行时,需要传
递给其一个实例作为参数,因此,就需要先恢复该实例,若在恢复该实例时,该实例的变量
为普通变量,则可以立刻恢复,若该实例的变量对应的是一个函数对象,则需要递归地创建
这个函数对象,以恢复该实例所引用的函数对象,直到所有需被恢复的函数对象均被重新
生成。
[0060] 本实施例中,现场编译的运行过程为:从外部数据库读取的一段代码(即用于生成函数的函数,亦可称为构造函数),该构造函数加载需要被恢复的函数的上下文,加载该函
数的运行代码,然后初始化(即构造函数运行一遍),也就是声明一遍,就可使用动态语言进
行现场编译。
[0061] 步骤105:执行可运行的持久化编译函数。
[0062] 其中,事件被触发时就需要恢复一个函数对象,该函数对象可以是用户定义的主程序,主程序也是一个函数,也会被持久化,执行主程序这个函数时,先找到主程序所对应
的上下文以及主程序里面的代码,编译这些代码,对上下文以及函数的代码进行初始化,以
完成现场编译,现场编译完之后,继续执行编译好的代码。
[0063] 在执行上述主程序时,若该主程序里面定义了若干个其他的函数,此时就涉及到存储函数对象。具体地,保存一下当前函数要运行的时候所需要的上下文,例如main()函
数里面定义了A函数,这样,A函数的上下文环境就包含Main函数的上下文环境,以及main函
数在执行时额外产生的上下文环境,这就是A函数的一个上下文环境。
[0064] 本发明实施方式相对于现有技术而言,在执行目标程序时,当判断出目标程序中的函数需要被保存时,则保存该函数的上下文环境及运行代码,在需要恢复该函数时,读取
保存的上下文环境以及运行代码,并进行现场编译得到可运行的持久化编译函数,继续执
行该可运行的持久化编译函数即可。持久化编译函数是指与开发人员编写的函数等价的,
但是自身具备闭包恢复过程的函数。因此,本发明通过存储函数及其闭包,并对函数进行现
场编译,从而使得函数式程序能够自动实现持久化,进而可以大大提高互联网应用的开发
效率,降低开发人员工作量以及出错率。
[0065] 上面各种方法的步骤划分,只是为了描述清楚,实现时可以合并为一个步骤或者对某些步骤进行拆分,分解为多个步骤,只要包括相同的逻辑关系,都在本专利的保护范围
内;对算法中或者流程中添加无关紧要的修改或者引入无关紧要的设计,但不改变其算法
和流程的核心设计都在该专利的保护范围内。
[0066] 本发明第二实施方式涉及一种电子设备。该电子设备包括:至少一个处理器,以及与该至少一个处理器通信连接的存储器,其中,存储器存储有可被至少一个处理器执行的
指令,指令被至少一个处理器执行,以使至少一个处理器能够执行如第一实施方式所述的
函数程序持久化的方法。
[0067] 其中,存储器和处理器采用总线方式连接,总线可以包括任意数量的互联的总线和桥,总线将一个或多个处理器和存储器的各种电路连接在一起。总线还可以将诸如外围
设备、稳压器和功率管理电路等之类的各种其他电路连接在一起,这些都是本领域所公知
的,因此,本文不再对其进行进一步描述。总线接口在总线和收发机之间提供接口。收发机
可以是一个元件,也可以是多个元件,比如多个接收器和发送器,提供用于在传输介质上与
各种其他装置通信的单元。经处理器处理的数据通过天线在无线介质上进行传输,进一步,
天线还接收数据并将数据传送给处理器。
[0068] 处理器负责管理总线和通常的处理,还可以提供各种功能,包括定时,外围接口,电压调节、电源管理以及其他控制功能。而存储器可以被用于存储处理器在执行操作时所
使用的数据。
[0069] 本发明第三实施方式涉及一种存储介质,存储有计算机程序。计算机程序被处理器执行时实现上述方法实施例。
[0070] 即,本领域技术人员可以理解,实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序存储在一个存储介质中,包括若干指令用以使
得一个设备(可以是单片机,芯片等)或处理器(processor)执行本申请各个实施例所述方
法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read‑Only 
Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程
序代码的介质。
[0071] 本领域的普通技术人员可以理解,上述各实施方式是实现本发明的具体实施例,而在实际应用中,可以在形式上和细节上对其作各种改变,而不偏离本发明的精神和范围。