CN103412754A - 动态语言代码执行方法和装置 - Google Patents
动态语言代码执行方法和装置 Download PDFInfo
- Publication number
- CN103412754A CN103412754A CN2013103571912A CN201310357191A CN103412754A CN 103412754 A CN103412754 A CN 103412754A CN 2013103571912 A CN2013103571912 A CN 2013103571912A CN 201310357191 A CN201310357191 A CN 201310357191A CN 103412754 A CN103412754 A CN 103412754A
- Authority
- CN
- China
- Prior art keywords
- code
- language code
- dynamic language
- buffer memory
- bytecode
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44568—Immediately runnable code
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
本发明公开了一种动态语言代码执行方法和装置。该动态语言代码执行方法包括:在动态语言代码执行时,缓存动态语言代码执行时生成的代码,得到动态语言代码的缓存代码;在动态语言代码再次执行时,获取动态语言代码的缓存代码并在动态语言代码的缓存代码的基础上执行动态语言代码。通过本发明,降低了动态语言代码的执行开销。
Description
技术领域
本发明涉及移动通信技术领域,具体而言,涉及一种动态语言代码执行方法和装置。
背景技术
浏览器在执行动态语言代码,例如脚本语言JS(JavaScript)代码时,需要将文本格式的JS文件或代码进行分析处理,生成相应的语法分析树,并进一步生成相应的字节码,以及通过JIT(也即,即时编译技术,是指在运行阶段把字节码翻译成原生代码,然后直接执行生成的原生代码的一种优化技术)方式生成原生代码。发明人发现,由于生成字节码或生成原生代码会存在比较大的开销,因而,每次重复执行这个过程会引起不必要的开销,例如,在浏览器加载HTML5应用过程来说,每次重复执行这个过程会引起不必要的开销。
针对现有技术中动态语言代码执行时开销比较大的问题,目前尚未提出有效的解决方案。
发明内容
本发明的主要目的在于提供一种动态语言代码执行方法和装置,以解决现有技术中动态语言代码执行时开销比较大的问题。
为了实现上述目的,根据本发明的一个方面,提供了一种动态语言代码执行方法。该方法包括:在动态语言代码执行时,缓存动态语言代码执行时生成的代码,得到动态语言代码的缓存代码;以及在动态语言代码再次执行时,获取动态语言代码的缓存代码并在动态语言代码的缓存代码的基础上执行动态语言代码。
进一步地,在动态语言代码执行时,缓存动态语言代码执行时生成的代码,得到动态语言代码的缓存代码的步骤包括:在动态语言代码执行时,缓存动态语言代码执行时生成的字节码,并将字节码作为动态语言代码的缓存代码。在动态语言代码再次执行时,获取动态语言代码的缓存代码并在动态语言代码的缓存代码的基础上执行动态语言代码的步骤包括:在动态语言代码再次执行时,获取字节码,并将字节码转换为原生代码;通过执行原生代码执行动态语言代码。
进一步地,缓存动态语言代码执行时生成的字节码的步骤包括:建立字节码缓存哈希表;将动态语言代码执行时生成的字节码缓存到字节码缓存哈希表中,其中,缓存字节码时,将动态语言代码的标识对缓存的字节码进行标识。获取字节码的步骤包括:通过动态语言代码的标识获取动态语言代码对应的字节码。
进一步地,在动态语言代码执行时,缓存动态语言代码执行时生成的代码,得到动态语言代码的缓存代码的步骤包括:在动态语言代码执行时,缓存动态语言代码执行时生成的原生代码,并将原生代码作为缓存代码。在动态语言代码再次执行时,获取动态语言代码的缓存代码并在动态语言代码的缓存代码的基础上执行动态语言代码的步骤包括:在动态语言代码再次执行时,获取原生代码,通过执行原生代码执行动态语言代码。
进一步地,缓存动态语言代码执行时生成的原生代码的步骤包括:建立原生代码缓存哈希表;将动态语言代码执行时生成的原生代码缓存到原生代码缓存哈希表中,其中,缓存原生代码时,将动态语言代码的标识对缓存的原生代码进行标识。获取原生代码的步骤包括:通过动态语言代码的标识获取动态语言代码对应的原生代码。
进一步地,在动态语言代码执行之前,该动态语言代码执行方法还包括:判断是否存在动态语言代码的缓存代码;其中,如果确定存在动态语言代码的缓存代码,则在缓存代码的基础上执行动态语言代码;如果确定不存在动态语言代码的缓存代码,则获取动态语言代码执行时生成的动态语言代码的缓存代码,并将生成的缓存代码添加到缓存中。
为了实现上述目的,根据本发明的另一方面,提供了一种动态语言代码执行装置。该装置包括:缓存单元,用于在动态语言代码执行时,缓存动态语言代码执行时生成的代码,得到动态语言代码的缓存代码;执行单元,用于在动态语言代码再次执行时,获取动态语言代码的缓存代码并在动态语言代码的缓存代码的基础上执行动态语言代码。
进一步地,缓存单元用于在动态语言代码执行时,缓存动态语言代码执行时生成的字节码,并将字节码作为动态语言代码的缓存代码;执行单元用于将字节码转换为原生代码;通过执行原生代码执行动态语言代码。
进一步地,缓存单元用于采用以下方式缓存动态语言代码执行时生成的字节码:建立字节码缓存哈希表,将动态语言代码执行时生成的字节码缓存到字节码缓存哈希表中,其中,缓存字节码时,将动态语言代码的标识对缓存的字节码进行标识。执行单元用于采用以下方式获取字节码:通过动态语言代码的标识获取动态语言代码对应的字节码。
进一步地,缓存单元用于在动态语言代码执行时,缓存动态语言代码执行时生成的原生代码,并将原生代码作为缓存代码,执行单元用于通过执行原生代码执行动态语言代码。
进一步地,缓存单元用于采用以下方式缓存动态语言代码执行时生成的原生代码:建立原生代码缓存哈希表,将动态语言代码执行时生成的原生代码缓存到原生代码缓存哈希表中,其中,缓存原生代码时,将动态语言代码的标识对缓存的原生代码进行标识。执行单元用于采用以下方式获取原生代码:通过动态语言代码的标识获取动态语言代码对应的原生代码。
进一步地,动态语言代码执行装置还包括:判断单元,用于在动态语言代码执行之前,判断是否存在动态语言代码的缓存代码,其中,执行单元用于在确定存在动态语言代码的缓存代码时,在缓存代码的基础上执行动态语言代码,缓存单元用于在确定不存在动态语言代码的缓存代码时,获取动态语言代码执行时生成的动态语言代码的缓存代码,并将生成的缓存代码添加到缓存中。
通过本发明,由于在动态语言代码执行时,对动态语言代码执行时生成的代码进行了缓存,得到了动态语言代码的缓存代码,并且在动态语言代码再次执行时,直接获取动态语言代码的缓存代码并在动态语言代码的缓存代码的基础上执行动态语言代码,从而可以不必在动态语言代码的基础上重复执行代码生成的步骤,解决了现有技术中动态语言代码执行时开销比较大的问题,进而达到了降低动态语言代码执行开销的效果。
附图说明
构成本申请的一部分的附图用来提供对本发明的进一步理解,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是根据本发明第一实施例的动态语言代码执行装置的示意图;
图2是根据本发明第二实施例的动态语言代码执行装置的示意图;
图3是根据本发明第一实施例的动态语言代码执行方法的流程图;以及
图4是根据本发明实施例的脚本语言JS代码执行方法的流程图。
具体实施方式
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本发明。
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“包括”以及他的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
本发明实施例提供了一种动态语言代码执行装置,该动态语言代码执行装置用于执行动态语言代码。
图1是根据本发明第一实施例的动态语言代码执行装置的示意图。
如图1所示,该动态语言代码执行装置包括缓存单元10和执行单元20。
缓存单元10用于在动态语言代码执行时,缓存所述动态语言代码执行时生成的代码,得到所述动态语言代码的缓存代码。需要说明的是,本发明的动态语言是指在运行时程序结构可以改变(如:在运行时新的函数可以被引进、已有的函数可以被删除等程序结构的改变)的编程语言。例如JS脚本语言、Ruby(面向对象程序设计)语言和Python(面向对象、直译式计算机程序设计语言)等都是动态语言。以下在本发明实施例中,以JS脚本语言代码作为动态语言代码的例子进行描述。在需要执行JS脚本语言代码时,缓存单元10可以缓存该JS脚本语言代码执行时生成的代码,从而得到该JS脚本语言代码的缓存代码。缓存代码可以是字节码,也可以是原生代码。在执行JS脚本语言代码时,通过对JS脚本语言代码进行分析处理,生成相应的语法分析树,并进一步生成相应的字节码,以及通过JIT方式生成原生代码,此时,缓存单元10可以缓存生成的字节码,也可以缓存生成的原生代码。
执行单元20用于在动态语言代码再次执行时,获取该动态语言代码的缓存代码并在该动态语言代码的缓存代码的基础上执行该动态语言代码。执行单元20可以从缓存单元10中获取该动态语言代码在之前执行时缓存到缓存单元10中的缓存代码,并在该缓存代码的基础上执行该动态语言代码。例如,在JS脚本语言代码再次执行时,如果缓存单元10中缓存的是JS脚本语言代码的字节码,执行单元20可以从缓存单元10中获取JS脚本语言代码在之前执行时缓存到缓存单元10中的字节码,并将字节码转换成原生代码,通过执行原生代码来执行JS脚本语言代码,此时,省略了字节码的生成处理过程,节省了系统开销。或者,如果缓存单元10中缓存的是JS脚本语言代码的原生代码,在JS脚本语言代码再次执行时,由执行单元20从缓存单元10中获取JS脚本语言代码在之前执行时缓存到缓存单元10中的原生代码,通过执行原生代码来执行JS脚本语言代码,这样,不仅省略了字节码的生成处理过程,而且省略了原生代码的生成处理过程,进一步节省了系统开销。
可选地,在本发明实施例的动态语言代码执行装置中,在动态语言代码执行时,缓存单元10可以缓存动态语言代码执行时生成的字节码,并将字节码作为动态语言代码的缓存代码。在该动态语言代码再次执行时,执行单元20可以将缓存在缓存单元10中的该字节码转换为原生代码,通过执行该原生代码执行该动态语言代码。例如,在JS脚本语言代码执行时,缓存单元10可以缓存该JS脚本语言代码执行时生成的字节码,并将字节码作为动态语言代码的缓存代码。在该JS脚本语言代码再次执行时,执行单元20可以将缓存在缓存单元10中的该JS脚本语言代码的字节码转换为原生代码,通过执行该原生代码执行该JS脚本语言代码。
在本发明实施例的动态语言代码执行装置中,缓存单元10可以是字节码缓存哈希表。字节码缓存哈希表可以缓存动态语言代码执行时生成的字节码。在将动态语言代码执行时生成的字节码缓存到字节码缓存哈希表中时,可以通过该动态语言代码的标识对缓存的字节码进行标识。动态语言代码的标识可以是动态语言代码的文件名,因此字节码可以根据该动态语言代码的文件名进行标识。这样,在该动态语言代码再次执行时,执行单元20可以通过该动态语言代码的标识获取该动态语言代码对应的字节码。
例如,JS脚本语言代码的文件名可以是document.url+index的形式,因此,在将该JS脚本语言代码执行时生成的字节码缓存到字节码缓存哈希表中时,可以通过该JS脚本语言代码的文件名document.url+index生成的字节码关键字对缓存的对应的字节码进行标识。这样,在该JS脚本语言代码再次执行时,执行单元20可以通过该JS脚本语言代码的文件名document.url+index生成的字节码关键字获取该JS脚本语言代码对应的字节码。
可选地,在本发明实施例的动态语言代码执行装置中,缓存单元10也可以缓存原生代码。在动态语言代码执行时,缓存单元10可以缓存动态语言代码执行时生成的原生代码,并将原生代码作为动态语言代码的缓存代码。在该动态语言代码再次执行时,执行单元20可以直接获取缓存在缓存单元10中的该原生代码,通过执行该原生代码执行该动态语言代码。例如,在JS脚本语言代码执行时,缓存单元10可以缓存该JS脚本语言代码执行时生成的原生代码,并将原生代码作为动态语言代码的缓存代码。在该JS脚本语言代码再次执行时,执行单元20可以直接获取缓存在缓存单元10中的该JS脚本语言代码的原生代码,通过执行该原生代码执行该JS脚本语言代码。
在本发明实施例的动态语言代码执行装置中,缓存单元10可以是原生代码缓存哈希表。原生代码缓存哈希表可以缓存动态语言代码执行时生成的原生代码。在将动态语言代码执行时生成的原生代码缓存到原生代码缓存哈希表中时,可以通过该动态语言代码的标识对缓存的字节码进行标识。动态语言代码的标识可以是动态语言代码的文件名,因此原生代码可以根据该动态语言代码的文件名进行标识。这样,在该动态语言代码再次执行时,执行单元20可以通过该动态语言代码的标识获取该动态语言代码对应的原生代码。
例如,JS脚本语言代码的文件名可以是document.url+index的形式,因此,在将该JS脚本语言代码执行时生成的原生代码缓存到原生代码缓存哈希表中时,可以通过该JS脚本语言代码的文件名document.url+index生成的原生代码关键字对缓存的对应的原生代码进行标识。这样,在该JS脚本语言代码再次执行时,执行单元20可以通过该JS脚本语言代码的文件名document.url+index生成的原生代码关键字获取该JS脚本语言代码对应的原生代码。
图2是根据本发明第二实施例的动态语言代码执行装置的示意图。该实施例可以作为图1所示实施例的一种优选实施方式。
如图2所示,该动态语言代码执行装置包括缓存单元10、执行单元20和判断单元30。
缓存单元10、执行单元20的作用与图1所示实施例中的缓存单元10、执行单元20的作用相同,在此不再赘述。
判断单元30用于在动态语言代码执行之前,判断是否存在该动态语言代码的缓存代码。具体地,判断单元30可以根据该动态语言代码的标识判断缓存单元10中是否存在该动态语言代码对应的缓存代码。
例如,判断单元30可以根据该动态语言代码的标识生成的字节码关键字判断缓存单元10中是否存在该动态语言代码对应的字节码;判断单元30也可以根据该动态语言代码的标识生成的原生代码关键字判断缓存单元10中是否存在该动态语言代码对应的原生代码;判断单元30还可以根据该动态语言代码的标识生成的字节码关键字和原生代码关键字判断缓存单元10中是否同时存在该动态语言代码对应的字节码和原生代码。
在确定存在动态语言代码的缓存代码时,执行单元20可以在缓存代码的基础上执行动态语言代码。
例如,在确定存在该动态语言代码的字节码时,执行单元20可以将字节码转换成原生代码,通过执行原生代码执行该动态语言代码;在确定存在该动态语言代码的原生代码时,执行单元20可以在执行原生代码以执行该动态语言代码。
在确定不存在动态语言代码的缓存代码时,生成动态语言代码的缓存代码,缓存单元10可以缓存生成的缓存代码。具体地,在确定不存在动态语言代码的缓存代码时,可以将文本格式的JS文件或代码进行分析处理以生成相应的语法分析树,并进一步生成相应的字节码,以及通过JIT方式生成原生代码,在生成字节码和原生代码后,缓存单元10可以缓存生成的字节码和原生代码以更新缓存单元10。
这样,在本发明实施例的动态语言代码执行装置中,在该动态语言代码再次执行时,可以根据该动态语言代码的标识生成的字节码关键字将缓存单元10中缓存的该动态语言代码对应的字节码转换成原生代码,通过执行原生代码执行该动态语言代码以降低动态语言代码的执行开销。在该动态语言代码再次执行时,也可以根据该动态语言代码的标识生成的原生代码关键字获取缓存单元10中缓存的该动态语言代码对应的原生代码,通过执行原生代码执行该动态语言代码以降低动态语言代码的执行开销。
本发明实施例提供了一种动态语言代码执行方法,用于执行动态语言代码。
需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
本发明实施例还提供了一种动态语言代码执行方法,该动态语言代码执行方法可以通过本发明实施例提供的动态语言代码执行装置来执行,本发明实施例的动态语言代码执行装置也可以用于执行本发明实施例提供的动态语言代码执行方法。
图3是根据本发明第一实施例的动态语言代码执行方法的流程图。如图3所示,该实施例的动态语言代码执行方法包括以下步骤:
步骤S101,在动态语言代码执行时,缓存动态语言代码执行时生成的代码,得到动态语言代码的缓存代码。
在本发明实施例中,动态语言代码可以是JS脚本语言代码。在需要执行JS脚本语言代码时,可以缓存该JS脚本语言代码执行时生成的代码,从而得到该JS脚本语言代码的缓存代码。具体地,在JS脚本语言代码执行时,通过将文本格式的JS文件或代码进行分析处理,生成相应的语法分析树,并进一步生成相应的字节码,以及通过JIT方式生成原生代码。因此,可以缓存该JS脚本语言代码执行时生成的字节码,从而得到该JS脚本语言代码的缓存代码为字节码;也可以缓存该JS脚本语言代码执行时生成的原生代码,从而得到该JS脚本语言代码的缓存代码为原生代码;还可以缓存该JS脚本语言代码执行时生成的字节码和原生代码,从而得到该JS脚本语言代码的缓存代码为字节码和原生代码。
在本发明实施例中,为了缓存动态语言代码执行时生成的字节码,可以首先建立字节码缓存哈希表,这样,缓存动态语言代码执行时生成的字节码可以是在字节码缓存哈希表中缓存动态语言代码执行时生成的字节码。将动态语言代码执行时生成的字节码缓存到字节码缓存哈希表中时,可以根据动态语言代码的标识对缓存的字节码进行标识。例如,可以根据该动态语言代码的文件名生成的字节码关键字对该字节码进行标识。
在本发明实施例中,为了缓存动态语言代码执行时生成的原生代码,可以首先建立原生代码缓存哈希表,这样,缓存动态语言代码执行时生成的原生代码可以是在原生代码缓存哈希表中缓存动态语言代码执行时生成的原生代码,即,将动态语言代码执行时生成的原生代码缓存到原生代码缓存哈希表中。将动态语言代码执行时生成的原生代码缓存到原生代码缓存哈希表中时,可以根据动态语言代码的标识对缓存的原生代码进行标识。例如,可以根据该动态语言代码的文件名生成的原生代码关键字对该原生代码进行标识。
步骤S102,在动态语言代码再次执行时,获取动态语言代码的缓存代码并在动态语言代码的缓存代码的基础上执行动态语言代码。
在本发明实施例中,在动态语言代码再次执行时,可以获取该动态语言代码的缓存代码并在该动态语言代码的缓存代码的基础上执行该动态语言代码。具体地,可以获取该动态语言代码在之前执行时缓存的字节码,并在该字节码码的基础上执行该动态语言代码,也可以获取该动态语言代码在之前执行时缓存的原生代码,并在该原生代码的基础上执行该动态语言代码,也可以获取该动态语言代码在之前执行时缓存的字节码和原生代码,并在该字节码和原生代码的基础上执行该动态语言代码。
例如,在JS脚本语言代码再次执行时,可以获取该JS脚本语言代码在之前执行时缓存的字节码,并将该字节码转换成原生代码,通过执行原生代码执行JS脚本语言代码;也可以获取JS脚本语言代码在之前执行时缓存的原生代码,并将JS脚本语言代码生成字节码,通过执行该字节码对应的缓存的原生代码执行JS脚本语言代码;还可以获取JS脚本语言代码在之前执行时缓存的字节码和原生代码,通过执行缓存的原生代码执行JS脚本语言代码。
在本发明实施例中,获取动态语言代码的缓存代码可以包括通过动态语言代码的标识生成的字节码关键字获取动态语言代码对应的缓存的字节码;获取动态语言代码的缓存代码也可以包括通过动态语言代码的标识生成的原生代码关键字获取动态语言代码对应的缓存的原生代码,获取动态语言代码的缓存代码还可以包括通过动态语言代码的标识生成的字节码关键字获取动态语言代码对应的缓存的字节码和原生代码关键字获取动态语言代码对应的缓存的原生代码。
这样,通过执行该字节码和该原生代码来执行该动态语言代码,降低了动态语言代码的执行开销。
在本发明实施例中,在动态语言代码执行之前,该动态语言代码执行方法还可以包括判断是否存在动态语言代码的缓存代码。如果确定存在动态语言代码的缓存代码,则在缓存代码的基础上执行动态语言代码;如果确定不存在动态语言代码的缓存代码,则获取所述动态语言代码执行时生成的动态语言代码的缓存代码,并将生成的缓存代码添加到缓存中。
具体地,在动态语言代码执行之前,可以根据该动态语言代码的标识(如文件名等)生成的字节码关键字判断是否存在动态语言代码对应的缓存的字节码,如果确定存在动态语言代码对应的缓存的字节码,则可以将该字节码转化成原生代码,通过执行原生代码来执行动态语言代码。在动态语言代码执行之前,也可以根据该动态语言代码的标识(如文件名等)生成的原生代码关键字判断是否存在动态语言代码对应的缓存的原生代码,如果确定存在动态语言代码对应的缓存的原生代码,则可以通过执行原生代码来执行动态语言代码。如果确定不存在动态语言代码对应的缓存的字节码和对应的缓存的原生代码,则可以在执行该动态语言代码时生成对应的字节码和对应的原生代码,并可以将该生成的对应的字节码和对应的原生代码添加到缓存中,例如,可以分别添加到字节码缓存哈希表中和原生代码缓存哈希表中。
这样,该动态语言代码再次执行时,可以通过执行缓存的字节码或者缓存的原生代码以及同时执行缓存的字节码和缓存的原生代码来执行该动态语言代码以降低该动态语言代码的执行开销。
图4是根据本发明实施例的JS脚本语言代码执行方法的流程图。该实施例的JS脚本语言代码执行方法可以作为图4所示实施例的一种优选实施方式,其中的特征可以与图3所示实施例中的特征相结合。
如图4所示,该实施例的JS脚本语言代码执行方法包括以下步骤:
步骤S401,获取JS脚本语言代码执行请求。
在接收到JS脚本语言代码执行请求之后,确定需要执行JS脚本语言代码。
步骤S402,初始化字节码缓存哈希表。
该字节码缓存哈希表可以为前述实施例中的字节码缓存哈希表,用于缓存执行过程中生成的字节码。
对于初始化字节码缓存哈希表,可以是为字节码缓存哈希表赋予一定的数值,使得字节码缓存哈希表可以基于赋予的数值对应的存储空间进一步存储字节码,对于初始化,还可以是清空字节码缓存哈希表中之前存储的字节码。
步骤S403,初始化原生代码缓存哈希表。
该原生代码缓存哈希表可以为前述实施例中的原生代码缓存哈希表,用于缓存执行过程中生成的原生代码。
对于初始化原生代码缓存哈希表,可以是为原生代码缓存哈希表赋予一定的数值,使得原生代码缓存哈希表可以基于赋予的数值对应的存储空间进一步存储原生代码,对于初始化,还可以是清空原生代码缓存哈希表中之前存储的字节码。
步骤S404,判断是否可使用字节码缓存。
JS脚本语言代码的文件名可以是document.url+index,以document.url+index作为该JS脚本语言代码的标识。Hash Key1是可以是根据JS脚本语言代码的文件名document.url+index生成的字节码关键字,Hash Key1可以标识该JS脚本语言代码。Hash Value1可以标识该JS脚本语言代码编译后生成的对应的字节码。
对于判断是否可使用字节码缓存,可以根据该Hash Key1在字节码缓存哈希表中查找是否存在Hash Key1对应的Hash Value1字节码,如果存在Hash Key1对应的HashValue1字节码,则说明可以使用字节码缓存,如果不存在Hash Key1对应的Hash Value1字节码,则说明不可以使用字节码缓存。经过判断,如果确定不可使用字节码缓存,则执行步骤S405A1;如果确定可使用字节码缓存,则执行步骤S405B。
步骤S405A1,加载JS脚本语言代码。
步骤S405A2,编译JS脚本语言代码为字节码。
在编译JS脚本语言代码为字节码之前,可以先对编译JS脚本语言代码进行分析处理,生成相应的语法分析树,再进一步生成相应的字节码。
步骤S405A3,缓存字节码。
需要说明的是,在本发明实施例中,JS脚本语言代码可以使用字节码缓存的条件可以包括JS脚本语言代码可以使用HTTP缓存和JS脚本语言代码对应的字节码在字节码缓存哈希表中没有对应的记录。
在本发明实施例中,可以通过建立字节码缓存哈希表的方式缓存字节码。缓存在字节码缓存哈希表中的字节码可以通过JS脚本语言代码的标识进行标记,例如,可以通过Hash Value1进行标记。
在本发明实施例中,缓存字节码可以对当前应用固定的内部JS脚本语言代码和外部JS脚本语言代码进行缓存。缓存字节码也可以对一些常用的JS脚本语言框架代码进行缓存,这样,可以达到跨应用缓存的目的。
步骤S405A4,更新字节码缓存哈希表中对应的记录。
在本发明实施例中,可以将该JS脚本语言代码的字节码缓存到字节码缓存哈希表中以更新该字节码缓存哈希表中缓存的字节码记录。在该JS脚本语言代码再次执行时,可以不经过分析和编译过程,直接通过该JS脚本语言代码的标识从该字节码缓存哈希表中获取该JS脚本语言代码对应的字节码,并将该字节码转化成原生代码,通过执行原生代码以执行该JS脚本语言代码,从而可以提高执行效率,进而可以降低JS脚本语言代码的执行开销。
步骤S405B,从字节码缓存哈希表中获取JS脚本语言代码对应的字节码缓存。
如果根据该JS脚本语言代码的标识可以在字节码缓存哈希表中查找到该JS脚本语言代码对应的缓存的字节码,则可以直接从字节码缓存哈希表中获取该JS脚本语言代码对应的字节码。
步骤S406,判断是否可使用原生代码缓存。
在JIT调用时,字节码在被转换成原生代码之前,先在原生代码缓存哈希表中查找是否存在该字节码对应的缓存的原生代码。
JS脚本语言代码的文件名可以是document.url+index,以document.url+index作为该JS脚本语言代码的标识。根据上述步骤的描述,Hash Key2可以是根据字节码的地址生成的原生代码关键字,可以标识字节码,此处的Hash Key2可以为步骤S404中的Hash Value1。Hash Value2可以标识该该字节码转换后对应的原生代码。
对于判断是否可使用原生代码缓存,可以根据该Hash Key2在原生代码缓存哈希表中查找是否存在Hash Value2对应的缓存的原生代码,如果原生代码缓存哈希表中存在Hash Value2对应的缓存的原生代码,则说明可以使用原生代码缓存,如果原生代码缓存哈希表中不存在Hash Value2对应的缓存的原生代码,则说明不可以使用原生代码缓存。经过判断,如果确定不可使用原生代码缓存,则执行步骤S407A1;如果确定可使用原生代码缓存,则执行步骤S407B。
步骤S407A1,转换字节码为原生代码。
步骤S407A2,缓存原生代码。
可以通过建立原生代码缓存哈希表的方式缓存原生代码。缓存在原生代码缓存哈希表中的原生代码可以通过JS脚本语言代码的标识进行标记。例如,可以通过HashValue2进行标记。
在本发明实施例中,可以对当前应用的所有热点代码的原生代码进行缓存。
步骤S407A3,更新原生代码缓存哈希表中对应的记录。
在本发明实施例中,可以将该JS脚本语言代码的原生代码缓存到原生代码缓存哈希表中以更新该原生代码缓存哈希表中缓存的原生代码记录。这样,在该JS脚本语言代码再次执行时,可以通过该JS脚本语言代码的标识从该原生代码缓存哈希表中获取该JS脚本语言代码对应的原生代码,通过执行该原生代码以执行该JS脚本语言代码,从而可以提高执行效率,进而可以降低JS脚本语言代码的执行开销。
步骤S407B,从原生代码缓存哈希表中获取字节码对应的原生代码缓存。
如果根据JS脚本语言代码的标识可以在原生代码缓存哈希表中查找到该JS脚本语言代码对应的原生代码,则可以从原生代码缓存哈希表中获取该原生代码。
步骤S408,执行原生代码。
在本发明实施例中,可以通过执行原生代码以执行JS脚本语言代码。
在本发明实施例中,达到了降低JS脚本语言代码的执行开销的效果。
在本发明实施例中,该JS脚本语言代码执行方法可以在firefox23浏览器上实现。在firefox23浏览器上加载和执行大型HTML5游戏时,尤其是首次执行大型HTML5游戏时,采用本发明实施例的JS脚本语言代码执行方法,可以降低客户端加载和执行游戏的开销,提高加载效率。例如,在firefox23浏览器上首次加载由mozilla提供的HTML5大型游戏BananaBread时,采用本发明实施例的JS脚本语言代码执行方法来执行该游戏的JS函数时的开销,显然,该开销降低了。
为了实现缓存的字节码和缓存的原生代码等缓存代码的重用,在退出firefox23浏览器时,可以将所有缓存的字节码和所有缓存的原生代码等缓存代码都写入本次磁盘文件中,例如,jscache.cfg中,这样,在重启firefox23浏览器时,可以从该本次磁盘文件中读入所有缓存的字节码和所有缓存的原生代码等缓存代码。
需要说明的是,为了降低动态语言代码的执行开销,也可以通过直接缓存并执行由WebAPP发布方下发给浏览器的动态语言对应的原生代码;为了降低动态语言代码的执行开销,还可以通过直接缓存并执行由Web Server下发给浏览器的通过该WebServer提供工具将JS脚本语言代码转化成的对应的原生代码。
从以上的描述中,可以看出,本发明实施例实现了降低动态语言代码执行开销的效果。
显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种动态语言代码执行方法,其特征在于,包括:
在动态语言代码执行时,缓存所述动态语言代码执行时生成的代码,得到所述动态语言代码的缓存代码;以及,
在所述动态语言代码再次执行时,获取所述动态语言代码的缓存代码并在所述动态语言代码的缓存代码的基础上执行所述动态语言代码。
2.根据权利要求1所述的动态语言代码执行方法,其特征在于,
所述在动态语言代码执行时,缓存所述动态语言代码执行时生成的代码,得到所述动态语言代码的缓存代码的步骤包括:在所述动态语言代码执行时,缓存所述动态语言代码执行时生成的字节码,并将所述字节码作为所述动态语言代码的缓存代码;
所述在动态语言代码再次执行时,获取所述动态语言代码的缓存代码并在所述动态语言代码的缓存代码的基础上执行所述动态语言代码的步骤包括:在动态语言代码再次执行时,获取所述字节码,并将所述字节码转换为原生代码;通过执行所述原生代码执行所述动态语言代码。
3.根据权利要求2所述的动态语言代码执行方法,其特征在于,
所述缓存动态语言代码执行时生成的字节码的步骤包括:建立字节码缓存哈希表;将所述动态语言代码执行时生成的字节码缓存到所述字节码缓存哈希表中,其中,缓存所述字节码时,将所述动态语言代码的标识对缓存的所述字节码进行标识;
所述获取所述字节码的步骤包括:通过所述动态语言代码的标识获取所述动态语言代码对应的所述字节码。
4.根据权利要求1所述的动态语言代码执行方法,其特征在于,
所述在动态语言代码执行时,缓存所述动态语言代码执行时生成的代码,得到所述动态语言代码的缓存代码的步骤包括:在所述动态语言代码执行时,缓存所述动态语言代码执行时生成的原生代码,并将所述原生代码作为所述缓存代码;
所述在动态语言代码再次执行时,获取所述动态语言代码的缓存代码并在所述动态语言代码的缓存代码的基础上执行所述动态语言代码的步骤包括:在动态语言代码再次执行时,获取所述原生代码,通过执行所述原生代码执行所述动态语言代码。
5.根据权利要求4所述的动态语言代码执行方法,其特征在于,
所述缓存动态语言代码执行时生成的原生代码的步骤包括:建立原生代码缓存哈希表;将所述动态语言代码执行时生成的原生代码缓存到所述原生代码缓存哈希表中,其中,缓存所述原生代码时,将所述动态语言代码的标识对缓存的所述原生代码进行标识;
所述获取所述原生代码的步骤包括:通过所述动态语言代码的标识获取所述动态语言代码对应的所述原生代码。
6.一种动态语言代码执行装置,其特征在于,包括:
缓存单元,用于在动态语言代码执行时,缓存所述动态语言代码执行时生成的代码,得到所述动态语言代码的缓存代码;以及,
执行单元,用于在所述动态语言代码再次执行时,获取所述动态语言代码的缓存代码并在所述动态语言代码的缓存代码的基础上执行所述动态语言代码。
7.根据权利要求6所述的动态语言代码执行装置,其特征在于,
所述缓存单元用于在所述动态语言代码执行时,缓存所述动态语言代码执行时生成的字节码,并将所述字节码作为所述动态语言代码的缓存代码;
所述执行单元用于将所述字节码转换为原生代码;通过执行所述原生代码执行所述动态语言代码。
8.根据权利要求7所述的动态语言代码执行装置,其特征在于,
所述缓存单元用于采用以下方式缓存所述动态语言代码执行时生成的字节码:建立字节码缓存哈希表,将所述动态语言代码执行时生成的字节码缓存到所述字节码缓存哈希表中,其中,缓存所述字节码时,将所述动态语言代码的标识对缓存的所述字节码进行标识,
所述执行单元用于采用以下方式获取所述字节码:通过所述动态语言代码的标识获取所述动态语言代码对应的所述字节码。
9.根据权利要求6所述的动态语言代码执行装置,其特征在于,
所述缓存单元用于在所述动态语言代码执行时,缓存所述动态语言代码执行时生成的原生代码,并将所述原生代码作为所述缓存代码,
所述执行单元用于通过执行所述原生代码执行所述动态语言代码。
10.根据权利要求9所述的动态语言代码执行装置,其特征在于,
所述缓存单元用于采用以下方式缓存所述动态语言代码执行时生成的原生代码:建立原生代码缓存哈希表,将所述动态语言代码执行时生成的原生代码缓存到所述原生代码缓存哈希表中,其中,缓存所述原生代码时,将所述动态语言代码的标识对缓存的所述原生代码进行标识,
所述执行单元用于采用以下方式获取所述原生代码:通过所述动态语言代码的标识获取所述动态语言代码对应的所述原生代码。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2013103571912A CN103412754A (zh) | 2013-08-15 | 2013-08-15 | 动态语言代码执行方法和装置 |
PCT/CN2014/078956 WO2015021809A1 (zh) | 2013-08-15 | 2014-05-30 | 动态语言代码执行方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2013103571912A CN103412754A (zh) | 2013-08-15 | 2013-08-15 | 动态语言代码执行方法和装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN103412754A true CN103412754A (zh) | 2013-11-27 |
Family
ID=49605767
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2013103571912A Pending CN103412754A (zh) | 2013-08-15 | 2013-08-15 | 动态语言代码执行方法和装置 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN103412754A (zh) |
WO (1) | WO2015021809A1 (zh) |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2015021809A1 (zh) * | 2013-08-15 | 2015-02-19 | 优视科技有限公司 | 动态语言代码执行方法和装置 |
CN104598227A (zh) * | 2014-12-31 | 2015-05-06 | 国家电网公司 | 一种修改系统展示页面内容的方法 |
CN105183592A (zh) * | 2014-03-21 | 2015-12-23 | 马维尔国际贸易有限公司 | 用于支持性能分析的方法和装置 |
CN105786465A (zh) * | 2014-12-23 | 2016-07-20 | 远光软件股份有限公司 | 一种脚本语言执行方法及装置 |
CN106445505A (zh) * | 2016-08-31 | 2017-02-22 | 恒生电子股份有限公司 | 一种代码处理方法及装置 |
CN106557350A (zh) * | 2015-09-30 | 2017-04-05 | 北京金山安全软件有限公司 | 应用程序安装包中java字节码转换方法、装置及设备 |
CN107015839A (zh) * | 2016-09-27 | 2017-08-04 | 阿里巴巴集团控股有限公司 | 一种实现前端事件代理的方法及装置 |
CN109144601A (zh) * | 2018-06-22 | 2019-01-04 | 北京奇艺世纪科技有限公司 | 在ios应用内调用函数的方法及系统 |
WO2021093442A1 (zh) * | 2019-11-13 | 2021-05-20 | 佛山职业技术学院 | 一种边缘辅助部署第三方应用到微控制器方法及系统 |
CN116450250A (zh) * | 2023-06-16 | 2023-07-18 | 天津金城银行股份有限公司 | 一种动态脚本执行方法、系统及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20010042241A1 (en) * | 2000-01-21 | 2001-11-15 | Fujitsu Limited | Apparatus and method for executing program using just-in time-compiler system |
CN1729453A (zh) * | 2002-12-23 | 2006-02-01 | 英特尔公司 | 永久高速缓存装置和方法 |
US20080270984A1 (en) * | 2005-12-27 | 2008-10-30 | Hideyuki Tsutsumitake | Script program execution device, script program execution method, and optical disk device |
CN102187313A (zh) * | 2008-10-15 | 2011-09-14 | 微软公司 | 高速缓存运行时生成的代码 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103412754A (zh) * | 2013-08-15 | 2013-11-27 | 优视科技有限公司 | 动态语言代码执行方法和装置 |
-
2013
- 2013-08-15 CN CN2013103571912A patent/CN103412754A/zh active Pending
-
2014
- 2014-05-30 WO PCT/CN2014/078956 patent/WO2015021809A1/zh active Application Filing
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20010042241A1 (en) * | 2000-01-21 | 2001-11-15 | Fujitsu Limited | Apparatus and method for executing program using just-in time-compiler system |
CN1729453A (zh) * | 2002-12-23 | 2006-02-01 | 英特尔公司 | 永久高速缓存装置和方法 |
US20080270984A1 (en) * | 2005-12-27 | 2008-10-30 | Hideyuki Tsutsumitake | Script program execution device, script program execution method, and optical disk device |
CN102187313A (zh) * | 2008-10-15 | 2011-09-14 | 微软公司 | 高速缓存运行时生成的代码 |
Cited By (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2015021809A1 (zh) * | 2013-08-15 | 2015-02-19 | 优视科技有限公司 | 动态语言代码执行方法和装置 |
CN105183592B (zh) * | 2014-03-21 | 2019-08-16 | 马维尔国际贸易有限公司 | 用于支持性能分析的方法和装置 |
CN105183592A (zh) * | 2014-03-21 | 2015-12-23 | 马维尔国际贸易有限公司 | 用于支持性能分析的方法和装置 |
CN105786465A (zh) * | 2014-12-23 | 2016-07-20 | 远光软件股份有限公司 | 一种脚本语言执行方法及装置 |
CN104598227A (zh) * | 2014-12-31 | 2015-05-06 | 国家电网公司 | 一种修改系统展示页面内容的方法 |
CN106557350B (zh) * | 2015-09-30 | 2019-12-13 | 北京金山安全软件有限公司 | 应用程序安装包中java字节码转换方法、装置及设备 |
CN106557350A (zh) * | 2015-09-30 | 2017-04-05 | 北京金山安全软件有限公司 | 应用程序安装包中java字节码转换方法、装置及设备 |
CN106445505A (zh) * | 2016-08-31 | 2017-02-22 | 恒生电子股份有限公司 | 一种代码处理方法及装置 |
CN107015839A (zh) * | 2016-09-27 | 2017-08-04 | 阿里巴巴集团控股有限公司 | 一种实现前端事件代理的方法及装置 |
CN109144601A (zh) * | 2018-06-22 | 2019-01-04 | 北京奇艺世纪科技有限公司 | 在ios应用内调用函数的方法及系统 |
WO2021093442A1 (zh) * | 2019-11-13 | 2021-05-20 | 佛山职业技术学院 | 一种边缘辅助部署第三方应用到微控制器方法及系统 |
CN116450250A (zh) * | 2023-06-16 | 2023-07-18 | 天津金城银行股份有限公司 | 一种动态脚本执行方法、系统及存储介质 |
CN116450250B (zh) * | 2023-06-16 | 2023-09-19 | 天津金城银行股份有限公司 | 一种动态脚本执行方法、系统及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
WO2015021809A1 (zh) | 2015-02-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103412754A (zh) | 动态语言代码执行方法和装置 | |
CN108369591B (zh) | 用于缓存和参数化ir的系统和方法 | |
US8997070B2 (en) | Extension mechanism for scripting language compiler | |
KR101782995B1 (ko) | 자바스크립트 코드 저장 및 최적화를 통한 웹 브라우징 방법 및 장치 | |
CN104424199A (zh) | 搜索方法和装置 | |
CN103294598A (zh) | 一种源代码检查方法及装置 | |
US20190087208A1 (en) | Method and apparatus for loading elf file of linux system in windows system | |
CN112395253B (zh) | 索引文件生成方法、终端设备、电子设备及介质 | |
US11599478B2 (en) | Reduced instructions to generate global variable addresses | |
CN109933381A (zh) | 一种内核的加载方法及装置 | |
US9171028B1 (en) | Method of maintaining a large set of taint labels | |
CN103077011B (zh) | 一种在JavaScript脚本语言中预生成机器码指令的方法和装置 | |
CN115599386A (zh) | 代码生成方法、装置、设备及存储介质 | |
CN103488517A (zh) | Php代码编译方法、php代码运行方法及装置 | |
US10083125B2 (en) | Method to efficiently implement synchronization using software managed address translation | |
RU2616164C9 (ru) | Способы и устройство для работы браузерного движка | |
CN104899217A (zh) | 一种自定义功能的实现方法及装置 | |
US10379827B2 (en) | Automatic identification and generation of non-temporal store and load operations in a dynamic optimization environment | |
CN108845864A (zh) | 一种基于spring框架的JVM垃圾回收方法和装置 | |
CN105786465A (zh) | 一种脚本语言执行方法及装置 | |
CN107817972B (zh) | 缓存代码处理方法、装置、存储介质及电子设备 | |
KR20150122924A (ko) | 자바스크립트 성능 평가 장치 및 성능 평가 방법 | |
CN111400623B (zh) | 用于搜索信息的方法和装置 | |
CN110879705B (zh) | 页面生成方法、装置和计算机可读存储介质 | |
KR20150122923A (ko) | 자바스크립트 가속 장치 및 가속 방법 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20131127 |
|
RJ01 | Rejection of invention patent application after publication |