编译方法和编译装置制造方法及图纸

技术编号:19634699 阅读:26 留言:0更新日期:2018-12-01 15:29
本申请实施例提供了一种编译方法和编译装置,该方法包括:获取待编译的第一动态语言程序;利用静态单一赋值转换处理,对所述第一动态语言程序中的至少一个变量进行类型推导,确定所述至少一个变量中每个变量的类型推导结果;根据所述每个变量的类型推导结果,对所述至少一个变量中能够推导出静态类型的变量进行静态化处理。本申请实施例的编译方法和编译装置,能够在编译阶段对动态语言程序中变量的类型进行推导,从而有利于提高动态语言程序的运行效率。

Compiling Method and Compiling Device

The embodiment of this application provides a compiling method and a compiling device, which includes acquiring the first dynamic language program to be compiled, deducing the type of at least one variable in the first dynamic language program and determining the type of each variable in the at least one variable by using static single assignment conversion processing. According to the type deduction results of each variable, at least one variable of which the static type can be deduced is statically processed. The compiling method and the compiling device of the embodiment of the present application can deduce the types of variables in the dynamic language program at the compiling stage, thereby advantageous to improving the running efficiency of the dynamic language program.

【技术实现步骤摘要】
编译方法和编译装置
本申请实施例涉及计算机领域,并且更具体地,涉及计算机领域中的编译方法和编译装置。
技术介绍
动态语言程序对变量的类型要求并不十分严格,代码简洁自由,相对于静态语言程序,动态语言程序在快速开发部署方面有明显优势,因此,开发者们开始在更多领域使用动态语言程序。动态语言程序在给程序开发者带来便利的同时,也给程序运行的效率带来了负面影响。由于动态语言程序中的变量的类型不确定,在程序运行时需要对动态语言程序的变量的类型进行判断,这样会增大运行程序的开销。例如,计算a+b,对于静态语言程序而言,只需要一条加法add或者字符串的链接操作就可以了,但是,对于动态语言程序来说,需要在程序运行的时候首先去分别判断a和b的类型,然后再根据a和b的类型进行计算,这无疑会使程序的运行效率大大降低。随着动态语言的广泛应用,提高动态语言程序的运行效率已经成为一项亟待解决的问题。
技术实现思路
本申请实施例提供一种编译方法和编译装置,能够在编译阶段对动态语言程序中变量的类型进行推导,从而有利于提高动态语言程序的运行效率。第一方面,提供了一种编译方法,包括:获取待编译的第一动态语言程序;利用静态单一赋值转换处理,对所述第一动态语言程序中的至少一个变量进行类型推导,确定所述至少一个变量中每个变量的类型推导结果;根据所述每个变量的类型推导结果,对所述至少一个变量中能够推导出静态类型的变量进行静态化处理。本申请实施例的编译方法可以由任何合适的装置执行,本文称为编译装置,本申请实施例对此不作限定。在一种具体的实现中,上述编译方法可以由编译器执行。应理解,上述类型推导结果分为可推导和不可推导两种情况,其中,可推导是指变量的类型推导结果为确定的静态类型,例如整型integer、浮点型float或字符型char等等,不可推导是指变量的类型推导结果无法推导,即该类变量的类型在编译阶段无法确定。在本申请实施例中,编译装置仅需要根据每个变量的类型推导结果,将类型推导结果为可推导的变量进行静态化处理。还应理解,编译装置可以在获取了该至少一个变量中的所有变量的类型推导结果之后,再对所有类型推导结果为可推导的变量进行静态化处理,也可以在获取了一个类型推导结果为可推导的变量之后,就对该变量进行静态化处理,同时去进行其他变量的推导,本申请实施例对此不作限定。本申请实施例的编译方法,能够在编译阶段直接利用SSA技术,对动态语言程序中变量的类型进行推导,确定出该动态语言程序中变量的类型推导结果,将类型推导结果为可推导的变量进行静态化处理,无需在运行阶段对这部分变量进行类型推导,有利于减少运行时的类型推导的开销,从而有利于提高动态语言程序的运行效率。在第一方面的第一种可能的实现方式中,所述利用静态单一赋值转换处理,对所述第一动态语言程序中的至少一个变量进行类型推导,确定所述至少一个变量中每个变量的类型推导结果,包括:利用所述静态单一赋值转换处理,确定可推导变量集合和/或不可推导变量集合,所述可推导变量集合包括所述至少一个变量中的一个或多个变量,所述可推导变量集合中的变量的类型推导结果为确定的静态类型,所述不可推导变量集合包括所述至少一个变量中的一个或多个变量,所述不可推导变量集合中的变量的类型推导结果为无法推导;根据所述可推导变量集合中的变量的类型推导结果和/或所述不可推导变量集合,确定所述至少一个变量中第一变量的类型推导结果,其中,所述第一变量既不属于所述可推导变量集合也不属于所述不可推导变量集合。具体地,编译装置在对第一动态语言程序中的至少一个变量进行类型推导时,可以确定可推导变量集合和/或不可推导变量集合,该可推导变量集合中的变量的类型推导结果均为确定的静态类型,该不可推导变量集合中的变量的类型推导结果均为无法推导。由于该至少一个变量之间可能会存在一定的关联关系,编译装置可以根据该可推导变量集合和/或不可推导变量集合,对所述至少一个变量中既不属于所述可推导变量集合也不属于所述不可推导变量集合的第一变量进行类型推导,确定该第一变量的类型推导结果。换句话说,编译装置可以根据已经推导出来的变量(包括可推导的变量和不可推导的变量)的类型推导结果,对至少一个变量中状态为可能推导的变量进行类型推导。结合第一方面的上述可能的实现方式,在第一方面的第二种可能的实现方式中,所述第一变量的定义语句为第一表达式,并且在所述第一表达式中,所述第一变量为第二变量和第三变量的函数,且所述第一变量的取值为所述第二变量或所述第三变量,所述根据所述可推导变量集合中的变量的类型推导结果和/或所述不可推导变量集合,确定所述至少一个变量中第一变量的类型推导结果,包括:若所述第二变量和所述第三变量均属于所述可推导变量集合,并且所述第二变量的类型推导结果和所述第三变量的类型推导结果相同,将所述第一变量的类型推导结果确定为所述第二变量的类型推导结果。结合第一方面的上述可能的实现方式,在第一方面的第三种可能的实现方式中,在所述将所述第一变量的类型推导结果确定为所述第二变量的类型推导结果之后,所述方法还包括:将所述第一变量添加至所述可推导变量集合。结合第一方面的上述可能的实现方式,在第一方面的第四种可能的实现方式中,所述根据所述可推导变量集合中的变量的类型推导结果和/或所述不可推导变量集合,确定所述至少一个变量中第一变量的类型推导结果,还包括:若所述第二变量和所述第三变量均属于所述可推导变量集合,并且所述第二变量的类型推导结果和所述第三变量的类型推导结果不相同,确定所述第一变量的类型推导结果为无法推导。结合第一方面的上述可能的实现方式,在第一方面的第五种可能的实现方式中,所述根据所述可推导变量集合中的变量的类型推导结果和/或所述不可推导变量集合,确定所述至少一个变量中第一变量的类型推导结果,还包括:若所述第二变量和/或所述第三变量属于所述不可推导变量集合,确定所述第一变量的类型推导结果为无法推导。结合第一方面的上述可能的实现方式,在第一方面的第六种可能的实现方式中,在所述确定所述第一变量的类型推导结果为无法推导之后,所述方法还包括:将所述第一变量添加至所述不可推导变量集合。具体地,对于包括三个变量的第一表达式,第一变量为第二变量和第三变量的函数,且所述第一变量的取值为所述第二变量或所述第三变量,编译装置需要根据该第二变量和第三变量的类型推导结果,确定该第一变量的类型推导结果,即根据该第二变量和第三变量所属集合,确定该第一变量的类型推导结果。例如,o=phi(p,q),其中,o为第一变量,p为第二变量,q为第三变量,编译装置需要根据p和q的类型推导结果来确定o的类型推导结果。其中,编译装置对第一变量的类型推导结果的确定可以分为如下几种情况:(1)第二变量和第三变量均属于可推导变量集合,且第二变量和第三变量的类型推导结果相同,编译装置可以将该第一变量的类型推导结果确定为可推导,且将该第一变量的类型确定为第二变量(第三变量)的类型推导结果;(2)第二变量和第三变量均属于可推导变量集合,且第二变量和第三变量的类型推导结果不相同,编译装置可以将该第一变量的类型推导结果确定为无法推导;(3)第二变量和第三变量中的至少一个变量属于不可推导变量集合,编译装置可以直接将该第一变量的类型推导结果确定为无本文档来自技高网...

【技术保护点】
1.一种编译方法,其特征在于,包括:获取待编译的第一动态语言程序;利用静态单一赋值转换处理,对所述第一动态语言程序中的至少一个变量进行类型推导,确定所述至少一个变量中每个变量的类型推导结果;根据所述每个变量的类型推导结果,对所述至少一个变量中能够推导出静态类型的变量进行静态化处理。

【技术特征摘要】
1.一种编译方法,其特征在于,包括:获取待编译的第一动态语言程序;利用静态单一赋值转换处理,对所述第一动态语言程序中的至少一个变量进行类型推导,确定所述至少一个变量中每个变量的类型推导结果;根据所述每个变量的类型推导结果,对所述至少一个变量中能够推导出静态类型的变量进行静态化处理。2.根据权利要求1所述的方法,其特征在于,所述利用静态单一赋值转换处理,对所述第一动态语言程序中的至少一个变量进行类型推导,确定所述至少一个变量中每个变量的类型推导结果,包括:利用所述静态单一赋值转换处理,确定可推导变量集合和/或不可推导变量集合,所述可推导变量集合包括所述至少一个变量中的一个或多个变量,所述可推导变量集合中的变量的类型推导结果为确定的静态类型,所述不可推导变量集合包括所述至少一个变量中的一个或多个变量,所述不可推导变量集合中的变量的类型推导结果为无法推导;根据所述可推导变量集合中的变量的类型推导结果和/或所述不可推导变量集合,确定所述至少一个变量中第一变量的类型推导结果,其中,所述第一变量既不属于所述可推导变量集合也不属于所述不可推导变量集合。3.根据权利要求2所述的方法,其特征在于,所述第一变量的定义语句为第一表达式,并且在所述第一表达式中,所述第一变量为第二变量和第三变量的函数,且所述第一变量的取值为所述第二变量或所述第三变量,根据所述可推导变量集合中的变量的类型推导结果和/或所述不可推导变量集合,确定所述至少一个变量中第一变量的类型推导结果,包括:若所述第二变量和所述第三变量均属于所述可推导变量集合,并且所述第二变量的类型推导结果和所述第三变量的类型推导结果相同,将所述第一变量的类型推导结果确定为所述第二变量的类型推导结果。4.根据权利要求3所述的方法,其特征在于,在所述将所述第一变量的类型推导结果确定为所述第二变量的类型推导结果之后,所述方法还包括:将所述第一变量添加至所述可推导变量集合。5.根据权利要求3或4所述的方法,其特征在于,所述根据所述可推导变量集合中的变量的类型推导结果和/或所述不可推导变量集合,确定所述至少一个变量中第一变量的类型推导结果,还包括:若所述第二变量和所述第三变量均属于所述可推导变量集合,并且所述第二变量的类型推导结果和所述第三变量的类型推导结果不相同,确定所述第一变量的类型推导结果为无法推导。6.根据权利要求3至5中任一项所述的方法,其特征在于,所述根据所述可推导变量集合中的变量的类型推导结果和/或所述不可推导变量集合,确定所述至少一个变量中第一变量的类型推导结果,还包括:若所述第二变量和/或所述第三变量属于所述不可推导变量集合,确定所述第一变量的类型推导结果为无法推导。7.根据权利要求5或6所述的方法,其特征在于,在所述确定所述第一变量的类型推导结果为无法推导之后,所述方法还包括:将所述第一变量添加至所述不可推导变量集合。8.根据权利要求2至7中任一项所述的方法,其特征在于,所述利用所述静态单一赋值转换处理,确定可推导变量集合和/或不可推导变量集合,包括:根据所述至少一个变量中的第四变量的定义语句,将所述第四变量的类型推导结果确定为第一类型,并将所述第四变量添加至所述可推导变量集合。9.根据权利要求2至8中任一项所述的方法,其特征在于,所述不可推导变量集合包括以下变量中的至少一种:所述第一动态语言程序中没有定义语句的变量、全局变量以及函数入参变量。10.根据权利要求2至9中任一项所述的方法,其特征在于,所述方法还包括:若所述至少一个变量中不再产生类型推导结果为可推导或不可推导的变量,确定已完成所述至少一个变量的类型推导。11.根据权利要求1至10中任一项所述的方法,其特征在于,在所述根据所述每个变量的类型推导结果,对所述至少一个变量中能够推导出静...

【专利技术属性】
技术研发人员:张辉周志德陈永健
申请(专利权)人:华为技术有限公司
类型:发明
国别省市:广东,44

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1