CN112346730B - 一种中间表示的生成方法、计算机设备及存储介质 - Google Patents
一种中间表示的生成方法、计算机设备及存储介质 Download PDFInfo
- Publication number
- CN112346730B CN112346730B CN202011217087.XA CN202011217087A CN112346730B CN 112346730 B CN112346730 B CN 112346730B CN 202011217087 A CN202011217087 A CN 202011217087A CN 112346730 B CN112346730 B CN 112346730B
- Authority
- CN
- China
- Prior art keywords
- instruction
- target
- context
- program code
- generating
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/242—Query formulation
- G06F16/2433—Query languages
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Mathematical Physics (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Databases & Information Systems (AREA)
- Software Systems (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明实施例公开了一种中间表示的生成方法、计算机设备及存储介质。其中,方法包括:生成与目标程序代码对应的抽象语法树;遍历抽象语法树的各个树节点,生成与目标程序代码对应的上下文,并根据上下文生成至少一条中间指令;确定各中间指令的运行顺序,并根据运行顺序生成与目标程序代码对应的中间表示。本发明实施例的方案,可以解决相关技术中生成的中间表示较复杂的问题,可以生成完整表达目标程序代码语义的中间表示,并且该中间表示可以进一步转化为机器代码执行。
Description
技术领域
本发明实施例涉及数据库技术,尤其涉及一种中间表示的生成方法、计算机设备及存储介质。
背景技术
编译技术是整个计算机体系中最为重要的核心技术之一,如何将一个高抽象的代码,逐步转化并优化成机器可以认识并执行的指令(中间表示)是其主要的工作。
现阶段,MySQL(Structured Query Language,结构化查询语言)的存储过程模块所拥有的中间表示,较复杂,并不能进一步转化为机器代码执行,而是需要通过自身的解释器进行解释执行,存在大量的函数调用开销。
发明内容
本发明实施例提供一种中间表示的生成方法、计算机设备及存储介质,以生成可以完整表达目标程序代码语义的中间表示。
第一方面,本发明实施例提供了一种中间表示的生成方法,包括:
生成与目标程序代码对应的抽象语法树;
遍历所述抽象语法树的各个树节点,生成与所述目标程序代码对应的上下文,并根据所述上下文生成至少一条中间指令;
确定各所述中间指令的运行顺序,并根据所述运行顺序生成与所述目标程序代码对应的中间表示。
第二方面,本发明实施例还提供了一种计算机设备,包括处理器和存储器,所述存储器用于存储指令,当所述指令执行时使得所述处理器执行以下操作:
生成与目标程序代码对应的抽象语法树;
遍历所述抽象语法树的各个树节点,生成与所述目标程序代码对应的上下文,并根据所述上下文生成至少一条中间指令;
确定各所述中间指令的运行顺序,并根据所述运行顺序生成与所述目标程序代码对应的中间表示。
第三方面,本发明实施例还提供了一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时用于执行如本发明实施例中任一实施例所述的中间表示的生成方法。
本发明实施例通过生成与目标程序代码对应的抽象语法树;遍历所述抽象语法树的各个树节点,生成与所述目标程序代码对应的上下文,并根据所述上下文生成至少一条中间指令;确定各所述中间指令的运行顺序,并根据所述运行顺序生成与所述目标程序代码对应的中间表示,可以解决相关技术中生成的中间表示较复杂的问题,可以生成完整表达目标程序代码语义的中间表示,并且该中间表示可以进一步转化为机器代码执行。
附图说明
图1是本发明实施例一中的一种中间表示的生成方法的流程图;
图2是本发明实施例二中的一种中间表示的生成方法的流程图;
图3是本发明实施例三中的一种中间表示的生成方法的流程图;
图4是本发明实施例四中的一种中间表示的生成方法的流程图;
图5是本发明实施例四中的一种中间表示的生成方法的流程图;
图6是本发明实施例四中的一种中间表示的生成方法的流程图;
图7是本发明实施例四中的一种形式参数的处理流程图;
图8是本发明实施例五中的一种中间表示的生成装置的结构示意图;
图9是本发明实施例六中的的一种计算机设备的结构示意图。
具体实施方式
下面结合附图和实施例对本发明实施例作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明实施例,而非对本发明实施例的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明实施例相关的部分而非全部结构。
本文使用的术语“中间表示”可以对目标程序代码的语义进行完整表达,并且可以进一步转化为机器代码执行。
本文使用的术语“上下文”可以包括识别标识(Identity Document,ID)、父上下文指针、子上下文指针(map)、目标程序代码的返回类型、变量、标签或者游标等。需要说明的是,与目标程序代码对应的上下文可以记录目标程序代码的抽象语法树的层级结构,其具体实现为一棵作用域树,在每个作用域中,还可以包含其定义的显式标签、隐式标签,以及游标信息等。
本文使用的术语“声明代码段”可以包括:函数名、返回类型以及所定义的形式参数等,其中,形式参数可以为空,也可以不为空。
为了便于理解,将本发明实施例的主要发明构思进行简述。
现有技术中,涉及到的中间表示主要有MySQL的存储过程模块所拥有的中间表示。
现有技术中涉及到的中间表示较复杂,并不能进一步转化为机器代码执行,而是需要通过自身的解释器进行解释执行,存在大量的函数调用开销。
基于上述思考,发明人创造性的提出,通过生成与目标程序代码对应的抽象语法树;遍历所述抽象语法树的各个树节点,生成与所述目标程序代码对应的上下文,并根据所述上下文生成至少一条中间指令;确定各所述中间指令的运行顺序,并根据所述运行顺序生成与所述目标程序代码对应的中间表示,可以解决相关技术中生成的中间表示较复杂的问题,可以生成完整表达目标程序代码语义的中间表示,并且该中间表示可以进一步转化为机器代码执行。
实施例一
图1为本发明实施例一提供的一种中间表示的生成方法的流程图,本实施例可适用于生成与程序代码对应的中间表示的情况,该方法可以由中间表示的生成装置来执行,该装置可以通过软件和/或硬件的方式实现,并集成在计算机设备中。具体的,参考图1,该方法具体包括如下步骤:
步骤110、生成与目标程序代码对应的抽象语法树。
其中,目标程序代码可以为任一程序代码,例如,实现数据计算的程序代码、实现数据存储的程序代码或者实现数据查询的程序代码等,本实施例中对其不加以限定。需要说明的是,本实施例中涉及到的程序代码可以为存储程序语言PL/SQL,即面向SQL的过程式语言。
在本实施例的一个可选实现方式中,生成与目标程序代码对应的抽象语法树,可以包括:对目标程序代码进行分析,将各分析结果分配在不同的树节点,以生成与程序代码对应的抽象语法树。
可以理解的是,在本实施例中与目标程序代码对应的抽象语法树包括一个根节点,以及至少一个子节点,例如,10个、15个或者50个等,本实施例中对其不加以限定。
示例性的,在本实施例中可以对目标程序代码A进行分析,得到目标程序代码A的语法结构,即得到各个分析结果,并进一步的将各个分析结果分配在不同的树节点,从而生成与目标程序代码A对应的抽象语法树。
步骤120、遍历抽象语法树的各个树节点,生成与目标程序代码对应的上下文,并根据上下文生成至少一条中间指令。
其中,与目标程序代码对应的上下文可以包括识别标识、父上下文指针、子上下文指针、目标程序代码的返回类型、变量、标签或者游标,本实施例中对其不加以限定。需要说明的是,与目标程序代码对应的上下文可以记录目标程序代码的抽象语法树的层级结构,其具体实现为一棵作用域树,在每个作用域中,还可以包含其定义的显式标签、隐式标签,以及游标信息等。
在本实施例的一个可选实现方式中,在生成与目标程序代码对应的抽象语法树之后,可以进一步的遍历抽象语法树的各个树节点,从而生成与目标程序代码对应的上下文。进一步的,可以根据与目标程序代码对应的上下文生成与目标程序代码对应的至少一条中间指令。
步骤130、确定各中间指令的运行顺序,并根据运行顺序生成与目标程序代码对应的中间表示。
在本实施例的一个可选实现方式中,在根据上下文生成各中间指令之后,可以进一步确定各个中间指令的运行顺序,并根据中间指令的运行顺序生成与目标程序代码对应的中间表示。
在本实施例的一个可选实现方式中,在根据上下文生成至少一条中间指令之后,可以将各条中间指令存储在数组中,其中,数组中可以对每条中间指令的地址进行标记;进一步的,可以根据每条中间指令的地址确定中间指令的运行顺序,进而生成与目标程序代码对应的中间表示。
可以理解的是,本实施例中涉及到的中间表示即为可以按照运行顺序进行运行的中间指令,其可以用简单的几个中间指令去描述整个PL/SQL过程,在本实施例中,中间指令可以包括以下几类:跳转指令、赋值指令(Setlnstr)、返回指令(Returnlnstr)、SQL指令(SQLlnstr)、游标打开(OpenInstr)、取数(FetchInstr)以及关闭指令(CloseInstr)等,本实施例中对其不加以限定。
其中,跳转指令又分为直接跳转指令(JumpInstr)和条件跳转指令(JumpCondInstr)。需要说明的是,在PL/SQL的语法中,条件语句IF…THEN…ELSIF…THEN…ELSE、循环语句WHILE/FOR RANGE LOOP/FOR CURSOR LOOP、EXIT以及GOTO等语法都是由跳转指令所实现。
赋值指令主要负责PL/SQL中各类赋值操作,例如,变量、常量定义和赋值,形参定义和实参赋值。
返回指令主要用于PL/SQL的函数当中,因为在PL/SQL中,函数是必须返回返回值的,返回指令通常意味着整个PL/SQL程序的退出。
SQL指令主要负责将PL/SQL中的SQL进行上下文设置后发送给SQL引擎,其中,如果是SELECT INTO这类的带赋值的语句,该指令还负责将取出的值进行赋值。
游标打开、取数以及关闭指令,由于游标是PL/SQL中较为特殊的部分,因此专门设计相关指令用于处理PL/SQL程序块中的游标操作。
本实施例的方案,通过生成与目标程序代码对应的抽象语法树;遍历抽象语法树的各个树节点,生成与目标程序代码对应的上下文,并根据上下文生成至少一条中间指令;确定各中间指令的运行顺序,并根据运行顺序生成与目标程序代码对应的中间表示,可以解决相关技术中生成的中间表示较复杂的问题,可以生成完整表达目标程序代码语义的中间表示,并且该中间表示可以进一步转化为机器代码执行。
实施例二
图2是本发明实施例二中的一种中间表示的生成方法的流程图,本实施例是对上述各技术方案的进一步细化,本实施例中的技术方案可以与上述一个或者多个实施例中的各个可选方案结合。如图2所示,中间表示的生成方法可以包括如下步骤:
步骤210、生成与目标程序代码对应的抽象语法树。
步骤220、检测抽象语法树中各个树节点所包含的变量的标识符,当存在至少两个相同的标识符时,对至少两个标识符进行修改。
其中,各个树节点所包含的变量的标识符可以为每个变量的ID,或者其他身份识别码,本实施例中对其不加以限定。
在本实施例的一个可选实现方式中,在生成与目标程序代码对应的抽象语法树之后,可以进一步的对抽象语法树中的各个树节点所包含的变量的标识符进行检测,以确定各个变量的标识符是否是唯一的;如果检测到两个或者两个以上的变量的标识符相同,则可以对这些变量的标识符进行修改,以使各个变量的标识符均不相同。
示例性的,若生成与目标程序代码对应的抽象语法树之后,发现树节点1的两个变量的ID均为0001,则可以对这两个变量的ID进行修改,例如,将第一变量的ID修改为00001,或者将第二变量的ID修改为00001,从而使树节点1中各个变量的ID不同。
这样设置的好处在于,可以避免不同作用域见得同名变量带来的冲突。
步骤230、初始化与目标程序代码对应的上下文以及中间指令数组。
其中,中间指令数组用于存储生成的各中间指令。
在本实施例的一个可选实现方式中,在得到目标程序代码的抽象语法树,并对抽象语法树进行检测之后,可以对与目标程序代码对应的上下文进行初始化;可选的,可以对上下文的ID、父上下文、子上下文、变量、返回类型、标签以及游标进行定义。
示例性的,可以根据如下代码对与目标程序代码对应的上下文进行定义:
需要说明的是,每个上下文都包含一个全局唯一的ID,在抽象语法树中,除根节点外,均拥有上级上下文(parent),并且可能存在下级上下文,同时会记录当前上下文中定义的所有变量,因为PL/SQL本身是默认按序执行的,所以这边所有的定义都是用一个有序map来进行实现。上下文中还会包含自身所定义的标签(包含显式explicitLabels和隐式labels)。returnField中定义了最终要返回的值。
进一步的,可以对中间指令数组进行初始化,在本实施例中,中间指令数组最初为一个空数组。需要说明的是,中间指令数组中可以包括所有中间指令,以及每条中间指令的跳转地址,其中,跳转指令包含其将要跳转的指令的地址,即其目标地址,而其他类型的指令则默认为地址序列+1后的指令为其下一条指令。
步骤240、在抽象语法树中,遍历与目标程序代码中的声明代码段对应的至少一个树节点,并将与声明代码段对应的第一参数添加至上下文或者中间指令数组中。
其中,第一参数包括:返回类型和/或形式参数。
其中,目标程序代码中的声明代码段可以包括:函数名、返回类型以及所定义的形式参数等,其中,形式参数可以为空,也可以不为空,本实施例中对其不加以限定。需要说明的是,声明代码段中可以包括多个形式参数,抽象语法树中,这些形式参数可以存储在与形式参数对应的树节点的形式参数数组中。
在本实施例的一个可选实现方式中,在对与目标程序代码对应的上下文以及中间指令数据进行初始化之后,可以进一步的在与目标程序代码对应的抽象语法树中,遍历与目标程序代码中的声明代码段对应的至少一个树节点,并将与声明代码段对应的第一参数添加至上下文或者中间指令数组中。
可选的,在抽象语法树中,遍历与目标程序代码中的声明代码段对应的至少一个树节点,并将与声明代码段对应的第一参数添加至上下文或者中间指令数组中,可以包括:遍历声明代码段中与形式参数对应的树节点,并确定树节点中的形式参数数组是否为空:若否,当形式参数数组中的至少一个形式参数中不包含默认值时,遍历各形式参数,依次将至少一个形式参数转换为目标变量,并将各目标变量按序添加至上下文中的变量中;或者,当形式参数数组中的目标形式参数中包含默认值时,根据形式参数以及默认值生成赋值指令,并将赋值指令添加至预先定义的中间指令数组中;遍历声明代码段中的返回类型对应的树节点,并将遍历到的返回类型添加至上下文的返回类型中。
其中,默认值可以为任一数值,例如,1、2或者3等,本实施例中对其不加以限定。
在具体实现中,可以在抽象语法树中,遍历声明代码段中与形式参数对应的树节点,并确定树节点中的形式参数数组是否为空;如果不为空,则继续确认形式参数数组中的至少一个形式参数中是否包含默认值,如果确定形式参数数组的中的至少一个形式参数中均不包含默认值,则可以对各形式参数进行遍历,依次将各个形式参数转换为目标变量,并将各个目标变量按照各形式参数在形式参数数组中的顺序添加至上下文的变量中;如果确定形式参数数组中的目标形式参数中包含默认值,在将形式参数转换为目标变量并加到上下文变量中的基础上,可以根据形式参数以及默认值生成赋值指令,并将生成的赋值指令添加至中间指令数组中。其中,目标形式参数可以为形式参数数组中的任意一个或者多个形式参数;例如,一个、两个或者三个等,本实施例中对其不加以限定。
示例性的,若目标形式参数为“a”,其默认值为“1”,则可以根据形式参数为“a”以及默认值“1”生成赋值指令“a:=1”,进一步的,可以将生成的赋值指令“a:=1”添加至中间指令数组中。
进一步的,可以遍历声明代码段中的返回类型对应的树节点,并将遍历到的返回类型添加至上下文的返回类型中。
步骤250、创建上下文的子上下文。
其中,子上下文与目标程序代码中的代码段(Block)对应,即所创建的上下文为Block的上下文。
步骤260、在抽象语法树中,遍历与Block对应的至少一个树节点,并将与Block对应的第二参数添加至子上下文或者中间指令数组中。
可选的,在抽象语法树中,遍历与Block对应的至少一个树节点,并将与Block对应的第二参数添加至子上下文或者中间指令数组中,可以包括:在抽象语法树中,判断与Block中的声明代码段对应的至少一个树节点中的变量数组中的目标变量是否包含默认值,若否,则仅将目标变量添加至子上下文中;若是,则在将目标变量加入子上下文的基础上,根据目标变量以及默认值生成目标赋值指令,并将目标赋值指令添加至预先定义的中间指令数组中。
在具体实现中,依次将各个变量转换为目标变量,并将各个目标变量按照各变量在变量数组中的顺序添加至子上下文的变量中。如果确定变量数组中的目标变量中包含默认值,则需要根据变量以及默认值生成赋值指令,并将生成的赋值指令添加至中间指令数组中。
在本实施例的另一个可选实现方式中,在将目标变量添加至子上下文中之后,如果目标变量存在默认值则额外生成目标赋值指令,并将目标赋值指令添加至预先定义的中间指令数组中;或者,可以进一步的,遍历Block的各子结构对应的至少一个树节点,并将与每个子结构对应的第二参数添加至与每个子结构对应的子上下文或者中间指令数组中。
其中,Block的各子结构可以包括:循环结构、赋值结构以及条件结构等,本实施例中对其不加以限定;第二参数中可以包括变量也可以包括具体的指令,例如,赋值指令,或者条件指令等,本实施例中对其不加以限定。
步骤270、确定各中间指令的运行顺序,并根据运行顺序生成与目标程序代码对应的中间表示。
本实施例的方案,通过初始化与目标程序代码对应的上下文以及中间指令数组;中间指令数组用于存储各中间指令;在抽象语法树中,遍历与目标程序代码中的声明代码段对应的至少一个树节点,并将与声明代码段对应的第一参数添加至上下文或者中间指令数组中;其中,第一参数包括:返回类型和/或形式参数;创建上下文的子上下文,子上下文与目标程序代码中的代码段Block对应;在抽象语法树中,遍历与Block对应的至少一个树节点,并将与Block对应的第二参数添加至子上下文或者中间指令数组中;其中,第二参数包含变量、标签、游标或者中间指令,可以快速地生成与目标程序代码对应的上下文以及各中间指令,为后续生成抽象较低的中间表示提供依据。
实施例三
图3是本发明实施例三中的一种中间表示的生成方法的流程图,本实施例是对上述各技术方案的进一步细化,本实施例中的技术方案可以与上述一个或者多个实施例中的各个可选方案结合。如图3所示,中间表示的生成方法可以包括如下步骤:
步骤310、生成与目标程序代码对应的抽象语法树。
步骤320、初始化回填栈结构。
初始化的回填栈结构为一个空栈,本实施例中可以通过如下方式对回填栈结构进行初始化。
其中,Backpatcher为回填栈结构的栈名,在回填栈结构中,使用Label记录原指令位置,BranchInstr为JumpInstr和JumpCondInstr的接口定义,表示需要回填的指令。
需要说明的是,本实施例中,在生成中间指令的过程中,有时不知道当前中间指令的下一条中间指令的地址,即当前中间指令的跳转地址属性为空,因此,需要等到目标指令生成后,将其地址回填到当前中间指令中。
步骤330、当第二参数为目标中间指令,且无法确定目标中间指令的跳转地址时,则将与目标中间指令对应的指针添加至回填栈结构中。
在本实施例的一个可选实现方式中,在抽象语法树中,遍历与Block对应的至少一个树节点,得到多个第二参数,且第二参数中包含目标中间指令,并且无法确定目标中间指令的跳转地址时,则可以将目标中间指令的指针添加至回填栈结构中。
步骤340、直至生成指令为目标中间指令的目标跳转指令时,通过回填栈结构将目标跳转指令的地址回填到目标中间指令的跳转地址中。
可以理解的是,回填栈结构中保存了目标中间指令的指针,可以实现在回填栈结构中访问中间指令数组中的目标中间指令,当确定目标中间指令的跳转指令时,即可在回填栈结构中对目标中间指令的跳转指令进行赋值。
步骤350、确定各中间指令的运行顺序,并根据运行顺序生成与目标程序代码对应的中间表示。
本实施例的方案,通过初始化回填栈结构;当第二参数为目标中间指令,且无法确定目标中间指令的跳转地址时,则将与目标中间指令对应的指针添加至回填栈结构中;直至生成指令为目标中间指令的目标跳转指令时,通过回填栈结构将目标跳转指令地址回填到目标中间指令的跳转地址中,可以实现中间指令的跳转地址的回填,为后续生成抽象较低的中间表示提供依据。
实施例四
图4是本发明实施例四中的一种中间表示的生成方法的流程图,本实施例是对上述各技术方案的进一步细化,本实施例中的技术方案可以与上述一个或者多个实施例中的各个可选方案结合。如图4所示,中间表示的生成方法可以包括如下步骤:
步骤410、生成与目标程序代码对应的抽象语法树。
步骤420、初始化与目标程序代码对应的上下文以及中间指令数组。
步骤430、在抽象语法树中,遍历与目标程序代码中的声明代码段对应的至少一个树节点,并将与声明代码段对应的第一参数添加至上下文或者中间指令数组中。
步骤440、创建上下文的子上下文,子上下文与目标程序代码中的代码段Block对应。
步骤450、在抽象语法树中,遍历与Block对应的至少一个树节点,并将与Block对应的第二参数添加至子上下文或者中间指令数组中。
步骤460、检测回填栈结构是否为空。
若是,则结束生成与目标程序代码对应的上下文以及至少一条中间指令的操作;若否,则提示错误,并退出。
步骤470、将各中间指令存储在中间指令数组中,根据中间指令数组中各中间指令的跳转地址确定各中间指令的运行顺序,并根据运行顺序生成与目标程序代码对应的中间表示。
在本实施例的一个可选实现方式中,确定各中间指令的运行顺序,并根据运行顺序生成与目标程序代码对应的中间表示,可以包括:将各中间指令存储在中间指令数组中,根据中间指令数组中各中间指令的跳转地址确定各中间指令的运行顺序,并根据运行顺序生成与目标程序代码对应的中间表示。
本实施例的方案,将各中间指令存储在中间指令数组中,根据中间指令数组中各中间指令的跳转地址确定各中间指令的运行顺序,并根据运行顺序生成与目标程序代码对应的中间表示,可以准确地确定与目标程序代码对应的中间表示,并且生成的中间表示可以完整地对目标程序代码进行表示。
为了使本领域技术人员更好地理解本实施例中间表示的生成方法,下面采用如图5所示的中间表示的生成方法的流程图进行说明,具体过程有:
步骤510、抽象语法树。
步骤520、阿尔法变换。
其中,阿尔法变换(α-transform)指的是将语法树中的出现的标识符加上唯一的ID,使得变量名唯一。这样设置的好处在于,避免了不同作用域间的同名变量带来的冲突。
步骤530、类型推断。
其中,类型推断负责推断在阿尔法变换中未明确定义的类型的变量的类型,属于编译时确定而不是运行时确定的内容。在运行时还有运行时的类型推断。在PL/SQL的类型推断当中,主要负责%TYPE的类型推断以及%ROWTYPE的类型推断。其中%ROWTYPE的推断并不能直接推断出类型,而是需要延迟到运行时进行推断。
步骤540、中间表示生成。
中间表示生成从原理上讲主要是遍历抽象语法树节点,然后生成对应的指令序列以及对应的符号表和运行上下文。其中符号表中主要包含该语法树节点所定义的所有常量和变量(包含形式参数)。而运行上下文则记录了原语法树的层级结构,具体实现为一棵作用域树,在每个作用域中,还包含了其定义的显式label以及隐式label,以及游标信息。
同时,在遍历语法树时,为了确定所有指令的运行顺序序号,使用栈结构来进行Backpatch过程信息的存储。
为了更好地理解本发明实施例,下面以PL/SQL中的函数来讲解中间指令生成过程。以FOR循环语句作为指令生成场景。
原始的PL/SQL代码如下,需要说明的是,下文中涉及到的目标代码即为下述代码:
上述代码中定义了一个变量abc,然后定一个FOR循环,循环从i为1到3,然后依次将abc赋值为abc+5,然后循环结束。
首先,生成与目标代码对应的抽象语法树,本发明实施例中不对抽象语法树的生成过程进行赘述,可以理解的是,其并不是对本发明实施例的限定。在抽象语法树生成之后,再经过阿尔法变换和类型推断对抽象语法树部分节点进行修改,然后就可以进行中间指令生成。中间指令的生成采取一种嵌套分支结构来实现,主要流程如图6所示:
步骤610、初始化上下文、中间指令集和回填栈结构。
步骤620、检测形式参数数组是否为空。
若否,执行步骤630;
若是,执行步骤640。
步骤630、参数赋值。
在本实施例的一个可选实现方式中,当形式参数数组不为空时,可以参照图7对形式参数进行处理;参照图7,形式参数的处理流程主要包括如下步骤:
步骤710、循环遍历形参数组。
步骤720、检测遍历是否结束。
若是,则结束遍历;
若否,则执行步骤730。
步骤730、定义变量,添加到当前上下文中。
步骤740、检测是否包含默认值。
若是,执行步骤750;
若否,执行步骤720。
步骤750、生成赋值指令,并添加至指令数组。
在本实施例中,形式参数处理主要就是将形式参数转变为上下文中的变量,如果形式参数带有默认值,将会生成赋值指令(SetInstr),该指令将会被加入到中间指令数组当中。SetInstr的结构如下:
可以看到,SetInstr主要包含两个成员,第一个为名字,即变量名,第二个为表达式,通常用来存储被赋予变量的值或者一个复杂表达式。
步骤640、设置上下文中的返回参数类型。
步骤650、创建子上下文,设置当前上下文为子上下文。
在解析形式参数过程结束后,这个时候将会设置函数的返回类型到当前上下文当中,然后将会新建一个子上下文,并将当前上下文设为子上下文,因为接下来要做Block的解析,在PL/SQL中,每一个Block之间相互独立,拥有自己的作用域,因此这边需要为Block单独设定上下文。emitBlock过程为生成中间表示最重要也最复杂的过程,由于语句支持较多,本文仅以目标代码生成的语法树进行阐述。
步骤660、检测Block是否为空。
若是,执行步骤670;
若否,执行步骤680。
步骤670、设置当前上下文为父上下文。
步骤680、参数赋值。
在语法树的Block子树中,首先遍历Block中的声明(即OptDeclarationSpecs),在前文提到,该声明通常包含变量、常量、类型、子类型、游标等声明。在本目标代码中,主要为变量声明。变量声明和形式参数声明的处理过程完全一样,同样是添加变量,如果有默认值,则添加SetInstr到中间指令数组,此处不在赘述。需要注意的是,此处的变量被添加到的上下文和形式参数不一样,当前上下文为Block的上下文。
声明解析完成之后,将会便利Block中的Statements,也就是语法树中的PLStatements数组。在本示例当中,主要有三个PLStatement,按序进行处理。
首先处理PLStatements数组中的第一个元素,为一个AssignmentStatement。AssignmentStatement相对来说比较简单,其对应在中间表示中就是一个SetInstr,从语法树解析可以知道,生成的SetInstr的Name为‘abc’,Expr为Literal{1}(Literal为Expr的十进制实现)。将SetInstr加入到中间表示数组当中。
然后处理PLStatements数组的第二个元素,为一个LoopStatement,具体流程如下:
a.在PL/SQL的循环中,循环拥有独立的作用域,因此要从当前上下文创建一个子上下文,为循环上下文,并将当前上下文设为新创建的上下文。
b.上文提到,我们使用label来辅助回填栈结构,进行执行跳转,在本发明中,如何设定指令序号以及指令跳转为该发明的精髓。为了能够在循环体一次执行结束跳转到循环体开头,我们需要在这边设定一个隐式label来辅助跳转。label的数据结构如下:
其中ip代表着label所对应指令的地址,name为label名,tp为label类型,此处的类型为循环Label。在新建label时,我们设定的ip为当前中间指令数组的长度。因为在本发明的设计中,指令序号从0开始,因此序号为指令数组长度的,刚好为当前指令集下一条指令(注意,该指令还没有生成)。label创建完成后,加入当前上下文的label栈中。
c.创建完成label后,进入正式的循环子树的处理当中,在本示例中,为一个FORIN的范围循环,PL/SQL中还包含WHILE、BASIC LOOP、FOR CURSOR等类型的循环,原理类似。首先处理ForLoopParam,其对应着目标代码里的FOR i IN 1..3<类似for(i=1;i<=3;i++)>。在语法树中,我们得到indexParam为i,此为循环变量,因此我们要在当前上下文中添加一个变量i;然后处理LowerBound,因为循环是从LowerBound开始,所以其实等价于先将LowerBound赋值给i,因此这边需要生成一条SetInstr,将该指令加入到中间指令数组当中。
d.接下来需要创建跳转进循环体的指令,在PL/SQL的循环语法中,循环体至少会被执行一次,所以先创建跳转循环体的指令,在本发明中,跳转指令数据结构如下:
可以看到,跳转指令非常简单,就一个跳转目标地址Dest。在创建跳转进循环体指令时,需要设置该指令的Dest为当前指令集长度加3。此时我们并没有遍历到循环体子树(LoopStatment中的SeqOfStatement子树)。但是我们知道,在非第一次循环体执行之前会有将循环变量先加1,再跟UpperBound比较确定是否结束循环的动作,而在本发明中,这两个动作由两个指令完成,因此这边的Dest可以直接加3,跳进循环体。
e.在d步骤中提到,在第二次乃至后面的循环执行中,会执行i++,然后比较i<=UpperBound动作,因此i++这条对应的指令为第二次乃至后面循环开始的跳转点,于是,我们在b步骤中创建的label,此时需要将ip设为该指令所在地址,即当前中间指令数组的长度。
f.生成i++指令,即i:=i+1,为一个赋值指令,不在赘述,e中的label即指向此条指令
g.生成判断i<=UpperBound指令,根据前文可以知道,该条指令控制着循环体的结束。如果这个判断为真,那么继续执行循环,如果为假,那么跳出循环,执行循环体之外的指令。在本发明中,设计了条件跳转指令JumpCondInstr,该指令数据结构如下:
可以看到,该指令包含了跳转目标地址Dest以及条件表达式Cond,其中Dest为条件为假时的跳转地址,而条件为真时,按照中间表示顺序执行的特性,跳转地址为当前指令序号+1。而该指令下面的指令就是真正的循环体中的指令,也就是d步骤中提到的循环体,因此+1之后正好执行循环体。而循环结束后的下一条指令地址,目前并不知道,因此循环体本身还没有被解析。因此,这个时候就需要借助backpatch来添加标记,此时复用之前的循环label,由label和该JumpCondInstr构建entryInfo,添加到Backpatch的entries数组中。
h.接下来生成循环体中的PLStatement数组,从语法树中可以看到,只有一个AssignmentStatement,处理和先前类似,不再赘述。
i.循环体指令生成完后,此时需要跳转到f步骤中生成的指令位置,进行i++,从而形成了循环。而该指令的地址就是在循环label中定义的ip,于是添加一条JumpInstr,地址为循环label中设定的地址。
j.此时整个循环体的指令生成已经完成,相当于已经在循环体外,因此需要在此处去回填g步骤中JumpCondInstr中的Dest地址,其值为中间指令数组大小,在回填的过程中,需要将label出栈,以及对应的entryInfo需要删除掉。
k.整个LoopStatement树遍历完成,指令生成完成。此时需要退出循环上下文,将当前上下文回退到父级上下文。
最后处理ReturnStatement,ReturnStatement相对简单,对应中间表达中的ReturnInstr,ReturnInstr的数据结构如下:
ReturnInstr包含了一个表达式,在ReturnInstr的执行时,将会计算该表达式,结束之后将跳转地址置为-1,至此整个Block解析生成中间表达完成。
退出当前Block上下文,回退到该Block父级上下文(本示例中为根上下文)。最后检查backpatch的entries数组是否为空来判断是否存在没有回填的指令,如果存在,那肯定是存在转换问题。
至此整个中间表示转换结束。
步骤690、检测回填栈结构是否为空。
若是,执行步骤691;
若否,执行步骤692。
步骤691、结束。
步骤692、提示错误,程序退出。
示例性的,由本实施例中的目标代码生成的中间表示如下所示:
0 Set abc=INT64(1)
1 Set i=INT64(1)
2 Jump 5
3 Set i=:i+INT64(1)
4 Jump 5On:i<=INT64(3);Else:7
5 Set abc=:abc+INT64(5)
6 Jump 3
7 Return:abc
在本发明实施例中所阐述的中间表示,均以顺序执行的方式进行执行,可以看到执行步骤推演如下:
0号指令为SetInstr,将abc赋值为1,对应目标代码中的abc:=1;
1号指令为SetInstr,将循环变量i赋值为1,对应LoopStatement处理步骤中的c步骤;
2号指令为JumpInstr,跳转到5号指令,对应LoopStatement处理步骤中的d步骤;
5号指令为SetInstr,对应目标代码循环体中的abc=abc+5,对应LoopStatement处理步骤中的h步骤;
6号指令为JumpInstr,跳转回3号指令,也就是i++的位置,对应LoopStatement处理步骤中的g步骤;
3号指令为SetInstr,执行i++,对应LoopStatement处理步骤中的f步骤;
4号指令为JumpCondInstr,判断i<=3,如果满足,跳转到5,继续循环体执行,如果不满足跳转到7。省略中间过程,跳转到7号指令为ReturnInstr,返回abc的值。
本发明实施例所涉及到的中间表示,能够完整的表示PL/SQL的语义,支持变量常量定义和赋值,支持复杂表达式计算,支持条件,循环,顺序控制等控制语句,还支持游标,异常处理等。并且,本发明实施例所涉及到的中间表示,能够进一步转化到LLVM(Low LevelVirtual Machine,底层虚拟机)的中间表示,从而通过LLVM后端去生成对应的目标机器代码,可以在多种体系架构的平台上运行,相比于解释执行,性能呈现数量级的提升。再者,本发明实施例所涉及的编译器为分布式数据库上的编译器,并发量和吞吐量相比单机数据库有数量级的飞跃。最后,本发明实施例所涉及到的中间语言可以做比较好的执行层面的优化,比如经过Loop-Carried分析后进行的循环优化。
实施例五
图8是本发明实施例五中的一种中间表示的生成装置的结构示意图,该装置可以执行上述各实施例中涉及到的中间表示的生成方法。参照图8,该装置包括:抽象语法树的生成模块810、上下文生成模块820以及中间表示生成模块830。
其中,抽象语法树的生成模块810,用于生成与目标程序代码对应的抽象语法树;
上下文生成模块820,用于遍历抽象语法树的各个树节点,生成与目标程序代码对应的上下文,并根据上下文生成至少一条中间指令;
中间表示生成模块830,用于确定各中间指令的运行顺序,并根据运行顺序生成与目标程序代码对应的中间表示。
本实施例的方案,通过象语法树的生成模块生成与目标程序代码对应的抽象语法树;通过上下文生成模块遍历抽象语法树的各个树节点,生成与目标程序代码对应的上下文,并根据上下文生成至少一条中间指令;通过中间表示生成模块确定各中间指令的运行顺序,并根据运行顺序生成与目标程序代码对应的中间表示,可以解决相关技术中生成的中间表示较复杂的问题,可以生成完整表达目标程序代码语义的中间表示,并且该中间表示可以进一步转化为机器代码执行。
可选的,上下文生成模块820,包括:
初始化子模块,用于初始化与目标程序代码对应的上下文以及中间指令数组;中间指令数组用于存储各中间指令;
第一遍历子模块,用于在抽象语法树中,遍历与目标程序代码中的声明代码段对应的至少一个树节点,并将与声明代码段对应的第一参数添加至上下文或者中间指令数组中;其中,第一参数包括:返回类型和/或形式参数;
子上下文创建子模块,用于创建上下文的子上下文,子上下文与目标程序代码中的代码段Block对应;
第二遍历子模块,用于在抽象语法树中,遍历与Block对应的至少一个树节点,并将与Block对应的第二参数添加至子上下文或者中间指令数组中;其中,第二参数包含变量、标签、游标或者中间指令。
可选的,上下文生成模块820,还包括:
回填栈结构初始化子模块,用于初始化回填栈结构;
当第二参数为目标中间指令,且无法确定目标中间指令的跳转地址时,则将与目标中间指令对应的指针添加至回填栈结构中;
直至生成指令为目标中间指令的目标跳转指令时,通过回填栈结构将目标跳转指令地址回填到目标中间指令的跳转地址中。
可选的,中间表示的生成装置,还包括:回填栈结构检测模块,用于
检测回填栈结构是否为空,若是,则结束生成与目标程序代码对应的上下文以及至少一条中间指令的操作;若否,则提示错误,并退出。
可选的,初始化子模块,具体用于
定义上下文的识别标识ID、父上下文、子上下文、变量、返回类型、标签以及游标中至少一项。
可选的,第一遍历子模块,具体用于
遍历声明代码段中与形式参数对应的树节点,并确定树节点中的形式参数数组是否为空:
若否,当形式参数数组中的至少一个形式参数中不包含默认值时,遍历各形式参数,依次将至少一个形式参数转换为目标变量,并将各目标变量按序添加至上下文中的变量中;或者,当形式参数数组中的目标形式参数中包含默认值时,根据形式参数以及默认值生成赋值指令,并将赋值指令添加至预先定义的中间指令数组中;
遍历声明代码段中的返回类型对应的树节点,并将遍历到的返回类型添加至上下文的返回类型中。
可选的,第二遍历子模块,具体用于
在抽象语法树中,判断与Block中的声明代码段对应的至少一个树节点中的变量数组中的目标变量是否包含默认值,
若是,则根据目标变量以及默认值生成目标赋值指令,并将目标赋值指令添加至预先定义的中间指令数组中;否则,将目标变量添加至子上下文中;
遍历Block的各子结构对应的至少一个树节点,并将与每个子结构对应的第二参数添加至与每个子结构对应的子上下文或者中间指令数组中。
可选的,中间表示生成模块830,具体用于
将各中间指令存储在中间指令数组中,根据中间指令数组中各中间指令的跳转地址确定各中间指令的运行顺序,并根据运行顺序生成与目标程序代码对应的中间表示。
可选的,抽象语法树的生成模块810,具体用于对目标程序代码进行分析,将各分析结果分配在不同的树节点,以生成与程序代码对应的抽象语法树。
可选的,中间表示的生成装置,还包括:
抽象语法树检测模块,用于检测抽象语法树中各个树节点所包含的变量的标识符,当存在至少两个相同的标识符时,对至少两个标识符进行修改。
本发明实施例所提供的中间表示的生成装置可执行本发明任意实施例所提供的中间表示的生成方法,具备执行方法相应的功能模块和有益效果。
实施例六
图9为本发明实施例六提供的一种计算机设备的结构示意图,如图9所示,该计算机设备包括处理器90、存储器91、输入装置92和输出装置93;计算机设备中处理器90的数量可以是一个或多个,图9中以一个处理器90为例;计算机设备中的处理器90、存储器91、输入装置92和输出装置93可以通过总线或其他方式连接,图9中以通过总线连接为例。
存储器91作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本发明实施例中的中间表示的生成方法对应的程序指令/模块(例如,中间表示的生成装置中的抽象语法树的生成模块810、上下文生成模块820以及中间表示生成模块830)。处理器90通过运行存储在存储器91中的软件程序、指令以及模块,从而执行计算机设备的各种功能应用以及数据处理,即实现上述的中间表示的生成方法。
存储器91可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据终端的使用所创建的数据等。此外,存储器91可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储器91可进一步包括相对于处理器90远程设置的存储器,这些远程存储器可以通过网络连接至计算机设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
输入装置92可用于接收输入的数字或字符信息,以及产生与计算机设备的用户设置以及功能控制有关的键信号输入。输出装置93可包括显示屏等显示设备。
实施例七
本发明实施例七还提供一种包含计算机可执行指令的存储介质,所述计算机可执行指令在由计算机处理器执行时用于执行一种中间表示的生成方法,该方法包括:
生成与目标程序代码对应的抽象语法树;
遍历所述抽象语法树的各个树节点,生成与所述目标程序代码对应的上下文,并根据所述上下文生成至少一条中间指令;
确定各所述中间指令的运行顺序,并根据所述运行顺序生成与所述目标程序代码对应的中间表示。
当然,本发明实施例所提供的一种包含计算机可执行指令的存储介质,其计算机可执行指令不限于如上所述的方法操作,还可以执行本发明任意实施例所提供的中间表示的生成方法中的相关操作。
通过以上关于实施方式的描述,所属领域的技术人员可以清楚地了解到,本发明可借助软件及必需的通用硬件来实现,当然也可以通过硬件实现,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如计算机的软盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(RandomAccess Memory,RAM)、闪存(FLASH)、硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
值得注意的是,上述中间表示的生成装置的实施例中,所包括的各个单元和模块只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。
Claims (19)
1.一种中间表示的生成方法,其特征在于,包括:
生成与目标程序代码对应的抽象语法树;
遍历所述抽象语法树的各个树节点,生成与所述目标程序代码对应的上下文,并根据所述上下文生成至少一条中间指令;
确定各所述中间指令的运行顺序,并根据所述运行顺序生成与所述目标程序代码对应的中间表示;
所述遍历所述抽象语法树的各个树节点,生成与所述目标程序代码对应的上下文,并根据所述上下文生成至少一条中间指令,包括:
初始化与所述目标程序代码对应的上下文以及中间指令数组;所述中间指令数组用于存储各所述中间指令;
在所述抽象语法树中,遍历与所述目标程序代码中的声明代码段对应的至少一个树节点,并将与所述声明代码段对应的第一参数添加至所述上下文或者所述中间指令数组中;其中,所述第一参数包括:返回类型和/或形式参数;
创建所述上下文的子上下文,所述子上下文与所述目标程序代码中的代码段Block对应;
在所述抽象语法树中,遍历与所述Block对应的至少一个树节点,并将与所述Block对应的第二参数添加至所述子上下文或者所述中间指令数组中;其中,所述第二参数包含变量、标签、游标或者中间指令。
2.根据权利要求1所述的方法,其特征在于,所述遍历所述抽象语法树的各个树节点,生成与所述目标程序代码对应的上下文,并根据所述上下文生成至少一条中间指令,还包括:
初始化回填栈结构;
当所述第二参数为目标中间指令,且无法确定所述目标中间指令的跳转地址时,则将与所述目标中间指令对应的指针添加至所述回填栈结构中;
直至生成指令为所述目标中间指令的目标跳转指令时,通过所述回填栈结构将所述目标跳转指令地址回填到所述目标中间指令的跳转地址中。
3.根据权利要求2所述的方法,其特征在于,在遍历所述抽象语法树的各个树节点之后,还包括:
检测所述回填栈结构是否为空,若是,则结束生成与所述目标程序代码对应的上下文以及至少一条中间指令的操作;若否,则提示错误,并退出。
4.根据权利要求1所述的方法,其特征在于,所述初始化与所述目标程序代码对应的上下文,包括:
定义所述上下文的识别标识ID、父上下文、子上下文、变量、返回类型、标签以及游标中至少一项。
5.根据权利要求1所述的方法,其特征在于,所述在所述抽象语法树中,遍历与所述目标程序代码中的声明代码段对应的至少一个树节点,并将与所述声明代码段对应的第一参数添加至所述上下文或者所述中间指令数组中,包括:
遍历所述声明代码段中与所述形式参数对应的树节点,并确定所述树节点中的形式参数数组是否为空:
若否,当所述形式参数数组中的至少一个形式参数中不包含默认值时,遍历各所述形式参数,依次将至少一个所述形式参数转换为目标变量,并将各所述目标变量按序添加至所述上下文中的变量中;或者,当所述形式参数数组中的目标形式参数中包含默认值时,根据所述形式参数以及所述默认值生成赋值指令,并将所述赋值指令添加至预先定义的中间指令数组中;
遍历所述声明代码段中的返回类型对应的树节点,并将遍历到的返回类型添加至所述上下文的返回类型中。
6.根据权利要求1所述的方法,其特征在于,所述在所述抽象语法树中,遍历与所述Block对应的至少一个树节点,并将与所述Block对应的第二参数添加至所述子上下文或者所述中间指令数组中,包括:
在所述抽象语法树中,判断与所述Block中的声明代码段对应的至少一个树节点中的变量数组中的目标变量是否包含默认值,
若是,则根据所述目标变量以及所述默认值生成目标赋值指令,并将所述目标赋值指令添加至预先定义的中间指令数组中;否则,将所述目标变量添加至所述子上下文中;
遍历所述Block的各子结构对应的至少一个树节点,并将与每个子结构对应的第二参数添加至与每个子结构对应的子上下文或者所述中间指令数组中。
7.根据权利要求1所述的方法,其特征在于,所述确定各所述中间指令的运行顺序,并根据所述运行顺序生成与所述目标程序代码对应的中间表示,包括:
将各所述中间指令存储在中间指令数组中,根据所述中间指令数组中各所述中间指令的跳转地址确定各所述中间指令的运行顺序,并根据所述运行顺序生成与所述目标程序代码对应的中间表示。
8.根据权利要求1所述的方法,其特征在于,所述生成与目标程序代码对应的抽象语法树,包括:
对所述目标程序代码进行分析,将各分析结果分配在不同的树节点,以生成与所述程序代码对应的抽象语法树。
9.根据权利要求8所述的方法,其特征在于,在生成与所述程序代码对应的抽象语法树之后,还包括:
检测所述抽象语法树中各个树节点所包含的变量的标识符,当存在至少两个相同的标识符时,对至少两个所述标识符进行修改。
10.一种计算机设备,包括处理器和存储器,所述存储器用于存储指令,当所述指令执行时使得所述处理器执行以下操作:
生成与目标程序代码对应的抽象语法树;
遍历所述抽象语法树的各个树节点,生成与所述目标程序代码对应的上下文,并根据所述上下文生成至少一条中间指令;
确定各所述中间指令的运行顺序,并根据所述运行顺序生成与所述目标程序代码对应的中间表示;
所述处理器是设置为通过以下方式遍历所述抽象语法树的各个树节点,生成与所述目标程序代码对应的上下文,并根据所述上下文生成至少一条中间指令:
初始化与所述目标程序代码对应的上下文以及中间指令数组;所述中间指令数组用于存储各所述中间指令;
在所述抽象语法树中,遍历与所述目标程序代码中的声明代码段对应的至少一个树节点,并将与所述声明代码段对应的第一参数添加至所述上下文或者所述中间指令数组中;其中,所述第一参数包括:返回类型和/或形式参数;
创建所述上下文的子上下文,所述子上下文与所述目标程序代码中的Block对应;
在所述抽象语法树中,遍历与所述Block对应的至少一个树节点,并将与所述Block对应的第二参数添加至所述子上下文或者所述中间指令数组中;其中,所述第二参数包含变量、标签、游标或者中间指令。
11.根据权利要求10所述的设备,其特征在于,所述处理器还设置为通过以下方式遍历所述抽象语法树的各个树节点,生成与所述目标程序代码对应的上下文,并根据所述上下文生成至少一条中间指令:
初始化回填栈结构;
当所述第二参数为目标中间指令,且无法确定所述目标中间指令的跳转地址时,则将与所述目标中间指令对应的指针添加至所述回填栈结构中;
直至生成指令为所述目标中间指令的目标跳转指令时,通过所述回填栈结构将所述目标跳转指令回填到所述目标中间指令的跳转地址中。
12.根据权利要求11所述的设备,其特征在于,所述处理器在遍历所述抽象语法树的各个树节点之后,还被设置为:
检测所述回填栈结构是否为空,若是,则结束生成与所述目标程序代码对应的上下文以及至少一条中间指令的操作;若否,则提示错误,并退出。
13.根据权利要求10所述的设备,其特征在于,所述处理器是设置为通过以下方式初始化与所述目标程序代码对应的上下文:
定义所述上下文的识别标识ID、父上下文、子上下文、变量、返回类型、标签以及游标中至少一项。
14.根据权利要求10所述的设备,其特征在于,所述处理器是设置为通过以下方式在所述抽象语法树中,遍历与所述目标程序代码中的声明代码段对应的至少一个树节点,并将与所述声明代码段对应的第一参数添加至所述上下文或者所述中间指令数组中:
遍历所述声明代码段中与所述形式参数对应的树节点,并确定所述树节点中的形式参数数组是否为空:
若否,当所述形式参数数组中的至少一个形式参数中不包含默认值时,遍历各所述形式参数,依次将至少一个所述形式参数转换为目标变量,并将各所述目标变量按序添加至所述上下文中的变量中;或者,当所述形式参数数组中的目标形式参数中包含默认值时,根据所述形式参数以及所述默认值生成赋值指令,并将所述赋值指令添加至预先定义的中间指令数组中;
遍历所述声明代码段中的返回类型对应的树节点,并将遍历到的返回类型添加至所述上下文的返回类型中。
15.根据权利要求10所述的设备,其特征在于,所述处理器是设置为通过以下方式在所述抽象语法树中,遍历与所述Block对应的至少一个树节点,并将与所述Block对应的第二参数添加至所述子上下文或者所述中间指令数组中:
在所述抽象语法树中,判断与所述Block中的声明代码段对应的至少一个树节点中的变量数组中的目标变量是否包含默认值,
若是,则根据所述目标变量以及所述默认值生成目标赋值指令,并将所述目标赋值指令添加至预先定义的中间指令数组中;否则,将所述目标变量添加至所述子上下文中;
遍历所述Block的各子结构对应的至少一个树节点,并将与每个子结构对应的第二参数添加至与每个子结构对应的子上下文或者所述中间指令数组中。
16.根据权利要求10所述的设备,其特征在于,所述处理器是设置为通过以下方式确定各所述中间指令的运行顺序,并根据所述运行顺序生成与所述目标程序代码对应的中间表示:
将各所述中间指令存储在中间指令数组中,根据所述中间指令数组中各所述中间指令的跳转地址确定各所述中间指令的运行顺序,并根据所述运行顺序生成与所述目标程序代码对应的中间表示。
17.根据权利要求10所述的设备,其特征在于,所述处理器是设置为通过以下方式生成与目标程序代码对应的抽象语法树:
对所述目标程序代码进行分析,将各分析结果分配在不同的树节点,以生成与所述程序代码对应的抽象语法树。
18.根据权利要求17所述的设备,其特征在于,所述处理器在生成与所述程序代码对应的抽象语法树之后,还被设置为:
检测所述抽象语法树中各个树节点所包含的变量的标识符,当存在至少两个相同的标识符时,对至少两个所述标识符进行修改。
19.一种包含计算机可执行指令的存储介质,其特征在于,所述计算机可执行指令在由计算机处理器执行时用于执行如权利要求1-9中任一所述的中间表示的生成方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011217087.XA CN112346730B (zh) | 2020-11-04 | 2020-11-04 | 一种中间表示的生成方法、计算机设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011217087.XA CN112346730B (zh) | 2020-11-04 | 2020-11-04 | 一种中间表示的生成方法、计算机设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112346730A CN112346730A (zh) | 2021-02-09 |
CN112346730B true CN112346730B (zh) | 2021-08-27 |
Family
ID=74428407
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011217087.XA Active CN112346730B (zh) | 2020-11-04 | 2020-11-04 | 一种中间表示的生成方法、计算机设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112346730B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115964028B (zh) * | 2021-10-12 | 2023-11-03 | 讯联数据(无锡)有限公司 | 第三方支付接口的快速接入方法及系统 |
CN114816349B (zh) * | 2022-04-22 | 2023-09-29 | 珠海市奥德维科技有限公司 | 一种自动化设备控制软件开发方法、系统和存储介质 |
CN115809063B (zh) * | 2022-12-05 | 2023-08-22 | 星环信息科技(上海)股份有限公司 | 一种存储过程编译方法、系统、电子设备和存储介质 |
Family Cites Families (28)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5584024A (en) * | 1994-03-24 | 1996-12-10 | Software Ag | Interactive database query system and method for prohibiting the selection of semantically incorrect query parameters |
JP3430252B2 (ja) * | 2000-01-24 | 2003-07-28 | 独立行政法人産業技術総合研究所 | ソースコード変換方法、ソースコード変換プログラムを記録した記録媒体及びソースコード変換装置 |
US7146352B2 (en) * | 2003-06-23 | 2006-12-05 | Microsoft Corporation | Query optimizer system and method |
KR100692172B1 (ko) * | 2005-03-30 | 2007-03-12 | 아이티플러스 주식회사 | 종합 문자열 분석기 및 그 분석 방법 |
US8214795B2 (en) * | 2008-11-26 | 2012-07-03 | Optumsoft, Inc. | Efficient automated translation of procedures in constraint-based language |
CN102117228B (zh) * | 2011-02-28 | 2013-10-16 | 复旦大学 | 一种动静态结合的Java程序异常处理优化方法 |
US9104449B2 (en) * | 2012-06-18 | 2015-08-11 | Google Inc. | Optimized execution of dynamic languages |
US10061573B2 (en) * | 2013-01-29 | 2018-08-28 | Mobilize.Net Corporation | User interfaces of application porting software platform |
CN104182267B (zh) * | 2013-05-21 | 2019-10-25 | 南京中兴新软件有限责任公司 | 编译方法、解释方法、装置及用户设备 |
CN103761265A (zh) * | 2014-01-02 | 2014-04-30 | 上海起维信息科技有限公司 | 一种基于NoSQL的医疗信息系统数据库实现方法 |
JP2018510445A (ja) * | 2015-04-02 | 2018-04-12 | データウェア ベンチャーズ,エルエルシー | プログラム性能を向上させる領域特化システムおよび方法 |
WO2016163901A1 (en) * | 2015-04-07 | 2016-10-13 | Huawei Technologies Co., Ltd. | An apparatus for processing an abstract syntax tree being associated with a source code of a source program |
CN106371829B (zh) * | 2016-08-24 | 2019-05-17 | 北京邮电大学 | 基于模块化思想的模板框架设计方法及系统 |
CN106970819B (zh) * | 2017-03-28 | 2020-07-10 | 清华大学 | 一种基于prdl规则描述语言的c程序代码规范检查装置 |
US10360002B2 (en) * | 2017-06-06 | 2019-07-23 | Informatica Llc | Method, apparatus, and computer-readable medium for generating an alternative implementation of a program on one or more engines |
CN108228187B (zh) * | 2018-01-02 | 2020-03-17 | 南京大学 | 一种数值程序的全局优化方法 |
CN110275709B (zh) * | 2018-03-15 | 2023-07-25 | 斑马智行网络(香港)有限公司 | 针对动态语言的处理及优化方法、装置、设备及存储介质 |
CN110633290A (zh) * | 2018-06-20 | 2019-12-31 | 苏宁易购集团股份有限公司 | 一种sql语句分析方法及分析装置 |
CN109376166B (zh) * | 2018-08-20 | 2023-07-04 | 中国平安财产保险股份有限公司 | 脚本转换方法、装置、计算机设备及存储介质 |
CN109343841B (zh) * | 2018-10-15 | 2021-08-13 | 上海理工大学 | 实时协同编程环境下的语义冲突消解方法 |
CN109669952A (zh) * | 2018-11-29 | 2019-04-23 | 杭州仟金顶信息科技有限公司 | 一种sql执行效率静态分析方法 |
CN110018829B (zh) * | 2019-04-01 | 2022-11-11 | 北京东方国信科技股份有限公司 | 提高pl/sql语言解释器执行效率的方法及装置 |
CN110109681B (zh) * | 2019-05-08 | 2023-06-09 | 上海携程商务有限公司 | 不同平台间代码的转换方法及系统 |
CN110187885B (zh) * | 2019-06-10 | 2023-03-31 | 合肥本源量子计算科技有限责任公司 | 一种量子程序编译的中间代码生成方法及装置 |
CN110399133B (zh) * | 2019-06-25 | 2020-10-27 | 西北大学 | 一种基于前端字节码技术的JavaScript代码优化方法 |
CN110851142A (zh) * | 2019-10-18 | 2020-02-28 | 浙江大学 | 一种将Transact-SQL程序转换为Java程序的方法 |
CN111209004B (zh) * | 2019-12-30 | 2023-09-01 | 北京水滴科技集团有限公司 | 代码转换方法及装置 |
CN111309757B (zh) * | 2020-05-14 | 2020-09-01 | 深圳市赢时胜信息技术股份有限公司 | 一种HBase的SQL解释器和优化方法 |
-
2020
- 2020-11-04 CN CN202011217087.XA patent/CN112346730B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN112346730A (zh) | 2021-02-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112346730B (zh) | 一种中间表示的生成方法、计算机设备及存储介质 | |
US11036614B1 (en) | Data control-oriented smart contract static analysis method and system | |
US9645803B2 (en) | Methods and systems for forming an adjusted perform range | |
US9182957B2 (en) | Method and system for automated improvement of parallelism in program compilation | |
CN107704382B (zh) | 面向Python的函数调用路径生成方法和系统 | |
CN110149800B (zh) | 一种用于处理与源程序的源代码相关联的抽象语法树的装置 | |
JP5107131B2 (ja) | テストケース生成装置およびその生成方法、ならびにテストケース生成のためのプログラム | |
US11106437B2 (en) | Lookup table optimization for programming languages that target synchronous digital circuits | |
CN106648662B (zh) | 基于工程造价计算描述语言bcl的报表生成装置及生成方法 | |
US9164744B2 (en) | Method and system for program building | |
CN106547520B (zh) | 一种代码路径分析方法及装置 | |
US10802806B1 (en) | Generating vectorized control flow using reconverging control flow graphs | |
CN115639980A (zh) | 一种低代码平台可拖拽的前端逻辑编排方法及装置 | |
CN115509514A (zh) | 一种前端数据模拟方法、装置、设备及介质 | |
Slaby et al. | Compact symbolic execution | |
CN109271237B (zh) | 仿真控制方法和装置 | |
CN113190235B (zh) | 一种代码的分析方法、装置、电子终端及存储介质 | |
CN113779311A (zh) | 一种数据处理的方法、装置和存储介质 | |
Semenov et al. | Obfuscated Code Quality Measurement | |
CN116432185B (zh) | 一种异常检测方法、装置、可读存储介质及电子设备 | |
JP2019164704A (ja) | コンパイラ | |
JP2003050722A (ja) | プログラム解析システムとプログラム解析方法 | |
JPWO2011090032A1 (ja) | 並列処理プログラム生成方法、並列処理プログラム生成プログラム、及び並列処理プログラム生成装置 | |
US11550550B2 (en) | Combined building of dual representation program instructions | |
Almghawish et al. | An automatic parallelizing model for sequential code using Python |
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 |