提高代码执行性能的方法及装置与流程

文档序号:13297232阅读:162来源:国知局
提高代码执行性能的方法及装置与流程

本申请涉及软件开发技术领域,具体涉及一种提高代码执行性能的方法及装置。本申请同时涉及一种生成变量标识与类型的对应关系的方法及装置,以及一种用于生成包含类型标注语句的源代码的方法及装置。



背景技术:

编程语言(programminglanguage),是用来定义计算机程序的形式语言,俗称“计算机语言”,种类多种多样,有的语言属于弱类型语言,有的语言属于强类型语言。在强类型语言中,变量类型有多种,例如int、char、float、boolean等,在定义变量时要明确指定其类型;而弱类型语言,在定义变量时通常不指定变量类型,并且在编译时也无法准确推导出变量类型。“弱类型”由于无需指定变量类型,因此为开发人员在代码开发阶段带来了灵活和便利,但是与此同时也导致了无法对相应代码进行高效优化。

以javascript脚本语言为例,由于其具有简单、动态、基于原型、以及跨平台等特性已经被广泛用于web应用开发中,javascript语言中的变量通常采用var或者const关键字定义,但是并没有明确的类型信息,因此也属于弱类型语言。用于解释执行javascript的解释器通常被称为javascript引擎(简称js引擎),为了优化代码的执行效率,现阶段通常使用的js引擎(例如jsv8)具备即时将js代码编译成可执行代码、然后再解释执行的能力。然而由于js是弱类型语言,变量的类型是不确定的和随时可变的,js引擎通常不得不针对所有可能的类型,生成复杂的处理代码,这就导致生成的可执行代码不仅占用大量内存,而且执行耗时长、效率低,整体执行性能受到极大影响。



技术实现要素:

本申请实施例提供一种提高代码执行性能的方法和装置,以解决现有的弱类型语言执行性能低的问题。本申请实施例还提供一种生成变量标识与类型的对应关系的方法和装置,以及一种用于生成包含类型标注语句的源代码的方法及装置。

本申请提供一种提高代码执行性能的方法,包括:

获取针对源代码预先生成的、变量标识与类型的对应关系;

根据所述对应关系,将以语法树格式存储的所述源代码编译生成进行变量类型限定后的可执行代码。

可选的,在所述获取针对源代码预先生成的、变量标识与类型的对应关系之前,包括:

至少根据所述源代码包含的预设格式的类型标注语句,生成所述变量标识与类型的对应关系。

可选的,至少根据所述源代码包含的预设格式的类型标注语句,生成所述变量标识与类型的对应关系,包括:

逐句读取所述源代码中的语句,针对每个语句执行下述操作:

判断所述语句是否为预设格式的类型标注语句;

若是,执行下述操作:根据从所述语句中提取的变量标识以及相应类型信息生成对应关系条目,并添加到所述变量标识与类型的对应关系中。

可选的,至少根据所述源代码包含的预设格式的类型标注语句,生成所述变量标识与类型的对应关系,包括:

逐句读取所述源代码中的语句,针对每个语句执行下述操作:

判断所述语句是否为预设格式的类型标注语句;

若是,执行下述操作:从所述语句中提取类型信息;根据所述语句与相应变量定义语句的位置关系,读取相应的变量定义语句并获取与提取的类型信息相对应的变量标识;将由获取的变量标识与相应类型信息组成的对应关系条目添加到所述变量标识与类型的对应关系中。

可选的,所述语句与相应变量定义语句的位置关系,包括:

所述语句与相应变量定义语句相邻、且位于所述变量定义语句之前、或者之后。

可选的,所述类型标注语句的形式包括:字符串语句,或注释语句。

可选的,在通过语法解析生成所述以语法树格式存储的所述源代码的过程中,至少根据所述源代码包含的预设格式的类型标注语句,生成所述变量标识与类型的对应关系。

可选的,所述根据所述对应关系,将以语法树格式存储的所述源代码编译生成进行变量类型限定后的可执行代码,包括:

逐句读取以语法树格式存储的所述源代码中的语句,并针对每个语句执行下述操作:

判断所述语句是否满足以下条件:所述语句为变量运算语句、且其中至少存在一个运算变量在所述对应关系中具有对应的类型信息;

若满足,根据从所述对应关系中获取的、所述语句包含的运算变量的类型信息,生成针对所述语句进行变量类型限定后的可执行代码;

否则,针对所述语句生成未进行变量类型限定的可执行代码。

可选的,所述方法还包括:

执行所述可执行代码。

可选的,所述源代码是用弱类型语言编写的,所述弱类型语言包括:javascript语言。

相应的,本申请还提供一种提高代码执行性能的装置,包括:

对应关系获取单元,用于获取针对源代码预先生成的、变量标识与类型的对应关系;

可执行代码生成单元,用于根据所述对应关系,将以语法树格式存储的所述源代码编译生成进行变量类型限定后的可执行代码。

可选的,所述装置还包括:对应关系生成单元;

所述对应关系生成单元,用于至少根据所述源代码包含的预设格式的类型标注语句,生成所述变量标识与类型的对应关系。

可选的,所述对应关系生成单元,包括:

代码读取及循环控制子单元,用于逐句读取所述源代码中的语句,并针对每个语句触发下列子单元工作;

类型标注语句判断子单元,用于判断所述语句是否为预设格式的类型标注语句;

第一对应关系条目生成及添加子单元,用于当所述类型标注语句判断子单元的输出为是时,根据从所述语句中提取的变量标识以及相应类型信息生成对应关系条目,并添加到所述变量标识与类型的对应关系中。

可选的,所述对应关系生成单元,包括:

代码读取及循环控制子单元,用于逐句读取所述源代码中的语句,并针对每个语句触发下列子单元工作;

类型标注语句判断子单元,用于判断所述语句是否为预设格式的类型标注语句;

类型信息提取子单元,用于当所述类型标注语句判断子单元的输出为是时,从所述语句中提取类型信息;

变量标识获取子单元,用于根据所述语句与相应变量定义语句的位置关系,读取相应的变量定义语句并获取与提取的类型信息相对应的变量标识;

第二对应关系条目生成及添加子单元,用于将由获取的变量标识与相应类型信息组成的对应关系条目添加到所述变量标识与类型的对应关系中。

可选的,所述对应关系生成单元,具体用于在通过语法解析生成所述以语法树格式存储的所述源代码的过程中,至少根据所述源代码包含的预设格式的类型标注语句,生成所述变量标识与类型的对应关系。

可选的,所述可执行代码生成单元,包括:

循环控制子单元,用于逐句读取以语法树格式存储的所述源代码中的语句,并针对每个语句触发下列子单元工作;

优化条件判断子单元,用于判断所述语句是否满足以下条件:所述语句为变量运算语句、且其中至少存在一个运算变量在所述对应关系中具有对应的类型信息;

优化代码生成子单元,用于当所述优化条件判断子单元的输出为是时,根据从所述对应关系中获取的、所述语句包含的运算变量的类型信息,生成针对所述语句进行变量类型限定后的可执行代码;

常规代码生成子单元,用于当所述优化条件判断子单元的输出为否时,针对所述语句生成未进行变量类型限定的可执行代码。

可选的,所述装置还包括:

可执行代码执行单元,用于执行所述可执行代码。

此外,本申请还提供一种生成变量标识与类型的对应关系的方法,包括:

至少根据源代码包含的预设格式的类型标注语句,生成变量标识与类型的对应关系,以供针对所述源代码进行编译时生成进行变量类型限定后的可执行代码。

可选的,所述至少根据源代码包含的预设格式的类型标注语句,生成所述变量标识与类型的对应关系,包括:

逐句读取所述源代码中的语句,针对每个语句执行下述操作:

判断所述语句是否为预设格式的类型标注语句;

若是,执行下述操作:根据从所述语句中提取的变量标识以及相应类型信息生成对应关系条目,并添加到所述变量标识与类型的对应关系中。

可选的,所述至少根据源代码包含的预设格式的类型标注语句,生成所述变量与类型的对应关系,包括:

逐句读取所述源代码中的语句,针对每个语句执行下述操作:

判断所述语句是否为预设格式的类型标注语句;

若是,执行下述操作:从所述语句中提取类型信息;根据所述语句与相应变量定义语句的位置关系,读取相应的变量定义语句并获取与提取的类型信息相对应的变量标识;将由获取的变量标识与相应类型信息组成的对应关系条目添加到所述变量标识与类型的对应关系中。

可选的,所述语句与相应变量定义语句的位置关系包括:

所述语句与相应变量定义语句相邻、且位于所述变量定义语句之前、或者之后。

可选的,所述类型标注语句的形式包括:字符串语句,或注释语句。

可选的,在通过语法解析生成以语法树格式存储的源代码的过程中,至少根据所述源代码包含的预设格式的类型标注语句,生成变量标识与类型的对应关系,以供针对所述源代码进行编译时生成进行变量类型限定后的可执行代码。

相应的,本申请还提供一种生成变量标识与类型的对应关系的装置,包括:

对应关系生成单元,用于至少根据源代码包含的预设格式的类型标注语句,生成变量标识与类型的对应关系;

对应关系存储单元,用于存储已生成的变量标识与类型的对应关系,以供针对所述源代码进行编译时生成进行变量类型限定后的可执行代码。

可选的,所述对应关系生成单元包括:

代码读取及循环控制子单元,用于逐句读取所述源代码中的语句,并针对每个语句触发下列子单元工作;

类型标注语句判断子单元,用于判断所述语句是否为类型标注语句;

第一对应关系条目生成及添加子单元,用于当所述类型标注语句判断子单元的输出为是时,根据从所述语句中提取的变量标识以及相应类型信息生成对应关系条目,并添加到所述变量标识与类型的对应关系中。

可选的,所述对应关系生成单元包括:

代码读取及循环控制子单元,用于逐句读取所述源代码中的语句,并针对每个语句触发下列子单元工作;

类型标注语句判断子单元,用于判断所述语句是否为预设格式的类型标注语句;

类型信息提取子单元,用于当所述类型标注语句判断子单元的输出为是时,从所述语句中提取类型信息;

变量标识获取子单元,用于根据所述语句与相应变量定义语句的位置关系,读取相应的变量定义语句并获取与提取的类型信息相对应的变量标识;

第二对应关系条目生成及添加子单元,用于将由获取的变量标识与相应类型信息组成的对应关系表项添加到所述变量标识与类型的对应关系中。

可选的,所述对应关系生成单元,具体用于在通过语法解析生成以语法树格式存储的源代码的过程中,至少根据所述源代码包含的预设格式的类型标注语句,生成变量标识与类型的对应关系,以供针对所述源代码进行编译时生成进行变量类型限定后的可执行代码。

此外,本申请还提供一种用于生成包含类型标注语句的源代码的方法,包括:

接收针对源代码输入的、用于指定变量类型的类型标注语句;

根据接收到的类型标注语句、及其在所述源代码中的输入位置,将所述类型标注语句存储到所述源代码中;

其中,所述类型标注语句为预设格式。

可选的,所述类型标注语句的形式包括:字符串语句,或注释语句。

可选的,所述源代码使用弱类型语言编写的,所述弱类型语言包括:javascript语言。

相应的,本申请还提供一种用于生成包含类型标注信息的源代码的装置,包括:

类型标注语句接收单元,用于接收针对源代码输入的、用于指定变量类型的类型标注语句,其中,所述类型标注语句为预设格式;

类型标注语句存储单元,用于根据接收到的类型标注语句、及其在所述源代码中的输入位置,将所述类型标注语句存储到所述源代码中。

与现有技术相比,本申请具有以下优点:

本申请提供的一种提高代码执行性能的方法,首先获取针对源代码预先生成的、变量标识与类型的对应关系,然后根据所述对应关系,将以语法树格式存储的所述源代码编译生成进行变量类型限定后的可执行代码。采用上述方法,由于预先生成了变量标识与类型的对应关系,因此可以在编译源代码时根据所述对应关系对变量类型进行限定、并生成进行变量类型限定后的可执行代码,从而可以缩减可执行代码占用的内存空间,而且由于减少了针对各种可能的类型进行判断的过程,因此所述可执行代码的执行速率也相应得到提升,使整体执行性能得到改善。

附图说明

图1是本申请的一种用于生成包含类型标注语句的源代码的方法的实施例的流程图;

图2是本申请的一种用于生成包含类型标注语句的源代码的装置的实施例的示意图;

图3是本申请的一种生成变量标识与类型的对应关系的方法实施例的流程图;

图4是本申请实施例提供的针对语句生成对应关系条目的处理流程图;

图5是本申请的一种生成变量标识与类型的对应关系的装置实施例的示意图;

图6是本申请的一种提高代码执行性能的方法实施例的流程图;

图7是本申请实施例提供的针对语句生成可执行代码的处理流程图;

图8是本申请的一种提高代码执行性能的装置实施例的示意图。

具体实施方式

在下面的描述中阐述了很多具体细节以便于充分理解本申请。但是,本申请能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本申请内涵的情况下做类似推广,因此,本申请不受下面公开的具体实施的限制。

在本申请中,分别提供了一种提高代码执行性能的方法及装置,一种生成变量标识与类型的对应关系的方法及装置,以及一种用于生成包含类型标注语句的源代码的方法及装置,在下面的实施例中逐一进行详细说明。在对实施例进行描述之前,先对本申请的技术方案作简要说明。

弱类型语言,是指不具备描述变量类型的语法、且在编译时无法准确推导出变量类型的程序设计语言。使用弱类型语言往往会给开发人员的代码编写过程带来一些灵活和便利,但同时也导致了无法面向执行过程进行高效的代码优化,因此采用弱类型语言编写的代码的执行性能通常比较低。以javascript(简称js)语言为例,对于js代码:z=x+y;由于js是弱类型的,js引擎(例如v8引擎)在为其生成可执行代码时,通常需要考虑所有可能的变量类型的运算,因此生成的可执行代码的伪码如下所示:

如果x是整型,执行下述操作:

如果y是整型,执行addz,x,y;

如果y是双精度浮点型,执行addfz,x,y;

如果y是字符串,先将y转换成整型值y_int,然后执行addz,x,y_int;

如果y是对象,先将y转换成整形值y_int,然后执行addz,x,y_int;

如果x是双精度浮点数,执行下述操作:

......

由此可见,js引擎针对每种可能的变量类型都生成相应的分支、并且在每个分支下包含相应的处理代码,因此这样生成的可执行代码通常占用大量的内存空间,而且在执行过程中由于需要进行多次判断,因此执行速度慢,导致整体执行性能比较差。以上虽然列举的是js语言的例子,但是对于弱类型语言通常都存在上述相同的问题。

虽然弱类型语言无法为变量指定明确的类型,在实际使用弱类型语言进行开发的过程中,绝大部分情况下开发者却是有明确“类型倾向”的,即:开发者定义的变量通常都有确定的具体的类型、并且不会随意变换类型,只是在弱类型语言中无法指定变量的类型。

针对上述现状,本申请提出了一种提高代码执行性能的方法,其核心在于:针对待编译的源代码,可以将确定类型的变量标识及其类型记录在对应关系中,在编译源代码时,根据所述对应关系中的类型信息生成进行变量类型限定后的可执行代码,即:生成类型优化后的可执行代码。采用这种方法,由于减少了大量的判断分支,从而既可以缩减可执行代码占用的内存空间,而且生成的可执行代码的执行速率也能相应得到提升,从而使得整体执行性能得到改善。

所述变量标识与类型的对应关系,包含若干个对应关系条目,每个对应关系条目中包含变量标识及对应的类型信息。所述对应关系可以以数据表的形式存储在内存中,或者存储在文件中。

具体实施时,可以由开发人员在采用弱类型语言编写代码的过程中添加预设格式的类型标注语句,而本申请提供的用于生成包含类型标注语句的源代码的方法,通过接收开发人员输入的上述语句生成包含类型标注语句的源代码,随后可以利用本申请提供的生成变量标识与类型的对应关系的方法,根据所述包含类型标注语句的源代码生成变量标识与类型的对应关系,并采用本申请提供的提高代码执行性能的方法,利用已生成的对应关系,生成针对所述源代码进行变量类型限定后的可执行代码。

由于在源代码中添加的类型标注语句符合弱类型语言语法规则,因此无需修改js语言(例如:添加进行类型定义的关键字),从而并不会将弱类型语言从语言层面改变成强类型语言,因此依然可以保留弱类型语言的灵活性,开发人员仍然可以按照原有的编程习惯编写源代码,只需要在可以明确变量类型的地方添加类型标注语句,就可以实现在编译阶段进行变量类型限定的目的。

类型标注语句的形式可以为字符串语句或者注释语句,也可以是其它形式的、不影响源代码功能实现的代码语句。所述注释语句是指不具有任何功能实现的作用、仅仅是对源代码进行说明的语句,这里给出javascript语言中注释语句的两个例子:

所述代码语句不同于注释语句,通常是指用于实现源代码功能的语句,例如:变量定义语句、变量运算语句等,源代码通常是由注释语句和代码语句组成。在实施本技术方案时,可以采用不影响源代码功能实现的代码语句,例如:采用字符串语句作为类型标注语句。

为了便于理解,在以下的实施例中重点以采用字符串语句作为类型标注语句为例,对本技术方案的实施方式进行说明。至于采用其他形式的代码语句或者采用注释语句作为类型标注语句,也可以基于相同的原理予以实施。

下面对本申请的实施例进行详细说明,为了便于理解,先描述本申请的一种用于生成包含类型标注语句的源代码的方法的实施例。

请参考图1,其为本申请的一种用于生成包含类型标注语句的源代码的方法的实施例的流程图。所述方法包括如下步骤:

步骤101、接收针对源代码输入的、用于指定变量类型的类型标注语句。

本步骤所述的源代码可以是一个代码片段,其中可以包含一个函数的实现代码、或者若干个函数的实现代码,也可以是用于实现某个整体功能的源文件中的全部代码。

开发人员在源代码中添加用于指定变量类型的类型标注语句的方式可以是预先设定好的,后续从源代码中提取标量标识与类型的对应关系时也遵循相同的预设方式。例如:可以在函数的开始部分,采用类型标注语句对在本函数内定义的某个或者某些变量的类型进行明确指定,也可以针对函数中的变量定义语句添加相应的类型标注语句。考虑到第二种方式更加直观,便于开发人员操作,因此通常是开发人员添加类型标注语句的优选方式。

采用上述方式,开发人员可以在与变量定义语句相邻的位置添加所述类型标注语句,例如:在变量定义语句之前,或者在变量定义语句之后,添加用于指定变量类型的类型标注语句。

并且,所述类型标注语句中至少包含相应变量定义语句中的、至少一个变量的类型信息。如果变量定义语句中包含n个变量的定义,那么针对所述变量定义语句添加的类型标注语句可以包含其中每个变量的类型信息,也可以仅包含其中某一个或者几个变量的类型信息,只要能够在变量与类型信息之间建立起正确的对应关系就都是可以的。

所述类型标注语句的格式通常是预先设定的,例如:类型标注语句采用预设符号开头,对于不同变量的类型信息可以采用预设分隔符彼此分开,所述预设分隔符可以为:分号、逗号、或者其它符号,例如:@。本实施例不对类型标注语句的预设格式进行限定,只要能够通过预设格式从源代码包含的语句中识别出类型标注语句、并提取类型信息即可。

下面以在采用javascript编写的源代码中添加类型标注语句为例进行说明,在下面的具体例子中,预设格式的类型标注语句为:采用“@”字符或者“<-@”字符作为开始字符的字符串语句。其中,开始字符为“@”表示在变量定义语句之前添加类型标注语句,“<-@”表示在变量定义语句之后添加类型标注语句。

未添加类型标注语句的源代码:

varnum=1;

conststr=“hello”,istrue=true;

varfunc=function(num,str){};

1)在变量定义语句前添加类型标注语句(在不同的代码行添加):

“@int”;

varnum=1;

“@string,@boolean”;

conststr=“hello”,istrue=true;

“@booleanfunction(@int,@string)”;

varfunc=function(){};

2)在变量定义语句前添加类型标注语句(在相同的代码行中添加):

“@int”;varnum=1;

“@string,@boolean”;conststr=“hello”,istrue=true;

“@booleanfunction(@int,@string)”;varfunc=function(num,str){};

3)在变量定义语句后添加类型标注语句:

varnum=1;“<-@int”;

conststr=“hello”,istrue=true;“<-@string,@boolean”;

varfunc=function(num,str){};“<-@booleanfunction(@int,@string)”;

上述1)、2)、3)分别提供了添加类型标注语句的三个具体例子,在这三个具体例子中添加的类型标注语句的作用是相同的:将num变量的类型指定为int,将str变量的类型指定为string,将istrue变量的类型指定为boolean,将func变量的类型指定为function。

类型标注语句中也可以仅指定相应变量定义语句中的部分变量的类型,例如以下添加了类型标注语句的源代码,其中第一个分隔符之前的类型信息为空,表明没有为相应的num变量指定类型,后面两个分隔符之前都有类型信息,即:为变量str指定类型为string,为变量istrue指定类型为boolean。

“@object{,@string,@boolean}”;

constobj={num:1,str:“hello”,istrue:true};

在具体实施时,类型标注语句中也可以明确写入变量标识,即:类型标注语句中可以包括一个或者一个以上由变量标识与相应类型信息组成的二元组,例如:

“@object{@str:string,@istrue:boolean}”;

constobj={num:1,str:“hello”,istrue:true};

在具体实施时,通常可以在编辑窗口中加载并显示源代码,开发人员在编辑窗口的输入光标处按照上述方式输入预设格式的类型标注语句,本步骤就会相应接收到所述类型标注语句、并且获知接收到的类型标注语句在源代码中的输入位置。

步骤102、根据接收到的类型标注语句、及其在所述源代码中的输入位置,将所述类型标注语句存储到所述源代码中。

本步骤根据接收到的类型标注语句、及其在所述源代码中的输入位置,将类型标注语句存储到所述源代码中,从而生成了包含类型标注语句的源代码。

在具体实施时,可以将步骤101接收到的类型标注语句及其输入位置信息缓存下来,并在接收到存储命令后,将缓存的类型标注语句按照其输入位置信息存储到所述源代码中。

上面以javascript为例,对本实施例的实施方式进行了详细说明。本领域技术人员应该理解,本实施例描述的方法,也可以应用于采用其他弱类型语言编写的源代码中,所述弱类型语言包括:php、lua等。

在具体实施时,类型标注语句的预设格式、以及添加的位置可以根据弱类型语言的语法规则以及实际需求预先设定,只要能够根据预设格式识别出类型标注语句、并且指定变量与类型之间的对应关系就都是可以的。在源代码中添加类型标注语句的基础上,在需要执行所述源代码时,就可以按照类型标注语句的预设格式提取出变量标识与类型的对应关系,并根据对应关系生成进行变量类型限定后的可执行代码。

以上以采用字符串语句为例对本实施例的实施方式进行了说明。在其他实施方式中,类型标注语句也可以采用注释语句的形式,同样可以添加在函数的开始部分,或者添加在变量定义语句之前或者之后。下面给出几个具体的例子。

1)//@string,@boolean

conststr=“hello”,istrue=true;

2)/*@int*/varnum=1;

3)conststr=“hello”,istrue=true;//<-@string,@boolean

综上所述,本实施例提供的用于生成包含类型标注语句的源代码的方法,通过接收针对源代码输入的类型标注语句、并将类型标注语句存储到所述源代码中,生成了包含类型标注语句的源代码。从而可以弥补弱类型语言无法指定变量类型的缺陷,为后续生成进行变量类型限定的可执行代码提供了可能性。由于采用了添加类型标注语句的方式,不需要对源代码中原有的代码语句进行修改,易于开发人员实施;特别是采用与变量定义语句对应添加的方式,仅需要针对变量定义对应添加一次类型标注语句即可,不仅对应关系明确,而且可以减少开发人员的标注工作量。

在上述的实施例中,提供了一种用于生成包含类型标注语句的源代码的方法,与之相对应的,本申请还提供一种用于生成包含类型标注语句的源代码的装置。请参看图2,其为本申请的一种用于生成包含类型标注语句的源代码的装置的实施例的示意图。由于装置实施例基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。下述描述的装置实施例仅仅是示意性的。

本实施例的一种用于生成包含类型标注语句的源代码的装置,包括:类型标注语句接收单元201,用于接收针对源代码输入的、用于指定变量类型的类型标注语句,其中,所述类型标注语句为预设格式,本单元可用于执行上述相应方法实施例中的步骤101;

类型标注语句存储单元202,用于根据接收到的类型标注语句、及其在所述源代码中的输入位置,将所述类型标注语句存储到所述源代码中,本单元可用于执行上述相应方法实施例中的步骤102。

此外,本申请还提供一种生成变量标识与类型的对应关系的方法,请参考图3,其为本申请提供的一种生成变量标识与类型的对应关系的方法实施例的流程图,本实施例与之前提供的各实施例内容相同的部分不再赘述,下面重点描述不同之处。本申请提供的一种生成变量标识与类型的对应关系的方法包括:

步骤301、至少根据源代码包含的预设格式的类型标注语句,生成变量标识与类型的对应关系,以供针对所述源代码进行编译时生成进行变量类型限定后的可执行代码。

在执行本步骤之前,通常已经生成了包含预设格式的类型标注语句的源代码,本步骤在读取源代码中的类型标注语句的基础上,生成变量标识与类型的对应关系,从而在编译时可以根据对应关系中的类型信息,生成进行变量类型限定后的可执行代码。

本步骤可以根据类型标注语句的预设格式,从所述源代码中识别出类型标注语句,并在此基础上生成所述对应关系。类型标注语句的预设格式不同,本步骤的处理过程也会不同。

如果预先设定在函数的开始部分采用类型标注语句对在本函数内定义的变量的类型进行明确指定,那么本步骤可以读取处于函数开始部分的类型标注语句,相应地生成变量标识与类型的对应关系条目,并添加到变量标识与类型的对应关系中。

如果预先设定类型标注语句是针对变量定义语句添加的、并且类型标注语句中包含变量标识以及相应的类型信息,那么本步骤可以逐句读取源代码中的每个语句,若识别出读取的语句为预设格式的类型标注语句,则根据从所述类型标注语句中提取的变量标识以及相应类型信息生成对应关系条目,并添加到变量标识与类型的对应关系中。

如果预先设定类型标注语句是针对变量定义语句添加的、并且类型标注语句中不包含变量标识,则需要根据类型标注语句与相应的变量定义语句的位置关系,生成变量标识与类型的对应关系条目,并添加到变量标识与类型的对应关系中。下面结合一个具体例子对这种方式进行说明。

在所述具体例子中,在源代码中的变量定义语句之前或者之后添加了字符串形式的类型标注语句,本步骤逐句读取所述源代码中的每个语句,并针对每个语句进行处理,处理过程包括步骤301-1至步骤301-5,下面结合图4进行详细说明。

步骤301-1、判断所述语句是否为预设格式的类型标注语句;若是,执行步骤301-2。

本步骤可以根据所述语句是否符合类型标注语句的预设格式,判断所述语句是否为类型标注语句。在所述具体例子中,预设格式的类型标注语句为:采用“@”字符或者“<-@”字符作为开始字符的字符串语句,那么本步骤可以作如下判断:所述语句是否为字符串语句、且以@”或者“<-@”作为字符串的开始字符,如果当前读取的语句符合该要求,则说明所述语句是类型标注语句,则执行步骤301-2。

步骤301-2、从所述语句中提取类型信息。

本步骤可以根据类型标注语句的预设格式,提取类型信息,例如:根据分隔符的指示提取类型信息。

步骤301-3、根据所述语句与相应变量定义语句的位置关系,读取相应的变量定义语句并获取与提取的类型信息相对应的变量标识。

所述类型标注语句与相应变量定义语句的位置关系,可以在开发人员向源代码中添加类型定义语句时就已预先设定好,例如:预先设定类型标注语句在变量定义语句之前,那么本步骤读取位于所述类型标注语句之后的下一条变量定义语句(以javascript为例,变量定义语句可以为var语句或者const语句);如果预先设定类型标注语句在变量定义语句之后,那么本步骤读取位于所述类型标注语句之前的上一条变量定义语句。

所述类型标注语句与相应变量定义语句的位置关系,也可以通过类型标注语句中的预设信息指定,在所述具体例子中,类型标注语句如果采用“@”字符开头,代表类型标注语句在变量定义语句之前;类型标注语句如果采用“<-@”字符开头,则代表类型标注语句在变量定义语句之后,那么本步骤可以根据类型标注语句字符串的开头字符,读取相应的变量定义语句。

读取所述类型标注语句的相应变量定义语句后,可以进一步根据类型标注语句中的类型与相应变量定义语句中的变量的对应关系,获取与步骤301-2提取的类型信息相对应的变量标识,所述变量标识是指能够唯一识别所述源代码中的变量的标识信息。如果所述源代码是一个函数,由于函数中定义的各个变量的变量名都是唯一的,因此可以用从所述变量定义语句中提取的变量名作为变量标识;如果所述源代码包括两个或者两个以上的函数,针对函数中定义的变量,则可以用“函数名+从变量定义语句中提取的变量名”作为变量标识。

步骤301-4、将由获取的变量标识与相应类型信息组成的对应关系条目添加到所述变量标识与类型的对应关系中。

执行到本步骤,已经根据所述类型标识语句以及相应的变量定义语句,获取了变量标识以及与所述变量标识对应的类型信息,因此本步骤可以根据已获取的信息组成对应关系条目,并将所述对应关系条目添加到变量标识与类型的对应关系中。

例如,读取的类型标注语句为:“@string,@boolean”;对应的变量定义语句为conststr=“hello”,istrue=true;那么本步骤生成如下所示的两个对应关系条目,并可以将这两个条目添加到变量标识与类型的对应关系中。

1)str:string

2)istrue:boolean

针对所述源代码中的每个语句,执行上述步骤301-1至301-4,并将生成的对应关系条目都添加到变量标识与类型的对应关系中,那么将所述源代码中的语句都处理完毕后,就针对所述源代码生成了变量标识与类型的对应关系。

至此,通过一个具体的例子对变量标识与类型的对应关系的生成过程进行了说明。在具体实施时,由于在源代码中添加类型标注语句的位置可能不同、类型标注语句的预设格式也可能不同,因此生成所述对应关系的具体实施方式也会存在差异,在实际应用中,可以在上述例子的基础上根据具体情况进行相应变更、调整。

例如,在上述例子中类型标注语句的形式为字符串语句,在其他实施方式中,类型标注语句也可以采用注释语句的形式,在这种情况下,在步骤301-1中可以作如下判断:所述语句是否为注释语句、且以@”或者“<-@”作为注释信息的开始字符。如果当前读取的语句符合该要求,则说明所述语句是类型标注语句。其他步骤的实施方式与字符串语句是类似的,此处不再赘述。

需要说明的是,本实施例给出的生成变量标识与类型的对应关系的方法,可以独立实施,也可以在通过语法解析生成以语法树格式存储的源代码的过程中实施。即:在通过语法解析生成以语法树格式存储的源代码的过程中,至少根据所述源代码包含的预设格式的类型标注语句,生成变量标识与类型的对应关系。下面对这种实施方式进行说明。

通常在执行源代码之前,可以先进行语法解析。在语法解析的过程中,逐句读取源代码中的语句、并按照预设策略确定是否针对当前读取的语句生成相应的语法树或者语法树节点。采用上述方式对源代码处理完毕,则将所述源代码转换成了以语法树格式存储的源代码,对以语法树格式存储的源代码进行编译,就可以生成可执行代码。

本实施例提供的生成变量标识与类型的对应关系的方法,可以融合在上述语法解析的过程中完成。

例如,在通过语法解析生成以语法树格式存储的源代码的过程中,针对逐句读取的每个语句,不仅执行与生成语法树相关的处理操作,还执行下述操作:判断所述语句是否为预设格式的类型标注语句;若是,根据从所述类型标注语句中提取的变量标识以及相应类型信息生成对应关系条目,并添加到所述变量标识与类型的对应关系中。

再如,在通过语法解析生成以语法树格式存储的源代码的过程中,针对逐句读取的每个语句,不仅执行与生成语法树相关的处理操作,还执行下述操作:判断所述语句是否为预设格式的类型标注语句;若是,从所述语句中提取类型信息;根据所述语句与相应变量定义语句的位置关系,读取相应的变量定义语句并获取与提取的类型信息相对应的变量标识;将由获取的变量标识与相应类型信息组成的对应关系条目添加到所述变量标识与类型的对应关系中。

采用上述实施方式,通过对源代码进行语法解析(该过程也通常称为parse过程),不仅生成了以语法树格式存储的源代码,同时也生成了变量标识与类型的对应关系,从而无需为了生成所述对应关系额外执行读取代码的操作,在采用本申请提供的技术方案提高代码执行性能的同时,避免对处理器资源的额外占用,不会影响解析、编译源代码的整体性能。

通过上面的描述可以看出,本实施例提供的生成变量标识与类型的对应关系的方法,在读取源代码包含的类型标注语句的基础上,针对所述源代码生成了变量标识与类型的对应关系,从而为后续针对源代码进行编译生成进行变量类型限定后的可执行代码做好了准备工作。由于预先提炼出了变量标识与类型的对应关系,编译过程不需要再执行变量类型的解析操作,直接从所述对应关系集合中获取变量的类型信息即可,可以提高编译过程的效率。

在上述的实施例中,提供了一种生成变量标识与类型的对应关系的方法,与之相对应的,本申请还提供一种生成变量标识与类型的对应关系的装置。请参看图5,其为本申请的一种生成变量标识与类型的对应关系的装置的实施例的示意图。由于装置实施例基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。下述描述的装置实施例仅仅是示意性的。

本实施例的一种生成变量标识与类型的对应关系的装置,包括:对应关系生成单元501,用于至少根据源代码包含的预设格式的类型标注语句,生成变量标识与类型的对应关系,本单元可用于执行上述相应方法实施例中的步骤301;

对应关系存储单元502,用于存储已生成的变量标识与类型的对应关系,以供针对所述源代码进行编译时生成进行变量类型限定后的可执行代码。

可选的,所述对应关系生成单元包括:

代码读取及循环控制子单元,用于逐句读取所述源代码中的语句,并针对每个语句触发下列子单元工作;

类型标注语句判断子单元,用于判断所述语句是否为类型标注语句;

第一对应关系条目生成及添加子单元,用于当所述类型标注语句判断子单元的输出为是时,根据从所述语句中提取的变量标识以及相应类型信息生成对应关系条目,并添加到所述变量标识与类型的对应关系中。

可选的,所述对应关系生成单元包括:

代码读取及循环控制子单元,用于逐句读取所述源代码中的语句,并针对每个语句触发下列子单元工作;

类型标注语句判断子单元,用于判断所述语句是否为预设格式的类型标注语句;

类型信息提取子单元,用于当所述类型标注语句判断子单元的输出为是时,从所述语句中提取类型信息;

变量标识获取子单元,用于根据所述语句与相应变量定义语句的位置关系,读取相应的变量定义语句并获取与提取的类型信息相对应的变量标识;

第二对应关系条目生成及添加子单元,用于将由获取的变量标识与相应类型信息组成的对应关系表项添加到所述变量标识与类型的对应关系中。

可选的,所述对应关系生成单元,具体用于在通过语法解析生成以语法树格式存储的源代码的过程中,至少根据所述源代码包含的预设格式的类型标注语句,生成变量标识与类型的对应关系,以供针对所述源代码进行编译时生成进行变量类型限定后的可执行代码。

此外,本申请还提供一种用于提高代码执行性能的方法,请参考图6,其为本申请提供的一种提高代码执行性能的方法实施例的流程图,本实施例与之前提供的各实施例内容相同的部分不再赘述,下面重点描述不同之处。本申请提供的一种提高代码执行性能的方法包括:

步骤601、获取针对源代码预先生成的、变量标识与类型的对应关系。

在执行本步骤之前,通常已经预先针对源代码生成了变量标识与类型的对应关系,在所述对应关系中通常包含若干个对应关系条目,每个对应关系条目中包含变量标识及对应的类型信息。所述对应关系可以存储在内存中、或者是磁盘文件中,本步骤在针对所述源代码进行编译之前,可以通过读取内存或者磁盘文件等方式获取所述对应关系。

步骤602、根据所述对应关系,将以语法树格式存储的所述源代码编译生成进行变量类型限定后的可执行代码。

由于在步骤601中获取了针对源代码预先生成的变量标识与类型的对应关系,因此在对以语法树格式存储的所述源代码进行编译的过程中,可以根据所述对应关系对变量类型进行限定,并生成进行变量类型限定后的可执行代码,即:进行类型优化后的可执行代码。

由于限定变量类型主要是针对变量运算语句的,因此本实施例以变量运算语句为重点,对生成可执行代码的过程进行说明,在具体实施时,也可以采用类似的方法针对其他类型的语句进行类型优化。

本步骤可以依次读取以语法树格式存储的所述源代码中的每个语句,并针对每个语句通过以下步骤602-1至602-3生成相应的可执行代码,下面结合图7进行详细说明。

步骤602-1、判断所述语句是否满足以下条件:所述语句为变量运算语句、且其中至少存在一个运算变量在所述对应关系中具有对应的类型信息,若满足,执行步骤602-2,否则执行602-3。

本步骤的主要任务是:判断是否针对当前读取的语句进行变量类型限定。

可以先识别所述语句是否为变量运算语句,所谓变量运算语句是指包含运算符和运算变量的语句,其中所述运算符可以是单目、双目或者是三目运算符,相应的运算变量的数目可以为一个、两个或者三个。

如果是变量运算语句,则进一步判断所述变量运算语句是否至少存在一个运算变量在所述对应关系中具有对应的类型信息。具体实施时,可以根据所述语句包含的各运算变量在步骤601获取的对应关系中进行查找,如果有与某运算变量的变量标识对应的对应关系条目,则读取其中的类型信息。执行上述查找操作后,如果至少有一个运算变量在所述对应关系中有对应的类型信息,那么就可以执行步骤602-2。

如果所述语句不满足上述两个条件,则执行步骤602-3。

步骤602-2、根据从所述对应关系中获取的、所述语句包含的运算变量的类型信息,生成针对所述语句进行变量类型限定后的可执行代码。

执行到本步骤,说明可以针对所述语句进行变量类型限定,因此本步骤根据从所述对应关系中获取的、所述语句包含的运算变量的类型信息,生成进行变量类型限定后的可执行代码。

在具体实施时,可以根据运算变量的类型选择平台提供的针对所述类型的高效指令,如在某平台上,整型加运算采用add指令,浮点型加运算采用addf指令,以在本说明书具体实施方式开始部分给出的z=x+y;运算语句为例,本步骤可以根据从所述对应关系中获取的x、y变量的类型生成相应的可执行代码,例如,根据所述对应关系可知x为整型且y为整型,即对x和y的类型进行了限定,那么生成相应的可执行代码为:addz,x,y;再如,根据所述对应关系可知x为整型、y为双精度浮点型,则生成相应的可执行代码为:addfz,x,y。

由此可见,与前面在本说明书具体实施方式开始部分给出的针对z=x+y运算语句生成的可执行代码相比较,进行变量类型限定后生成的可执行代码没有大量的分支判断以及针对各个分支的不同指令代码,而是仅生成了一条可执行代码,而且采用的是与运算类型相匹配的专用的高效运算指令,因此不仅缩减了可执行语句占用的内存空间,而且可以提高可执行代码的执行速度,从而使得整体执行性能得到改善。

需要说明的是,上面为了便于理解,仅针对加法运算给出了进行变量类型限定后生成可执行代码的一个示意性的例子,在实际实施本方法时,可以根据平台以及运算类型的不同,选择不同于上述的其他高效指令、并生成相应的可执行代码。

步骤602-3、针对所述语句生成未进行变量类型限定的可执行代码。

执行到本步骤,说明所述语句不是变量运算语句、或者是变量运算语句但是其中包含的运算变量在所述对应关系中都没有相应的类型信息,在这种情况下,可以采用常规方式生成未进行变量类型限定的可执行代码。

针对以语法树格式存储的所述源代码中的每个语句,依次执行上述步骤602-1至602-3进行处理,从而可以利用步骤601获取的对应关系、将以语法树格式存储的所述源代码编译生成进行变量类型限定后的可执行代码。

在具体实施时,在生成可执行代码(也可以称为中间代码或者本地代码)后,可以由实施本方法的编译器或者引擎直接运行所述可执行代码,也可以调用其他执行器运行所述可执行代码。由于在生成所述可执行代码的过程中,根据对应关系中的类型信息对相应变量的类型进行了限定,因此生成的可执行代码不仅占用内存空间变小,而且执行速度也会相应加快,整体执行性能得到显著改善。

在上述的实施例中,提供了一种提高代码执行性能的方法,与之相对应的,本申请还提供一种提高代码执行性能的装置。请参看图8,其为本申请的一种提高代码执行性能的装置的实施例的示意图。由于装置实施例基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。下述描述的装置实施例仅仅是示意性的。

本实施例的一种提高代码执行性能的装置,包括:对应关系获取单元801,用于获取针对源代码预先生成的、变量标识与类型的对应关系,本单元可用于执行上述相应方法实施例中的步骤601;

可执行代码生成单元802,用于根据所述对应关系,将以语法树格式存储的所述源代码编译生成进行变量类型限定后的可执行代码,本单元可用于执行上述相应方法实施例中的步骤602。

可选的,所述装置还包括:对应关系生成单元;

所述对应关系生成单元,用于至少根据所述源代码包含的预设格式的类型标注语句,生成所述变量标识与类型的对应关系。

可选的,所述对应关系生成单元,包括:

代码读取及循环控制子单元,用于逐句读取所述源代码中的语句,并针对每个语句触发下列子单元工作;

类型标注语句判断子单元,用于判断所述语句是否为预设格式的类型标注语句;

第一对应关系条目生成及添加子单元,用于当所述类型标注语句判断子单元的输出为是时,根据从所述语句中提取的变量标识以及相应类型信息生成对应关系条目,并添加到所述变量标识与类型的对应关系中。

可选的,所述对应关系生成单元,包括:

代码读取及循环控制子单元,用于逐句读取所述源代码中的语句,并针对每个语句触发下列子单元工作;

类型标注语句判断子单元,用于判断所述语句是否为预设格式的类型标注语句;

类型信息提取子单元,用于当所述类型标注语句判断子单元的输出为是时,从所述语句中提取类型信息;

变量标识获取子单元,用于根据所述语句与相应变量定义语句的位置关系,读取相应的变量定义语句并获取与提取的类型信息相对应的变量标识;

第二对应关系条目生成及添加子单元,用于将由获取的变量标识与相应类型信息组成的对应关系条目添加到所述变量标识与类型的对应关系中。

可选的,所述对应关系生成单元,具体用于在通过语法解析生成所述以语法树格式存储的所述源代码的过程中,至少根据所述源代码包含的预设格式的类型标注语句,生成所述变量标识与类型的对应关系。

可选的,所述可执行代码生成单元,包括:

循环控制子单元,用于逐句读取以语法树格式存储的所述源代码中的语句,并针对每个语句触发下列子单元工作;

优化条件判断子单元,用于判断所述语句是否满足以下条件:所述语句为变量运算语句、且其中至少存在一个运算变量在所述对应关系中具有对应的类型信息;

优化代码生成子单元,用于当所述优化条件判断子单元的输出为是时,根据从所述对应关系中获取的、所述语句包含的运算变量的类型信息,生成针对所述语句进行变量类型限定后的可执行代码;

常规代码生成子单元,用于当所述优化条件判断子单元的输出为否时,针对所述语句生成未进行变量类型限定的可执行代码。

可选的,所述装置还包括:

可执行代码执行单元,用于执行所述可执行代码。

本申请虽然以较佳实施例公开如上,但其并不是用来限定本申请,任何本领域技术人员在不脱离本申请的精神和范围内,都可以做出可能的变动和修改,因此本申请的保护范围应当以本申请权利要求所界定的范围为准。

在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。

内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram)。内存是计算机可读介质的示例。

1、计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。

2、本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

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