一种编译方法、装置、设备及系统
技术领域
本申请涉及计算机技术领域,尤其涉及一种编译方法、装置、设备及系统。
背景技术
随着近年来互联网的快速发展,为了满足人们日常生活的各种需求,各种类型的应用程序也越来越多。例如,导航类应用程序,视频类应用程序、购物类应用程序和游戏类应用程序。这些应用程序的使用即为人们生活提供了便利性,又丰富了人们的娱乐生活。
应用程序在运行之前,需要先在编译器中进行编译,由源程序转变成计算机可以识别的目标程序,计算机再根据转变的目标程序运行该应用程序。
目前,传统的编译器编译出的目标程序易于分析,根据编译出的目标程序可以很容易的反推出源程序,对抗逆向工程性差。
发明内容
有鉴于此,本申请实施例提供了一种编译方法、装置、设备及系统,用于提高编译器编译出的目标程序的抗逆向工程性。
为解决上述技术问题,本说明书实施例是这样实现的:
本说明书实施例提供的一种编译方法,包括:
获取源程序;
将所述源程序进行编译,得到第一中间代码;
根据预存的标识符将所述第一中间代码进行拆分,得到第一代码和第二代码;
根据解码对应关系表对所述第二代码进行编译处理,得到指令字节码;
根据所述解码对应关系表生成解释器;
将所述第一代码、所述解释器和所述指令字节码合并,得到目标程序。
本说明书实施例提供的一种运行方法,包括:
获取目标程序,所述目标程序包括目标子程序和解释器;
若所述目标子程序为指令字节码,调用所述解释器解释所述指令字节码,得到第二代码;
运行所述第二代码。
本说明书实施例提供的一种编译装置,包括:
第一获取模块,用于获取源程序;
第一编译模块,用于将所述源程序进行编译,得到第一中间代码;
拆分模块,用于根据预存的标识符将所述第一中间代码进行拆分,得到第一代码和第二代码;
第二编译模块,用于根据解码对应关系表对所述第二代码进行编译处理,得到指令字节码;
生成模块,用于根据所述解码对应关系表生成解释器;
合并模块,用于将所述第一代码、所述解释器和所述指令字节码合并,得到目标程序。
本说明书实施例提供的一种运行装置,包括:
第二获取模块,用于获取目标程序,所述目标程序包括目标子程序和解释器;
解释模块,用于若所述目标子程序为指令字节码,调用所述解释器解释所述指令字节码,得到第二代码;
运行模块,用于运行所述第二代码。
本说明书实施例提供的一种编译设备,包括:
至少一个处理器;以及,
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够:
获取源程序;
将所述源程序进行编译,得到第一中间代码;
根据预存的标识符将所述第一中间代码进行拆分,得到第一代码和第二代码;
根据解码对应关系表对所述第二代码进行编译处理,得到指令字节码;
根据所述解码对应关系表生成解释器;
将所述第一代码、所述解释器和所述指令字节码合并,得到目标程序。
本说明书实施例提供的一种运行设备,包括:
至少一个处理器;以及,
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够:
获取目标程序,所述目标程序包括目标子程序和解释器;
若所述目标子程序为指令字节码,调用所述解释器解释所述指令字节码,得到第二代码;
运行所述第二代码。
本说明书实施例提供的一种编译系统,包括:
多个应用服务器、至少一个集中缓存服务器,和数据库;所述多个应用服务器分别与所述集中缓存服务器连接;所述集中缓存服务器与所述数据库相连;
所述应用服务器,用于获取源程序;
将所述源程序进行编译,得到第一中间代码;
根据预存的标识符将所述第一中间代码进行拆分,得到第一代码和第二代码;
根据解码对应关系表对所述第二代码进行编译处理,得到指令字节码;
根据所述解码对应关系表生成解释器;
将所述第一代码、所述解释器和所述指令字节码合并,得到目标程序。
本说明书实施例提供的一种运行系统,包括:
多个应用服务器、至少一个集中缓存服务器,和数据库;所述多个应用服务器分别与所述集中缓存服务器连接;所述集中缓存服务器与所述数据库相连;
所述应用服务器,用于获取目标程序,所述目标程序包括目标子程序和解释器;
若所述目标子程序为指令字节码,调用所述解释器解释所述指令字节码,得到第二代码;
运行所述第二代码。
本说明书实施例采用的上述至少一个技术方案能够达到以下有益效果:采用上述方案后,能将源程序编译出的中间代码进行拆分,得到第一代码和第二代码,再将第二代码进行编译形成指令字节码,然后将第一代码与指令字节码和生成的用于解释指令字节码的解释器合并得到目标程序,形成的目标程序不易于分析,根据编译出的目标程序不易反推出源程序,对抗逆向工程性强。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1为本说明书实施例提供的一种编译方法的流程示意图;
图2为本说明书实施例提供的一种解释器解释指令字节码的流程示意图;
图3为本说明书实施例中一种编译方法的原理示意图;
图4为本说明书实施例提供的一种运行方法的流程示意图;
图5为本说明书实施例提供的对应于图1的一种编译装置的结构示意图;
图6为本说明书实施例提供的对应于图4的一种运行装置的结构示意图;
图7为本说明书实施例提供的对应于图1的一种编译设备的结构示意图和对应于图4的一种运行设备的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
应用程序在运行之前,需要先在编译器中进行编译,由源程序转变成计算机可以识别的目标程序,计算机再根据转变出的目标程序运行该应用程序。
在传统的编译过程中,将源程序编译成目标程序的工作过程分为五个阶段:词法分析、语法分析、语义检查、中间代码生成和代码优化。主要是进行词法分析和语法分析,分析过程中发现有语法错误,给出提示信息。中间代码生成之后,进行代码优化最终生成目标程序。
逆向工程是根据已有的东西和结果,通过分析来推导出具体的实现方法。例如,你看到某个目标程序能够做出漂亮的动画效果,你通过反编译的方法,分析出其动画效果的实现过程,得到源程序,这种行为就是逆向工程。
利用传统的编译器编译出的目标程序易于分析,即易于反编译出源程序,对抗逆向工程性差。
以下结合附图,详细说明本申请各实施例提供的技术方案。
图1为本说明书实施例提供的一种编译方法的流程示意图。从程序角度而言,流程的执行主体可以为编译器,具体可以包括:
步骤S101:获取源程序。
步骤S102:将所述源程序进行编译,得到第一中间代码。
具体的,编译器首先获取待编译的源程序。源程序是指未经编译的,按照一定的程序设计语言规范书写的,人类可读的文本文件,通常由高级语言编写。例如,常见的高级语言有Object Pascal、C、C#、Java、ASP和PHP等。
将获取的源程序进行词法分析、语法分析和语义检查,得到第一中间代码(IR,Intermediate,Representation)。
步骤S103:根据预存的标识符将所述第一中间代码进行拆分,得到第一代码和第二代码。
在第一中间代码中,有一个标识属性。编译器根据标识属性对第一中间代码进行拆分,得到第一代码和第二代码。例如,标识属性为A,编译器根据A将第一中间代码进行拆分,有属性A的归为第一代码,没有属性A的归为第二代码。
其中,第一中间代码是一种规范化的表达,比源代码要干净纯粹,对第一中间代码的任何修改,都非常的方便和稳定。且第一中间代码具备前端语言无关性,无论是C、C++或PHP等哪种高级语言编写的源程序,都会被统一的先转化为第一中间代码,然后在第一中间代码的基础上建立的技术,可以不费成本,均可以支持上述的高级语言。因此,在第一中间代码的基础上进行拆分,得到第一代码和第二代码,即方便后续编译处理,又可以提高程序的稳定性。
步骤S104:根据解码对应关系表对所述第二代码进行编译处理,得到指令字节码。
其中,解码对应关系表为映射表,映射表为使用包含两个地址空间的地址之间的相互映射关系的表格。该映射表可以为编译器自动生成的,也可以为预先存储在编译器中的。
编译器根据映射表对第二代码进行交叉编译处理,得到指令字节码。指令字节码可以为包含执行程序、由一序列代码或数据对组成的二进制文件。字节码是一种中间码,它比机器码更抽象。可以被看作是包含一个执行程序的二进制文件。
步骤S105:根据所述解码对应关系表生成解释器。
其中,根据上述生成的解码对应关系表生成用于解释指令字节码的解释器。解释器可以解释指令字节码。
步骤S106:将所述第一代码、所述解释器和所述指令字节码合并,得到目标程序。
如图2所示,为本说明书实施例提供的一种解释器解释指令字节码的流程示意图,具体可以包括:
步骤S201:解释器取码。
步骤S202:取得指令字节码后,根据解码对应关系表解释指令字节码。
步骤S203:然后模拟执行解释完的指令字节码。
步骤S204:执行完毕后,继续取码,循环进行。
步骤S205:直至取码完成正常退出循环。
步骤S206:若在解释指令字节码或者模拟执行解释完的指令字节码过程中出错,则报错,然后异常退出循环。
因为指令字节码为模拟执行的,因此还可以称为虚拟机指令字节码。解释器可以称为虚拟机解释器。
采用上述方案后,能将源程序编译出的中间代码进行拆分,得到第一代码和第二代码,再将第二代码进行编译形成指令字节码,然后将第一代码与指令字节码和生成的用于解释指令字节码的解释器合并得到目标程序,形成的目标程序不易于分析,根据编译出的目标程序不易反推出源程序,对抗逆向工程性强。
在一个具体实施方式中,假设有函数f,函数f的具体定义为:
functionf(i){
return(((i*3)^2)+1);
}
该函数f为本实施例中的源程序。
然后,将函数f进行编译,得到第一中间代码。
define i32@f(i32){
%2=mul i32%0,3
%3=xor i32%2,2
%4=add i32%3,1
ret i32%4
}
然后,再将第一中间代码进行拆分,得到第一代码:%2=mul i32%0,3和第二代码:
%3=xor i32%2,2
%4=add i32%3,1
ret i32%4
然后,根据解码对应关系表对第二代码进行编译处理,得到指令字节码:
vm_mov$r0,%arg
vm_xor$r0,$r0,#2
vm_add$r0,$r0,#1
vm_ret$r0
其二进制形式为:
0x82,0x14,0x08,0x03,0x51,0x18,0x07,0x92;
再根据解码对应关系表生成解释器,可以定义一个解释器函数interprete:
然后,删除函数f的函数体,新增调用指令到解释器函数,将函数f的虚拟指令作为输入数据
最后,可以将所述第一代码、所述解释器和所述指令字节码合并,得到目标程序:
该实施方式在运行时,遇到第一代码%2=mul i32%0.3,则直接运行。遇到指令字节码,需要调用解释器interperte对指令字节码进行解释,解释完成后再运行。
在一个具体实施方式中,所述根据所述解码对应关系表生成解释器,具体包括:
获取所述解码对应关系表中的字节对应关系。
根据所述字节对应关系确定对应于所述解码对应关系表的解释器。
具体的,解码对应关系表为一个映射表,存储着字节之间的对应关系。例如,在映射表中,A对应B,根据该对应关系生成解释器,当解释器遇到B时,即将B解释成A。
在一个具体实施方式中,所述根据解码对应关系表对所述第二代码进行编译处理,得到指令字节码,具体包括:
获取所述解码对应关系表中的字节对应关系。
根据所述字节对应关系确定对应于所述解码对应关系表的指令字节码。
同上,具体的,解码对应关系表为一个映射表,存储着字节之间的对应关系。例如,在映射表中,A对应B,根据该对应关系生成指令字节码,即将A转换成B。
在一个具体实施方式中,在所述根据解码对应关系表对所述第二代码进行编译处理,得到指令字节码之前,还包括:
根据预设的关系表生成算法动态生成所述解码对应关系表。
具体的,解码对应关系表可以为动态生成的,在每次编译的过程中,都会动态生成一张解码对应关系表。即每次生成的解释器和指令字节码也是不同的,增大了他人反编译的难度,增强了最终生成的目标代码的对抗逆向工程性。
其中,关系表生成算法可以为现有的算法,例如,可以为洗牌算法,其他的能动态生成解码对应关系表的算法也在本申请的保护范围内。
在一个具体实施方式中,在所述根据预存的标识符将所述第一中间代码进行拆分,得到第一代码和第二代码之后,还包括:
将所述第二代码进行拆分,得到第三代码和第四代码。
根据第一解码对应关系表对所述第三代码进行编译处理,得到第一指令字节码。
根据所述第一解码对应关系表生成第一解释器。
根据第二解码对应关系表对所述第四代码进行编译处理,得到第二指令字节码。
根据所述第二解码对应关系表生成第二解释器。
将所述第一代码、所述第一指令字节码、所述第一解释器、所述第二指令字节码和所述第二解释器合并,得到目标程序。
具体的,在对第二代码进行处理时,可以将第二代码作为一个整体进行处理。也可以将第二代码继续进行拆分,对拆分出来的代码分别进行编译处理。继续进行拆分的数量不限,可以为两个,三个或更多。对拆分出来的代码分别根据对应的解码对应关系进行编译处理形成指令字节码,再根据对应的解码对应关系表生成解释器,每部分的解释器与指令字节码相对应。将第二代码拆分成两部分,就会生成两组解释器和对应的指令字节码。将第二代码拆分成三部分,就会生成三组解释器和对应的指令字节码。增大了他人反编译的难度,增强了最终生成的目标代码的对抗逆向工程性。
如图3所示,为本说明书实施例中一种编译方法的原理示意图,具体可以包括:
获取源程序301。
将所述源程序301进行编译,得到第一中间代码302。
根据预存的标识符将所述第一中间代码302进行拆分,得到第一代码303和第二代码304。
根据解码对应关系表对所述第二代码304进行编译处理,得到指令字节码305。
根据所述解码对应关系表生成解释器306。
将所述第一代码303与所述解释器306进行合并,得到第二中间代码307。
将所述第二中间代码307和所述指令字节码305合并,得到目标程序308。
采用上述方案后,能将源程序编译出的中间代码进行拆分,得到第一代码和第二代码,再将第二代码进行编译形成指令字节码,然后将第一代码与指令字节码和生成的用于解释指令字节码的解释器合并得到目标程序,形成的目标程序不易于分析,根据编译出的目标程序不易反推出源程序,对抗逆向工程性强。
且本实施例先将第一代码与解释器进行合并,得到第二中间代码,再将第二中间代码与指令字节码合并,得到目标程序,使得目标程序内部分类更加明确清楚,增强了代码的规范性。
图4为本说明书实施例提供的一种运行方法的流程示意图,从程序角度而言,流程的执行主体可以为主机(host),具体可以包括:
步骤S401:获取目标程序,所述目标程序包括目标子程序和解释器。
步骤S402:若所述目标子程序为指令字节码,调用所述解释器解释所述指令字节码,得到第二代码。
步骤S403:运行所述第二代码。
此外,在另一个具体实施例中,所述方法还可以包括:
若所述目标子程序为第一代码,则直接运行所述第一代码。
其中,目标子程序可以包括第一代码和指令字节码,主机在运行目标子程序时,若遇到第一代码,则直接运行。若遇到指令字节码,则将控制器转移至编译器。编译器能根据解码对应关系表将第二代码编译成指令字节码,解释器可以根据同一张解码对应关系表解释编译出的指令字节码,得到第二代码。得到的第二代码是可以直接运行的,然后再模拟运行第二代码,运行完第二代码后,会根据运行结果进行状态的转换,例如,可以将文件由关闭状态转换到打开状态。状态转换完成后,继续读取指令字节码循环进行,直至指令字节码读取完成正常退出。若在中间过程出错,也会报错,然后异常退出。执行完成后,控制权转移回主机。
基于同样的思路,本说明书实施例还提供了上述方法对应的装置。图5为本说明书实施例提供的对应于图1的一种编译装置的结构示意图。如图5所示,该装置可以包括:
第一获取模块501,用于获取源程序。
第一编译模块502,用于将所述源程序进行编译,得到第一中间代码。
拆分模块503,用于根据预存的标识符将所述第一中间代码进行拆分,得到第一代码和第二代码。
第二编译模块504,用于根据解码对应关系表对所述第二代码进行编译处理,得到指令字节码。
生成模块505,用于根据所述解码对应关系表生成解释器。
合并模块506,用于将所述第一代码、所述解释器和所述指令字节码合并,得到目标程序。
采用上述方案后,能将源程序编译出的中间代码进行拆分,得到第一代码和第二代码,再将第二代码进行编译形成指令字节码,然后将第一代码与指令字节码和生成的用于解释指令字节码的解释器合并得到目标程序,形成的目标程序不易于分析,根据编译出的目标程序不易反推出源程序,对抗逆向工程性强。
在一个具体实施方式中,所述生成模块,具体可以包括:
关系获取单元,用于获取所述解码对应关系表中的字节对应关系。
解释器确定单元,用于根据所述字节对应关系确定对应于所述解码对应关系表的解释器。
在一个具体实施方式中,所述第二编译模块,具体可以包括:
关系获取单元,用于获取所述解码对应关系表中的字节对应关系。
字节码确定单元,用于根据所述字节对应关系确定对应于所述解码对应关系表的指令字节码。
在一个具体实施方式中,在所述第二编译模块之前,还可以包括:
动态生成模块,用于根据预设的关系表生成算法动态生成所述解码对应关系表。
在一个具体实施方式中,在所述拆分模块之后,还可以包括:
代码生成模块,用于将所述第二代码进行拆分,得到第三代码和第四代码。
第一得到模块,用于根据第一解码对应关系表对所述第三代码进行编译处理,得到第一指令字节码。
第一解释器生成模块,用于根据所述第一解码对应关系表生成第一解释器。
第二得到模块,用于根据第二解码对应关系表对所述第四代码进行编译处理,得到第二指令字节码。
第二解释器生成模块,用于根据所述第二解码对应关系表生成第二解释器。
第一目标程序得到模块,用于将所述第一代码、所述第一指令字节码、所述第一解释器、所述第二指令字节码和所述第二解释器合并,得到目标程序。
在一个具体实施方式中,在所述生成模块之后,还可以包括:
第二代码生成模块,用于将所述第一代码与所述解释器进行合并形成,得到第二中间代码。
第二目标程序得到模块,用于将所述第二中间代码和所述指令字节码合并,得到目标程序。
图6为本说明书实施例提供的对应于图4的一种运行装置的结构示意图。如图6所示,该装置可以包括:
第二获取模块601,用于获取目标程序,所述目标程序包括目标子程序和解释器。
解释模块602,用于若所述目标子程序为指令字节码,调用所述解释器解释所述指令字节码,得到第二代码。
运行模块603,用于运行所述第二代码。
在一个具体实施方式中,所述装置还可以包括:
第一代码运行模块,用于若所述目标子程序为第一代码,则直接运行所述第一代码。
基于同样的思路,本说明书实施例还提供了上述方法对应的设备。
图7为本说明书实施例提供的对应于图1的一种编译设备的结构示意图和对应于图4的一种运行设备的结构示意图,如图7所示,设备700可以包括:
至少一个处理器710;以及,
与所述至少一个处理器通信连接的存储器730;其中,
所述存储器730存储有可被所述至少一个处理器710执行的指令720。
对应于图1,所述指令被所述至少一个处理器710执行,以使所述至少一个处理器710能够:
获取源程序。
将所述源程序进行编译,得到第一中间代码。
根据预存的标识符将所述第一中间代码进行拆分,得到第一代码和第二代码。
根据解码对应关系表对所述第二代码进行编译处理,得到指令字节码。
根据所述解码对应关系表生成解释器。
将所述第一代码、所述解释器和所述指令字节码合并,得到目标程序。
对应于图4,所述指令被所述至少一个处理器710执行,以使所述至少一个处理器710能够:
获取目标程序,所述目标程序包括目标子程序和解释器。
若所述目标子程序为指令字节码,调用所述解释器解释所述指令字节码,得到第二代码。
运行所述第二代码。
基于同样的思路,本说明书实施例还提供了上述方法对应的系统。该系统可以包括:
多个应用服务器、至少一个集中缓存服务器,和数据库;所述多个应用服务器分别与所述集中缓存服务器连接;所述集中缓存服务器与所述数据库相连;
对应于图1,所述应用服务器,用于获取源程序。
将所述源程序进行编译,得到第一中间代码。
根据预存的标识符将所述第一中间代码进行拆分,得到第一代码和第二代码。
根据解码对应关系表对所述第二代码进行编译处理,得到指令字节码。
根据所述解码对应关系表生成解释器。
将所述第一代码、所述解释器和所述指令字节码合并,得到目标程序。
对应于图4,所述应用服务器,用于获取目标程序,所述目标程序包括目标子程序和解释器。
若所述目标子程序为指令字节码,调用所述解释器解释所述指令字节码,得到第二代码。
运行所述第二代码。
在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(Programmable Logic Device,PLD)(例如现场可编程门阵列(Field Programmable GateArray,FPGA))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片PLD上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logic compiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(Hardware Description Language,HDL),而HDL也并非仅有一种,而是有许多种,如ABEL(Advanced Boolean Expression Language)、AHDL(Altera Hardware DescriptionLanguage)、Confluence、CUPL(Cornell UniversityProgramming Language)、HDCal、JHDL(Java Hardware Description Language)、Lava、Lola、MyHDL、PALASM、RHDL(RubyHardware Description Language)等,目前最普遍使用的是VHDL(Very-High-SpeedIntegrated Circuit Hardware Description Language)与Verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。
控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(Application Specific Integrated Circuit,ASIC)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:ARC 625D、AtmelAT91SAM、Microchip PIC18F26K20以及Silicone Labs C8051F320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。