CN110347416B - 脚本的更新方法和装置 - Google Patents

脚本的更新方法和装置 Download PDF

Info

Publication number
CN110347416B
CN110347416B CN201910656910.8A CN201910656910A CN110347416B CN 110347416 B CN110347416 B CN 110347416B CN 201910656910 A CN201910656910 A CN 201910656910A CN 110347416 B CN110347416 B CN 110347416B
Authority
CN
China
Prior art keywords
script
processed
updating
text
abstract syntax
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.)
Active
Application number
CN201910656910.8A
Other languages
English (en)
Other versions
CN110347416A (zh
Inventor
郭小灿
冯帆
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Netease Hangzhou Network Co Ltd
Original Assignee
Netease Hangzhou Network Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Netease Hangzhou Network Co Ltd filed Critical Netease Hangzhou Network Co Ltd
Priority to CN201910656910.8A priority Critical patent/CN110347416B/zh
Publication of CN110347416A publication Critical patent/CN110347416A/zh
Application granted granted Critical
Publication of CN110347416B publication Critical patent/CN110347416B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/60Software deployment
    • G06F8/65Updates

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明公开了一种脚本的更新方法和装置。其中,该方法包括:获取待处理脚本对应的抽象语法树,其中,抽象语法树为待处理脚本的抽象语法结构的树状表现形式;确定抽象语法树中需要进行文本更新的待处理子树;确定待处理子树在待处理脚本中的脚本位置;根据目标文本对脚本位置处的文本进行更新,得到更新后的脚本。本发明解决了现有技术中对脚本进行优化的效率低的技术问题。

Description

脚本的更新方法和装置
技术领域
本发明涉及计算机领域,具体而言,涉及一种脚本的更新方法和装置。
背景技术
目前,运行游戏代码的方式主要有两种,即编译源码的方式以及虚拟机执行脚本语言的方式。对于编译源码的方式,通常是将源码编译为目标机器的机器码,例如,将源码编写为C++或者其他编译型语言,并由处理器来执行;对于第二种方式,通常用脚本语言编写,生成虚拟机字节码或者直接用源码在虚拟机内执行,该方式的执行速度较慢,但开发速度较快,而且对代码逻辑的更新也比较方便。
在上述第二种方式中,处理器可以通过将脚本语言编译为预设文件,在对脚本进行编译的过程中去掉脚本内置的无用代码,从而减少无用语句的调用,但该方式的执行效率较低。另外,处理器还通过文本替换的方式来实现,通过文本匹配开发中的有用代码,在运行时无用的代码,例如print等语句,则在文本规则的基础上进行处理,在对代码进行处理之后,再将处理后的代码编译为虚拟机的字节码并在虚拟机中运行。该方式通常使用正则表达式匹配需要删除或者替换的内容,然后对其进行处理。在文本处理非常严格而完备的情况下,理论上可以提升脚本效率到能自动优化的最大值,但严格而完备的限制条件难以达到。对于一条可以优化的语句,由于语言的复杂性,因此,如果不进行语法解析而直接用正则来匹配则可能会漏掉大量边界的复杂情况,例如,语句print后可以接所有python语言所能表达的表达式形式,而用文本规则无法匹配所有的表达式。
由上述内容可知,在现有技术中,程序开发者只能面临完备而不严格或者严格而不完备的困境。在完备而不严格的情况下,如果存在边界情况,则处理后的源码将不能正确执行。在严格而不完备的情况下,代码预处理忽略了大量可以优化的情况,优化效果不会理想,从而降低了脚本优化的效率。
针对上述的问题,目前尚未提出有效的解决方案。
发明内容
本发明实施例提供了一种脚本的更新方法和装置,以至少解决现有技术中对脚本进行优化的效率低的技术问题。
根据本发明实施例的一个方面,提供了一种脚本的更新方法,包括:获取待处理脚本对应的抽象语法树,其中,抽象语法树为待处理脚本的抽象语法结构的树状表现形式;确定抽象语法树中需要进行文本更新的待处理子树;确定待处理子树在待处理脚本中的脚本位置;根据目标文本对脚本位置处的文本进行更新,得到更新后的脚本。
进一步地,脚本的更新方法还包括:对待处理脚本进行预处理,得到预处理后的脚本;对预处理后的脚本进行解析,生成并获取抽象语法树。
进一步地,通过如下任意一种或多种方式对待处理脚本进行预处理,得到预处理后的脚本:将待处理脚本的字符串转换为预设编码类型的字符串;将待处理脚本中的回车符转换为预设格式的回车符;对待处理脚本中的文件编码头进行删除,其中,文件编码头用于标识待处理脚本的编码类型。
进一步地,脚本的更新方法还包括:对预处理后的脚本进行分割处理,得到多个语法单元;确定多个语法单元之间的关系;根据多个语法单元以及关系生成抽象语法树;在生成抽象语法树之后,获取抽象语法树。
进一步地,在根据目标文本对脚本位置处的文本进行更新之前,脚本的更新方法还包括:获取目标语法树,其中,目标语法树为目标文本对应的语法树;根据语法标准规则以及目标语法树生成目标文本。
进一步地,脚本的更新方法还包括:获取常量表;确定常量表中的目标常量;根据目标常量对脚本位置处的常量进行更新,得到更新后的脚本。
进一步地,脚本的更新方法还包括:检测待处理脚本中的无用语句,其中,无用语句用于在待处理脚本的代码运行过程中输出调试信息和/或打印错误信息;确定无用语句对应的脚本位置;采用预设语句对脚本位置处的无用语句进行更新,得到更新后的脚本。
进一步地,脚本的更新方法还包括:获取宏函数所对应的函数体以及宏函数对应的脚本位置;采用函数体对脚本位置处的宏函数进行更新,得到更新后的脚本。
进一步地,脚本的更新方法还包括:检测待处理脚本中满足第一预设条件的条件语句;提取条件语句中满足第二预设条件的分支语句;根据分支语句对条件语句对应的脚本位置处的文本进行更新,得到更新后的脚本。
进一步地,在根据目标文本对脚本位置处的文本进行更新,得到更新后的脚本之后,脚本的更新方法还包括:对更新后的脚本进行编译,得到预设文件;对预设文件进行打包处理,以执行打包后的预设文件。
根据本发明实施例的另一方面,还提供了一种脚本的更新装置,包括:获取模块,用于获取待处理脚本对应的抽象语法树,其中,抽象语法树为待处理脚本的抽象语法结构的树状表现形式;第一确定模块,用于确定抽象语法树中需要进行文本更新的待处理子树;第二确定模块,用于确定待处理子树在待处理脚本中的脚本位置;更新模块,用于根据目标文本对脚本位置处的文本进行更新,得到更新后的脚本。
根据本发明实施例的另一方面,还提供了一种存储介质,该存储介质包括存储的程序,其中,在程序运行时控制存储介质所在设备执行脚本的更新方法。
根据本发明实施例的另一方面,还提供了一种处理器,该处理器用于运行程序,其中,程序运行时执行脚本的更新方法。
在本发明实施例中,采用抽象语法树对待处理脚本进行更新的方式,通过抽象语法树来对待处理脚本进行脚本更新,根据抽象语法树可以确定要更新的脚本对应的待处理子树,而根据待处理子树在抽象语法树中的位置即可确定要更新的脚本在待处理脚本中的位置,进而对该位置处的脚本进行更新。
在上述过程中,无需编写正则表达式来匹配需要更新的脚本,提升了脚本优化的效率,另外,由于抽象语法树为待处理脚本的抽象语法结构的树状表现形式,从而避免了由于脚本复杂遗漏大量边界的问题。
由此可见,本申请所提供的方案达到了对脚本进行优化的目的,从而实现了提高脚本优化效率的技术效果,进而解决了现有技术中对脚本进行优化的效率低的技术问题。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是根据本发明实施例的一种脚本的更新方法的流程图;
图2是根据本发明实施例的一种可选的脚本的更新方法的示意图;
图3是根据本发明实施例的一种可选的脚本的更新方法的流程图;以及
图4是根据本发明实施例的一种脚本的更新装置的示意图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
根据本发明实施例,提供了一种脚本的更新方法实施例,需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
图1是根据本发明实施例的脚本的更新方法的流程图,如图1所示,该方法包括如下步骤:
步骤S102,获取待处理脚本对应的抽象语法树,其中,抽象语法树为待处理脚本的抽象语法结构的树状表现形式。
在步骤S102中,待处理脚本可以为游戏脚本,其中,待处理脚本以文本形式保存。另外,抽象语法树(Abstract Syntax Tree,简称AST)是源代码语法结构的抽象表示,其以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。
在一种可选的实施例,脚本更新系统可获取待处理脚本,并对待处理脚本进行处理得到抽象语法树。具体的,脚本更新系统对待处理脚本进行预处理,得到预处理后的脚本,然后对预处理后的脚本进行解析,生成并获取抽象语法树。其中,脚本更新系统可通过如下任意一种或多种方式对待处理脚本进行预处理,得到预处理后的脚本:
(1)将待处理脚本的字符串转换为预设编码类型的字符串。需要说明的是,待处理脚本对应的代码文件中的编码可能与其他文件的编码不同,或者同一个代码文件中存在多种不同编码的字符串,为便于脚本更新系统后期的处理,需要将待处理脚本的字符串进行统一,可选的,预设编码类型的字符串可以为UTF-8编码的字符串。
(2)将待处理脚本中的回车符转换为预设格式的回车符。需要说明的是,不同的操作系统对于待处理脚本中的回车符的处理操作是不同的,例如,在Windows系统中回车符表示为CR LF,而在Linux系统中回车符表示为LF,由此造成多个待处理脚本的回车符表示不一致。在本申请中,统一对回车符进行处理,将其统一为预设格式的回车符,其中,预设格式可以为CR LF或者LF。
(3)对待处理脚本中的文件编码头进行删除,其中,文件编码头用于标识待处理脚本的编码类型。需要说明的是,文件编码头为出现在文件头的符号,在Unicode编码标准中用于标识文件采用了何种格式编码的字符,但是在实际处理中会干扰后续逻辑,因此,本申请在对待处理脚本进行预处理时,删除文件编码头,而且后期也不会再添加,从而统一了所有输出文件的格式。
除上述三种预处理方式外,在实际应用中,对于一些配置文件或者二进制文件,运行时需要将其与待处理脚本放置在一起,但配置文件或者二进制文件无需进行处理,或者,在一些开发期才会用到的文件,在预处理中也需要去除。在本申请中,脚本更新系统对于无需变动的二进制文件进行复制处理,而在开发期需要而运行时并不需要的文件进行删除处理。
进一步地,在对待处理脚本进行预处理,得到预处理后的脚本之后,脚本更新系统对预处理后的脚本进行分割处理,得到多个语法单元,并确定多个语法单元之间的关系,然后根据多个语法单元以及关系生成抽象语法树,最后在生成抽象语法树之后,获取抽象语法树。可选的,上述多个语法单元包括但不限于空白(例如,空格、换行、缩进等)、注释(例如,行注释、块注释)、字符串、数字、标识符(例如,字母、)、运算符以及其他字符(例如,括号、分号、点等)。例如,将每对括号所包含的脚本分割为一个语法单元。
步骤S104,确定抽象语法树中需要进行文本更新的待处理子树。
步骤S106,确定待处理子树在待处理脚本中的脚本位置。
需要说明的是,通过步骤S102可以得到抽象语法树,脚本更新系统可以对抽象语法树中的节点进行操作,例如,删除节点、替换节点等。然而,在实际应用中,由于采用改造抽象语法树反向输出的方式来生成语句会使得一些细节无法进行比对,因此,在本申请中,采用文本标记的方式进行文本替换。在进行文本标记之前,首先确定需要进行文本更新的待处理子树,并进行标记,然后将这段文本对应的改造后的文本(即目标文本)进行文本替换,从而能够保留大量的文本细节,例如,在原始脚本对应的文本中的一些不同的写法在抽象语法树中是等价的,即生成抽象语法树的过程丢失了一些文本的原始信息,例如,注释等,而采用本申请所提供的方法则可以避免这个问题,进而在能保证文本的原始呈现的地方均能保证文本的原始内容。
步骤S108,根据目标文本对脚本位置处的文本进行更新,得到更新后的脚本。
需要说明的是,目标文本为脚本位置处更新后的文本。其中,在对脚本位置处的文本进行更新之前,需要获取目标文本。
具体的,脚本更新系统首先获取目标语法树,其中,目标语法树为目标文本对应的语法树,然后根据语法标准规则以及目标语法树生成目标文本。可选的,目标语法树是通过应用优化规则,由待处理脚本对应的抽象语法树转换而来,其中,应用优化规则在不同的脚本处理过程中是不同的,例如,常量替换具有常量替换的目标语法树对应的应用优化规则。
可选的,图2示出了一种可选的脚本的更新方法,在图2中,脚本更新系统首先对预处理后的待处理脚本进行解析,得到抽象语法树,并维护抽象语法树的每个节点与待处理脚本的脚本位置之间的关系。然后在抽象语法树中根据预设的抽取规则确定需要进行文本更新的待处理子树,以及与该待处理子树在待处理脚本中对应的脚本位置,并基于预设的替换规则确定目标语法树,其中,在图2中,待处理子树对应的待处理脚本中的原始文本为OR_TEXT,待处理子树为OR_TREE,目标语法树为RE_TREE。进一步地,脚本更新系统根据语法标准规则将RE_TREE生成为目标文本RE_TEXT。在得到目标文本RE_TEXT之后,将OR_TEXT在待处理子树在待处理脚本中的脚本位置更新为RE_TEXT(如图2中的文本替换以及脚本优化步骤)。
需要说明的是,对于缩进严格的脚本语言(例如,Python语言)来说,还需要对目标文本进行缩进处理。
此外,还需要说明的是,对脚本位置处的文本进行更新至少包括:常量替换、无用语句的删除、函数的更新以及分支的剪裁。重复执行上述步骤S102至S108即可实现常量替换、无用语句的删除、函数的更新以及分支的剪裁等对脚本位置处的文本的更新。
基于上述步骤S102至步骤S108所限定的方案,可以获知,采用抽象语法树对待处理脚本进行更新的方式,通过抽象语法树来对待处理脚本进行脚本更新,根据抽象语法树可以确定要更新的脚本对应的待处理子树,而根据待处理子树在抽象语法树中的位置即可确定要更新的脚本在待处理脚本中的位置,进而对该位置处的脚本进行更新。
容易注意到的是,在上述过程中,无需编写正则表达式来匹配需要更新的脚本,提升了脚本优化的效率,另外,由于抽象语法树为待处理脚本的抽象语法结构的树状表现形式,从而避免了由于脚本复杂遗漏大量边界的问题。
由此可见,本申请所提供的方案达到了对脚本进行优化的目的,从而实现了提高脚本优化效率的技术效果,进而解决了现有技术中对脚本进行优化的效率低的技术问题。
在一种可选的实施例中,图3示出了脚本的更新方法的流程图,由图3可知,本申请所提供的方案主要包括以下步骤:文本预处理、常量替换、无用语句的删除、函数的更新、分支的剪裁以及编译打包。
可选的,脚本更新系统对待处理脚本进行常量替换,是将待处理脚本中用取属性、导入等语义方法表示的常量引用直接替换为字面表示的常量。具体的,脚本更新系统首先获取常量表,然后确定常量表中的目标常量,最后根据目标常量对脚本位置处的常量进行更新,得到更新后的脚本。
需要说明的是,对于一些常量,例如,Const.IsClient,在虚拟机运行时会加载Const文件,并在内存中维护IsClient的变量,然后返回脚本中的值,其中,在系统运行时会进行取属性的操作,该操作可根据不同脚本语言的虚拟机实现的不同而有所区别,但共性是增加系统运行时的时间与空间开销,而常量替换可以去除时间和空间开销。
脚本更新系统在进行常量替换时,首先需要获取常量表,其中,常量表可以是通过脚本语言生成的,其可直接在虚拟机中进行加载。在加载常量表之后,脚本更新系统根据定制的输出需要,对于一些开发期的常量进行修改,例如,在开发期的代码里可以有变量IsRelease,它在脚本中的值是False,而在进行脚本优化时,可以将变量IsRelease的值替换为True,如果在脚本中存在不需要的开发期逻辑(例如,错误探测)等的代码,则无需做额外的改动即可实现对运行期的优化。
需要说明的是,常量替换实质上是对脚本中常量表示符号进行替换,虽然与在脚本中直接写入常量的效果相同,但是实际应用中,如果直接硬编码常量,则会带来大量常量无法管理、无法重构的问题,而本申请所提供的方案能够实现在不损失运行效率的前提下达到用单独文件管理常量的功能,对于工程量越大的脚本,效果越显著。
另外,基于常量替换的优化方案,将脚本中的语义替换为字面量,使得在虚拟机内运行时可以减少对常量表、常量存储文件的访问和取址,节约了CPU的运算和对内存的访问,在对常量高频访问的时候可以达到较好的优化效果。
在一种可选的实施例中,脚本更新系统对待处理脚本进行无用语句的删除,具体的,脚本更新系统检测待处理脚本中的无用语句,其中,无用语句用于在待处理脚本的代码运行过程中输出调试信息和/或打印错误信息。然后确定无用语句对应的脚本位置,并采用预设语句对脚本位置处的无用语句进行更新,得到更新后的脚本。
需要说明的是,最常见的相同运行时的无用语句为Debug用的语句,例如print,在开发期为了查找错误而设的语句通常会散落在脚本的各处,通过人工删除的方式,工作量较大,而且在开发时无法重新利用,而自动化统一删除无用语句可以在开发期时继续编写无用语句,而在发布后删除非开发人员不需要接触的语句。
另外,在对无用语句进行更新时,需要空行来维持代码结构,因为在脚本运行期间可能会出现错误,而错误捕捉系统提供的重要信息之一就是行号,因此,不能因为对脚本进行了优化而丢失了表征错误的信息,这样会导致开发人员难以将实际运行期的行号和开发脚本中的行号进行对应,因此,不能只用简单的删除来直接去掉无用语句,同时根据不同脚本语言的要求需要加入不同形式的空白语句,以python语言为例进行说明:
if__name__==“__main__”:
print“hello world”
在上述代码段中,print语句对于有GUI显示的程序来说,在运行期间属于无用语句,可以删除。但是简单的直接删除会导致对于python语法的失效,因此,必须用pass语句(上述预设语句)而不是简单的空行来实现对无用语句的删除。
由上述内容可知,无用语句的删除既可以避免运行不需要用到的语句导致系统运行效率低的问题,还可以减小代码体积。
另外,本申请基于无用语句的删除方案,通过在抽象语法树层面上删除无用语句,安全地删除了运行时的无效语句,避免错误删除导致的脚本语法错误等致命错误,同时因为某些无用语句会访问网络、磁盘IO,并且可能占用一些CPU的计算资源,因此,删除无用语句可以有效提高游戏运行效率。同时,无用语句通常是开发时的调试信息或者打印出错信息的语句,因此,删除无用语句还可以达到保护代码信息不被暴露的目的。
在一种可选的实施例中,脚本更新系统对脚本更新系统对待处理脚本进行函数的更新。具体的,脚本更新系统首先获取宏函数所对应的函数体以及宏函数对应的脚本位置,然后采用函数体对脚本位置处的宏函数进行更新,得到更新后的脚本。
需要说明的是,在编译型语言中往往有宏定义可以方便地写一些简单的逻辑,在编译过程中可将宏定义会替换为宏中的逻辑,从而无需进行一次实际的函数调用,在代码层面即可完成一定的逻辑抽象,在不用调用函数的前提下也可以完成逻辑抽象的过程。
然而宏对于解释型脚本语言是难以做到的,因为脚本语言的解释器并不会修改原始的语句,而对于本申请中的脚本更新系统来说,在替换前的脚本运行时,将宏作为函数来调用,即脚本中的宏遵循脚本中的函数调用的标准写法,而在脚本优化过程中,将写成函数的宏进行替换操作,直接将函数体的内容替换进去。
需要注意的是,在脚本语言中的一次函数调用的开销较大,而通过替换成函数体可以节省函数调用的开销,从而达成优化脚本运行时效率的目的。
另外,由于在脚本语言运行时有虚拟机的调用开销,在脚本语言中的每一层的调用开销往往比在编译语言中的一次函数调用高得多,因此,本申请通过将定义的函数在处理时直接用抽象语法树替换文本的方式进行函数的展开,从而避免了展开的函数的调用开销,本申请同时也支持多层嵌套的预定义的函数展开优化,在运行时可以有效减少简单函数的调用开销,在简单函数是热点的情况下,对性能的提升会有更新显著的作用。
在一种可选的实施例中,脚本更新系统对脚本更新系统对待处理脚本进行分支的剪裁的更新。具体的,脚本更新系统首先检测待处理脚本中满足第一预设条件的条件语句,然后提取条件语句中满足第二预设条件的分支语句,最后根据分支语句对条件语句对应的脚本位置处的文本进行更新,得到更新后的脚本。
需要说明的是,在对分支进行优化的过程中,在程序语言中较多的使用if语句,if语句在程序运行时会对应一条或者多条的CPU指令,根据if语句条件结果的不同,运行不同的逻辑。如果在脚本优化阶段,if语句对应的条件必真或者必假,则可以将必真的分支直接提取到if外面,必假的分支直接不写入优化后的脚本,从而使得脚本运行时没有if语句,提高运行效率,而且还减小了代码体积,避免了代码泄漏,例如在同一个文件里写如下代码:
如果要将上面的代码打包发布,则不可避免的是下面的代码段在客户端上不会运行的代码被泄漏了,而此时裁剪分支后优化结果不仅可以去掉if语句,而且不会暴露原本需要隐藏的服务器代码实现。
另外,在对分支进行优化时,首先对符合条件的if语句进行标记,与之前不相同的是,在对分支进行优化时,不进行子树转换和反转换,直接将正确分支的语句提取出来,对于缩进有特殊要求的语言进行缩进处理,再加上为保持行号而做的空行/空语句,即可达到逻辑中在优化步骤减除不需要的多余分支。
需要说明的是,对于前面提到的替换优化完成后,代码中存在一些必定运行和必定不运行的IF分支,此时,通过抽象语法树分析可以查明这些分支和其包含的代码范围。通过对if True结构的判断,确定了必定运行的代码之后,可以通过删除if判断语句并提取内部语句,从而节省虚拟机的IF判断语句,提升运行效率。通过对if False结构的判断,确定了一定不会被运行的代码之后,可以直接在代码层面删除不会被运行的分支,不仅提升了虚拟机的运行效率,同时精简了代码。
此外,还需要说明的是,精简代码减少了脚本的大小,节约了包体和内存,在下载patch的场景下也节约了流量。更重要的一点是,对于服务器客户端共存的代码,在发布客户端的代码时,删除不必要的服务器专用代码,即便客户端被破解,依然不可能在客户端获取到任何服务器专用代码,对代码安全进行了保护。
可选的,在对待处理脚本进行预处理的过程中,原始脚本中的一些必要的文件头被删除了,在实际的操作过程中,此时,需要恢复被删除的文件头,以还原原本文件的原始信息。
在一种可选的实施例中,如图3所示,在根据目标文本对脚本位置处的文本进行更新,得到更新后的脚本之后,脚本更新系统还对更新后的脚本进行编译,得到预设文件,并对预设文件进行打包处理,以执行打包后的预设文件。
需要说明的是,编译阶段实际上将上文中所说的脚本优化过的结果进行进一步的处理,针对本技术实践中的案例,用虚拟机自带的编译器将优化过后的文本文件编译为二进制文件,具体到python虚拟机中,是用python指令将前面优化过后的py脚本编译为pyo文件,客户端和服务器代码打包只会打包这些pyo文件,而不会打包原始的文本文件,进一步提升最终脚本的执行效率和缩小代码体积。
由上述内容可知,本申请实现了对脚本的预处理,在安全的前提下,尽可能多得删除无用代码,替换低效代码,达到优化脚本语言执行效率的目的。相比于现有技术,本申请不仅能大大加强脚本代码预处理的安全性,也能用规则处理更多的语句和性能热点,在不花费更多的人力的前提下提升游戏中脚本语言在虚拟机中的执行效率。
根据本发明实施例的另一方面,还提供了一种执行上述的脚本的更新方法的脚本的更新装置,如图4所示,该装置包括:获取模块401、第一确定模块403、第二确定模块405以及更新模块407。
其中,获取模块401,用于获取待处理脚本对应的抽象语法树,其中,抽象语法树为待处理脚本的抽象语法结构的树状表现形式;第一确定模块403,用于确定抽象语法树中需要进行文本更新的待处理子树;第二确定模块405,用于确定待处理子树在待处理脚本中的脚本位置;更新模块407,用于根据目标文本对脚本位置处的文本进行更新,得到更新后的脚本。
此处需要说明的是,上述获取模块401、第一确定模块403、第二确定模块405以及更新模块407对应于上述实施例的步骤S102至步骤S108,四个模块与对应的步骤所实现的实例和应用场景相同,但不限于上述实施例所公开的内容。
根据本发明实施例的另一方面,还提供了一种存储介质,该存储介质包括存储的程序,其中,在程序运行时控制存储介质所在设备执行上述的脚本的更新方法。
根据本发明实施例的另一方面,还提供了一种处理器,该处理器用于运行程序,其中,程序运行时执行上述的脚本的更新方法。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
在本发明的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

Claims (12)

1.一种脚本的更新方法,其特征在于,包括:
获取待处理脚本对应的抽象语法树,其中,所述抽象语法树为所述待处理脚本的抽象语法结构的树状表现形式;
确定所述抽象语法树中需要进行文本更新的待处理子树;
确定所述待处理子树在所述待处理脚本中的脚本位置;
根据目标文本对所述脚本位置处的文本进行更新,得到更新后的脚本;
其中,所述根据目标文本对所述脚本位置处的文本进行更新,得到更新后的脚本,包括:获取常量表;确定所述常量表中的目标常量;根据所述目标常量对所述脚本位置处的常量进行更新,得到所述更新后的脚本。
2.根据权利要求1所述的方法,其特征在于,获取待处理脚本对应的抽象语法树,包括:
对所述待处理脚本进行预处理,得到预处理后的脚本;
对所述预处理后的脚本进行解析,生成并获取所述抽象语法树。
3.根据权利要求2所述的方法,其特征在于,通过如下任意一种或多种方式对所述待处理脚本进行预处理,得到预处理后的脚本:
将所述待处理脚本的字符串转换为预设编码类型的字符串;
将所述待处理脚本中的回车符转换为预设格式的回车符;
对所述待处理脚本中的文件编码头进行删除,其中,所述文件编码头用于标识所述待处理脚本的编码类型。
4.根据权利要求2所述的方法,其特征在于,对所述预处理后的脚本进行解析,生成并获取所述抽象语法树,包括:
对所述预处理后的脚本进行分割处理,得到多个语法单元;
确定所述多个语法单元之间的关系;
根据所述多个语法单元以及所述关系生成所述抽象语法树;
在生成所述抽象语法树之后,获取所述抽象语法树。
5.根据权利要求1所述的方法,其特征在于,在根据目标文本对所述脚本位置处的文本进行更新之前,所述方法还包括:
获取目标语法树,其中,所述目标语法树为所述目标文本对应的语法树;
根据语法标准规则以及所述目标语法树生成所述目标文本。
6.根据权利要求1所述的方法,其特征在于,根据目标文本对所述脚本位置处的文本进行更新,得到更新后的脚本,包括:
检测所述待处理脚本中的无用语句,其中,所述无用语句用于在所述待处理脚本的代码运行过程中输出调试信息和/或打印错误信息;
确定所述无用语句对应的脚本位置;
采用预设语句对所述脚本位置处的无用语句进行更新,得到所述更新后的脚本。
7.根据权利要求1所述的方法,其特征在于,根据目标文本对所述脚本位置处的文本进行更新,得到更新后的脚本,包括:
获取宏函数所对应的函数体以及所述宏函数对应的脚本位置;
采用所述函数体对所述脚本位置处的宏函数进行更新,得到所述更新后的脚本。
8.根据权利要求1所述的方法,其特征在于,根据目标文本对所述脚本位置处的文本进行更新,得到更新后的脚本,包括:
检测所述待处理脚本中满足第一预设条件的条件语句;
提取所述条件语句中满足第二预设条件的分支语句;
根据所述分支语句对所述条件语句对应的脚本位置处的文本进行更新,得到所述更新后的脚本。
9.根据权利要求1所述的方法,其特征在于,在根据目标文本对所述脚本位置处的文本进行更新,得到更新后的脚本之后,所述方法还包括:
对所述更新后的脚本进行编译,得到预设文件;
对所述预设文件进行打包处理,以执行打包后的预设文件。
10.一种脚本的更新装置,其特征在于,包括:
获取模块,用于获取待处理脚本对应的抽象语法树,其中,所述抽象语法树为所述待处理脚本的抽象语法结构的树状表现形式;
第一确定模块,用于确定所述抽象语法树中需要进行文本更新的待处理子树;
第二确定模块,用于确定所述待处理子树在所述待处理脚本中的脚本位置;
更新模块,用于根据目标文本对所述脚本位置处的文本进行更新,得到更新后的脚本;
更新模块还用于:获取常量表;确定所述常量表中的目标常量;根据所述目标常量对所述脚本位置处的常量进行更新,得到所述更新后的脚本。
11.一种存储介质,其特征在于,所述存储介质包括存储的程序,其中,在所述程序运行时控制所述存储介质所在设备执行权利要求1至9中任意一项所述的脚本的更新方法。
12.一种处理器,其特征在于,所述处理器用于运行程序,其中,所述程序运行时执行权利要求1至9中任意一项所述的脚本的更新方法。
CN201910656910.8A 2019-07-19 2019-07-19 脚本的更新方法和装置 Active CN110347416B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910656910.8A CN110347416B (zh) 2019-07-19 2019-07-19 脚本的更新方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910656910.8A CN110347416B (zh) 2019-07-19 2019-07-19 脚本的更新方法和装置

Publications (2)

Publication Number Publication Date
CN110347416A CN110347416A (zh) 2019-10-18
CN110347416B true CN110347416B (zh) 2023-09-26

Family

ID=68179557

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910656910.8A Active CN110347416B (zh) 2019-07-19 2019-07-19 脚本的更新方法和装置

Country Status (1)

Country Link
CN (1) CN110347416B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111901185B (zh) * 2020-06-05 2021-11-23 厦门亿联网络技术股份有限公司 一种用于VoIP话机自动化测试系统的账号管理方法及装置
CN112905153B (zh) * 2020-12-07 2023-10-27 中国科学院软件研究所 一种面向软件定义卫星的软件并行构建方法以及装置

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10540416B2 (en) * 2011-06-23 2020-01-21 Microsoft Technology Licensing, Llc Linking source code to running element
CN103729580A (zh) * 2014-01-27 2014-04-16 国家电网公司 一种检测软件抄袭的方法和装置
CN105975392A (zh) * 2016-04-29 2016-09-28 国家计算机网络与信息安全管理中心 一种基于抽象语法树的重复代码检测方法及装置
CN107665124B (zh) * 2017-09-14 2021-04-20 阿里巴巴(中国)有限公司 模块化JavaScript文件处理方法、设备和服务器

Also Published As

Publication number Publication date
CN110347416A (zh) 2019-10-18

Similar Documents

Publication Publication Date Title
KR101099212B1 (ko) 예외 처리 구조물들을 포함하는 소프트웨어의 소스 언어 독립형 중간 표현을 처리하는 방법, 다수의 소스 코드 언어들에 대한 소스 언어 독립형 예외 처리 중간 표현들을 구현하기 위한 시스템 및 컴퓨터 판독가능 저장 매체
US9710243B2 (en) Parser that uses a reflection technique to build a program semantic tree
CN108139891B (zh) 用于生成建议以纠正未定义标记错误的方法和系统
US20110138373A1 (en) Method and apparatus for globally optimizing instruction code
CN106796525B (zh) 按需加载动态脚本语言代码以减少内存使用
CN106843849B (zh) 一种基于文档的库函数的代码模型的自动合成方法
CN111176717B (zh) 生成安装包的方法、装置及电子设备
CN109491658A (zh) 计算机可执行代码数据的生成方法及装置
CN108549535B (zh) 一种基于文件依赖关系的高效程序解析方法和系统
CN110347416B (zh) 脚本的更新方法和装置
US7822615B2 (en) Translating expressions in a computing environment
CN110096264A (zh) 一种代码运行方法及装置
US6625807B1 (en) Apparatus and method for efficiently obtaining and utilizing register usage information during software binary translation
CN114895908B (zh) 基于Web应用表达式的实现方法及系统、设备和存储介质
WO2021173208A1 (en) Detection of runtime errors using machine learning
Kuramitsu Nez: practical open grammar language
US8341607B2 (en) Condensing pattern matcher generation for intermediate language patterns
CN109947711B (zh) 一种对ios项目开发过程中的多语言文件自动化管理方法
CN113608748B (zh) C语言转换Java语言的数据处理方法、装置及设备
CN115454438A (zh) 基于对照表的hlsl着色器源码转换为glsl着色器源码的方法
CN111796832B (zh) 热补丁文件生成方法、装置、设备及存储介质
CN114417347A (zh) 应用程序的漏洞检测方法、装置、设备、存储介质和程序
KR20230040516A (ko) 자바스크립트의 중간 언어 기반 의미론 추출 자동화 시스템 및 방법
CN113849781A (zh) Go语言源代码混淆方法、系统、终端及存储介质
CN115981652B (zh) 语言互操作方法、装置、存储介质及程序产品

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant