代码热更新方法和装置、存储介质、处理器及终端与流程

文档序号:15201568发布日期:2018-08-19 12:47阅读:395来源:国知局

本发明涉及计算机领域,具体而言,涉及一种代码热更新方法和装置、存储介质、处理器及终端。



背景技术:

目前,对于非越狱的ios操作系统不允许数据段可执行权限,通常需要将c#代码转换为一种能够被arm(英文全称为advancedriscmachines)处理器高效解释运行的字节码,以达到通过解释器绕过ios操作系统的限制,实现c#代码的热更新。相关技术通常使用脚本语言lua实现c#代码的热更新,其中最具有代表性的方案是xlua,xlua为unity、.net、mono等c#环境增加lua脚本编程的能力。借助xlua,lua可以方便的和c#相互调用。但是,xlua方案存在以下缺点:

1、执行效率低下,lua使用动态类型而且几乎没有优化,并且lua与c#交互时需要转换类型。

2、开发成本高,开发人员需要同时编写lua和c#代码。

针对相关技术在对c#代码进行热更新时需要在c#代码与脚本语言lua间进行类型转换,导致执行效率较低的问题,目前尚未提出有效的解决方案。



技术实现要素:

本发明实施例提供了一种代码热更新方法和装置、存储介质、处理器及终端,以至少解决相关技术在对c#代码进行热更新时需要在c#代码与脚本语言lua间进行类型转换,导致执行效率较低的技术问题。

根据本发明实施例的一个方面,提供了一种代码热更新方法,包括:将待热更新的代码翻译成第一类型中间码,其中,所述第一类型中间码采用目标类型操作系统的编译器编译;将所述第一类型中间码翻译成待运行的字节码,其中,所述待运行的字节码采用所述目标类型操作系统的解释器解释运行;通过所述解释器解释运行所述待运行的字节码,以将所述待热更新的代码进行热更新。

进一步地,所述将所述第一类型中间码翻译成待运行的字节码包括:将所述第一类型中间码翻译成第一语言,其中,所述第一语言为c++语言的子集;将所述第一语言翻译成第二类型中间码,其中,所述第二类型中间码用于对所述第一语言进行优化;将所述第二类型中间码翻译成第二语言,其中,所述第二语言为中央处理器指令集的子集;将所述第二语言翻译成所述待运行的字节码。

进一步地,所述将待热更新的代码翻译成第一类型中间码包括:将所述待热更新的代码编译为第三类型中间码,其中,所述第三类型中间码为c#语言的中间码;将所述第三类型中间码翻译成第三语言,其中,所述第三语言为c++语言;将所述第三语言编译成所述第一类型中间码。

进一步地,在所述将待热更新的代码翻译成第一类型中间码之前,所述方法还包括:确定安装在所述目标类型操作系统中的待更新的目标应用;将所述待更新的目标应用的部分代码或者全部代码确定为所述待热更新的代码。

根据本发明实施例的另一方面,还提供了一种代码热更新装置,包括:第一翻译单元,用于将待热更新的代码翻译成第一类型中间码,其中,所述第一类型中间码采用目标类型操作系统的编译器编译;第二翻译单元,用于将所述第一类型中间码翻译成待运行的字节码,其中,所述待运行的字节码采用所述目标类型操作系统的解释器解释运行;热更新单元,用于通过所述解释器解释运行所述待运行的字节码,以将所述待热更新的代码进行热更新。

进一步地,所述第二翻译单元包括:第一翻译模块,用于将所述第一类型中间码翻译成第一语言,其中,所述第一语言为c++语言的子集;第二翻译模块,用于将所述第一语言翻译成第二类型中间码,其中,所述第二类型中间码用于对所述第一语言进行优化;第三翻译模块,用于将所述第二类型中间码翻译成第二语言,其中,所述第二语言为中央处理器指令集的子集;第四翻译模块,用于将所述第二语言翻译成所述待运行的字节码。

进一步地,所述第一翻译单元包括:第一编译模块,用于将所述待热更新的代码编译为第三类型中间码,其中,所述第三类型中间码为c#语言的中间码;第五翻译模块,用于将所述第三类型中间码翻译成第三语言,其中,所述第三语言为c++语言;第二编译模块,用于将所述第三语言编译成所述第一类型中间码。

进一步地,所述装置还包括:第一确定单元,用于在所述将待热更新的代码翻译成第一类型中间码之前,确定安装在所述目标类型操作系统中的待更新的目标应用;第二确定单元,用于将所述待更新的目标应用的部分代码或者全部代码确定为所述待热更新的代码。

根据本发明实施例的另一方面,还提供了一种存储介质,所述存储介质包括存储的程序,其中,所述程序运行时执行上述任一项所述的代码热更新方法。

根据本发明实施例的另一方面,还提供了一种处理器,所述处理器用于运行程序,其中,所述程序运行时执行上述任一项所述的代码热更新方法。

根据本发明实施例的另一方面,还提供了一种终端,包括存储器和处理器,其特征在于,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行上述任一项所述的代码热更新方法。

在本发明实施例中,通过将待热更新的代码翻译成第一类型中间码,其中,所述第一类型中间码采用目标类型操作系统的编译器编译;将所述第一类型中间码翻译成待运行的字节码,其中,所述待运行的字节码采用所述目标类型操作系统的解释器解释运行;通过所述解释器解释运行所述待运行的字节码,以将所述待热更新的代码进行热更新,达到了无需进行代码之间的转换亦可以快速实现代码热更新的目的,从而实现了提高代码热更新的效率的技术效果,进而解决了相关技术在对c#代码进行热更新时需要在c#代码与脚本语言lua间进行类型转换,导致执行效率较低的技术问题。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1是根据本发明实施例的代码热更新方法的流程图;

图2是根据本发明实施例的c#代码热更新的示意图;以及

图3是根据本发明实施例的代码热更新装置的示意图。

具体实施方式

为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。

需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

根据本发明实施例,提供了一种代码热更新的方法实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

图1是根据本发明实施例的代码热更新方法的流程图,如图1所示,该方法包括如下步骤:

步骤s102,将待热更新的代码翻译成第一类型中间码,其中,所述第一类型中间码采用目标类型操作系统的编译器编译;

步骤s104,将所述第一类型中间码翻译成待运行的字节码,其中,所述待运行的字节码采用所述目标类型操作系统的解释器解释运行;

步骤s106,通过所述解释器解释运行所述待运行的字节码,以将所述待热更新的代码进行热更新。

通过上述步骤,将待热更新的代码翻译成第一类型中间码,其中,所述第一类型中间码采用目标类型操作系统的编译器编译;将所述第一类型中间码翻译成待运行的字节码,其中,所述待运行的字节码采用所述目标类型操作系统的解释器解释运行;通过所述解释器解释运行所述待运行的字节码,以将所述待热更新的代码进行热更新,达到了无需进行代码之间的转换亦可以快速实现代码热更新的目的,从而实现了提高代码热更新的效率的技术效果,进而解决了相关技术在对c#代码进行热更新时需要在c#代码与脚本语言lua间进行类型转换,导致执行效率较低的技术问题。

在步骤s102提供的方案中,待热更新的代码可以为c#代码、c++代码、objective-c代码、swift代码、rust代码等,本发明实施例待热更新的代码的类型不做具体限定,此处本发明以待热更新的代码为c#代码为例进行说明。

需要说明的是,本发明实施例对待热更新的代码的获取方式不做具体限定。

可选地,在将待热更新的代码翻译成第一类型中间码之前,本发明实施例还可以首先获取待热更新的代码,可以包括以下步骤:

步骤s100,确定安装在目标类型操作系统中的待更新的目标应用;

步骤s101,将待更新的目标应用的部分代码或者全部代码确定为待热更新的代码。

针对上述步骤s100至步骤s101,需要说明的是,目标类型操作系统可以为ios操作系统、android操作系统、windows操作系统等,本发明实施例对目标类型操作系统不做具体限定,此处以目标类型操作系统为ios操作系统为例进行说明。还需要说明的是,目标类型操作系统中可以安装有至少一个应用,其中,本发明实施例对应用的类型不做具体限定,例如游戏应用、即时通信应用、浏览器应用等。至少一个应用中可以包括待更新的目标应用,其中,本发明实施例对待更新的目标应用的类型也不做具体限定,例如目标应用可以为游戏应用、即时通信应用、浏览器应用等。

可选地,对目标应用的更新可以包括但并不限于:对目标应用中的某一个或者多个逻辑功能进行更新、目标应用中增加某一个或者多个逻辑功能、目标应用中删除某一个或者多个逻辑功能等。

可选地,在确定待更新的目标应用之后,本发明实施例可以根据目标应用所需要更新的内容对应地将目标应用中的部分或者全部代码确定为待热更新的代码。例如,假设目标应用中只需要更新某一个逻辑功能,则可以将该需要更新的逻辑功能对应的代码确定为待热更新的代码。

通过步骤s100至步骤s101,本发明实施例可以实现获取到待热更新的代码的目的。在实际应用场景中,本发明实施例还可以采用其他方式获取到待热更新的代码,此处不再一一举例说明。

在获取到待热更新的代码之后,本发明实施例可以将待热更新的代码翻译成第一类型中间码,其中,第一类型中间码可以采用上述目标类型操作系统的编译器编译,例如目标类型操作系统为ios系统,则第一类型中间码可以为llvm(英文全称为lowlevelvirtualmachine,底层虚拟机)中间码。

可选地,步骤s102,将待热更新的代码翻译成第一类型中间码可以包括以下步骤:

步骤s1022,将所述待热更新的代码编译为第三类型中间码,其中,所述第三类型中间码为c#语言的中间码;

步骤s1024,将所述第三类型中间码翻译成第三语言,其中,所述第三语言为c++语言;

步骤s1026,将所述第三语言编译成所述第一类型中间码。

需要说明的是,通过上述步骤s1022至步骤s1026,可以实现将待热更新的代码翻译成第一类型中间码的目的。

在一种可选的示例中,待热更新的代码可以为c#代码,本发明实施例可以利用c#语言的编译器mono将c#语言编译为c#语言的中间码il(也即第三类型中间码);然后,本发明实施例可以利用il2cpp将il翻译成c++98(也即第三语言);然后,本发明实施例可以利用c++编译器clang将c++98编译成llvm中间码(也即第一类型中间码)。

需要说明的是,在上述可选示例中所使用的编译工具并不仅限于上述的举例,本发明还可以采用其他编译工具,此处不再一一举例说明。还需要说明的是,将c#代码翻译成llvm中间码还可以通过其他方式,此处也不再一一举例说明。

本发明实施例通过将待热更新的代码翻译成采用目标类型操作系统的编译器编译的第一类型中间码,可以实现对待热更新的代码进行编译的目的。

在步骤s104提供的方案中,在将待热更新的代码翻译成第一类型中间码之后,本发明实施例可以将得到的第一类型中间码翻译成待运行的字节码,其中,该待运行的字节码可以采用上述目标类型操作系统的解释器解释运行,以便于通过解释器解释运行该待运行的字节码实现对待热更新的代码进行热更新。

可选地,步骤s104将第一类型中间码翻译成待运行的字节码可以包括以下步骤:

步骤s1042,将第一类型中间码翻译成第一语言,其中,第一语言为c++语言的子集;

步骤s1044,将第一语言翻译成第二类型中间码,其中,第二类型中间码用于对第一语言进行优化;

步骤s1046,将第二类型中间码翻译成第二语言,其中,第二语言为中央处理器指令集的子集;

步骤s1048,将第二语言翻译成待运行的字节码。

需要说明的是,通过上述步骤s1042至步骤s1048,可以实现将第一类型中间码翻译成待运行的字节码的目的。

在一种可选的示例中,待热更新的代码可以为c#代码,通过上述步骤s102可以将c#代码翻译成llvm中间码。然后,本发明实施例可以将llvm中间码翻译成第一语言,其中,第一语言可以为c++语言的子集,也就是说,第一语言可以为c++语言的简化版,因此可以使用标准的c++编译器进行编译,例如vc++、g++、clang等。将llvm中间码翻译成第一语言,原因是llvm中间码并不是一个适合直接解释的语言。然后,本发明实施例可以将第一语言翻译成第二类型中间码,可选地,第二类型中间码可以为lisp(计算机程序设计语言)中间码,其中,lisp中间码可以用于优化第一语言,可以包括但并不限于:限制第一语言的文本大小;提高第一语言的代码执行速度。然后,本发明实施例可以将lisp中间码翻译成第二语言,其中,第二语言可以为x64的子集,其中,x64可以为底层中央处理器cpu指令集,第二语言可以为x64的简化版。然后,本发明实施例可以将第二语言翻译成待运行的字节码bytecode,其中,该待运行的字节码bytecode可以采用ios操作系统的解释器interpreter解释运行,以实现c#代码的热更新。

需要说明的是,在上述可选示例中所使用的编译工具并不仅限于上述的举例,本发明还可以采用其他编译工具,此处不再一一举例说明。还需要说明的是,将llvm中间码翻译成待运行的字节码bytecode还可以通过其他方式,此处也不再一一举例说明。

本发明实施例通过将待热更新的代码翻译成采用目标类型操作系统的编译器编译的第一类型中间码,然后再将第一类型中间码翻译成采用目标类型操作系统的解释器解释运行的待运行的字节码,以便于通过解释器解释运行该待运行的字节码实现对待热更新的代码进行热更新的目的。

在步骤s106提供的方案中,在得到待运行的字节码之后,本发明实施例可以通过目标类型操作系统中的解释器解释运行该待运行的字节码,以实现将待热更新的代码进行热更新。

在一种可选的示例中,待热更新的代码可以为c#代码,通过上述步骤s102可以将c#代码翻译成llvm中间码;通过上述步骤s104可以将llvm中间码翻译成待运行的字节码bytecode;然后通过解释器interpreter解释运行待运行的字节码bytecode,以实现c#代码的热更新。

本发明实施例可以应用于对c#代码进行热更新的场景中。

图2是根据本发明实施例的c#代码热更新过程的示意图,如图2所示,为了实现c#代码的热更新,本发明实施例可以使用c#语言的编译器mono将c#语言编译为c#语言的中间码il;然后利用il2cpp将il翻译成c++98;然后利用c++编译器clang将c++98翻译成llvm;然后将llvm翻译成c++的简化版,此处称为c++light(相当于上述实施例中的第一语言),其中,c++light可以为c++语言的子集,因此可以使用标准的c++编译器进行编译,例如vc++、g++、clang等。将llvm翻译成c++light,原因是llvm并不是一个适合直接解释的语言;然后可以将c++light翻译成lisp,其中,lisp可以用于优化第一语言;然后将lisp翻译成x64的简化版,此处称为x64light;然后将x64light翻译成待运行的字节码bytecode;最后通过解释器interpreter解释运行bytecode,以实现c#代码的热更新。

通过上述一系列编译和翻译实现了c#代码的解释运行,也即实现了c#代码的热更新。

需要说明的是,本发明可以兼容c++98和c++11,同时也可以兼容c#2.0,c#3.0及c#4.0。因为本发明对llvm进行了完全的翻译,所以无论什么版本的语言,只要能翻译成llvm,本发明的解释器就可以运行它,也就可以实现c#代码的热更新。

本发明的核心是实现了一套完整的解释器,并将c#代码通过一系列的翻译转换,得到一个便于arm高效执行的字节码,通过解释器解释运行,由此实现c#代码的热更新。

本发明具有以下优点:

1、性能高,本发明没有动态内存分配,可以使用静态类型,支持跨语言函数接口(foreignfunctioninterface,简称为ffi),即一个语言调用另一种语言的接口,又可通过llvm进行各种优化。

2、一致性高,本发明只使用c#语言,没有使用第二种语言。

根据本发明实施例,还提供了一种代码热更新装置的装置实施例,需要说明的是,该代码热更新装置可以用于执行本发明实施例中的代码热更新方法,也即本发明实施例中的代码热更新方法可以在该代码热更新装置中执行。

图3是根据本发明实施例的代码热更新装置的示意图,如图3所示,该代码热更新装置可以包括:

第一翻译单元32,用于将待热更新的代码翻译成第一类型中间码,其中,第一类型中间码采用目标类型操作系统的编译器编译;第二翻译单元34,用于将第一类型中间码翻译成待运行的字节码,其中,待运行的字节码采用目标类型操作系统的解释器解释运行;热更新单元36,用于通过解释器解释运行待运行的字节码,以将待热更新的代码进行热更新。

需要说明的是,该实施例中的第一翻译单元32可以用于执行本发明实施例中的步骤s102,该实施例中的第二翻译单元34可以用于执行本发明实施例中的步骤s104,该实施例中的热更新单元36可以用于执行本发明实施例中的步骤s106。上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例所公开的内容。

可选地,第二翻译单元34可以包括:第一翻译模块342,用于将第一类型中间码翻译成第一语言,其中,第一语言为c++语言的子集;第二翻译模块344,用于将第一语言翻译成第二类型中间码,其中,第二类型中间码用于对第一语言进行优化;第三翻译模块346,用于将第二类型中间码翻译成第二语言,其中,第二语言为中央处理器指令集的子集;第四翻译模块348,用于将第二语言翻译成待运行的字节码。

需要说明的是,该实施例中的第一翻译模块342可以用于执行本发明实施例中的步骤s1042,该实施例中的第二翻译模块344可以用于执行本发明实施例中的步骤s1044,该实施例中的第三翻译模块346可以用于执行本发明实施例中的步骤s1046,该实施例中的第四翻译模块348可以用于执行本发明实施例中的步骤s1048。上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例所公开的内容。

可选地,第一翻译单元32可以包括:第一编译模块322,用于将待热更新的代码编译为第三类型中间码,其中,第三类型中间码为c#语言的中间码;第五翻译模块324,用于将第三类型中间码翻译成第三语言,其中,第三语言为c++语言;第二编译模块326,用于将第三语言翻译成第一类型中间码。

需要说明的是,该实施例中的第一编译模块322可以用于执行本发明实施例中的步骤s1022,该实施例中的第五翻译模块324可以用于执行本发明实施例中的步骤s1024,该实施例中的第二编译模块326可以用于执行本发明实施例中的步骤s1026。上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例所公开的内容。

可选地,代码热更新装置还可以包括:第一确定单元30,用于在将待热更新的代码翻译成第一类型中间码之前,确定安装在目标类型操作系统中的待更新的目标应用;第二确定单元31,用于将待更新的目标应用的部分代码或者全部代码确定为待热更新的代码。

需要说明的是,该实施例中的第一确定单元30可以用于执行本发明实施例中的步骤s100,该实施例中的第二确定单元31可以用于执行本发明实施例中的步骤s101。上述模块与对应的步骤所实现的示例和应用场景相同,但不限于上述实施例所公开的内容。

为了实现上述目的,根据本发明的另一方面,本发明实施例还提供了一种存储介质,所述存储介质包括存储的程序,其中,在所述程序运行时控制所述存储介质所在设备执行上述所述的代码热更新方法。

为了实现上述目的,根据本发明的另一方面,本发明实施例还提供了一种处理器,所述处理器用于运行程序,其中,所述程序运行时执行上述所述的代码热更新方法。

为了实现上述目的,根据本发明的另一方面,本发明实施例还提供了一种终端,包括存储器和处理器,其中,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行上述所述的代码热更新方法。

上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。

在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。

在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1