掌桥专利:专业的专利平台
掌桥专利
首页

一种代码转换方法及装置

文献发布时间:2023-06-19 11:35:49


一种代码转换方法及装置

技术领域

本公开涉及计算机技术领域,具体而言,涉及一种代码转换方法及装置。

背景技术

在代码开发场景中,动态编程语言易于程序员进行开发,但代码运行效率较低、需要冷启动,不适于线上应用,静态编程语言代码的运行效率高,但不易于学习编写,不适于开发场景,因此,可以利用动态编程语言开发应用,再将其编译为静态编程语言推至线上使用,发挥两种编程语言的优势。

然而,动态编程语言中的变量的类型是动态的,一个变量可能存在多种类型,静态编程语言中变量的类型是静态的,一个变量只能存在一种类型,在编译过程中无法精确的将动态的变量转换为正确的静态变量,容易导致编译后的代码无法正常运行。

发明内容

本公开实施例至少提供一种代码转换方法及装置。

第一方面,本公开实施例提供了一种代码转换方法,包括:

获取由动态编程语言编写的待转换代码;所述待转换代码为待转换为静态编程语言的代码;

确定所述待转换代码中的目标动态变量;所述目标动态变量为在所述待转换代码中被多次赋值、且被赋值的赋值类型存在多个的动态变量;

在转换过程中,针对所述目标动态变量,创建静态编程语言下与各个所述赋值类型分别对应的静态变量,或者,创建静态编程语言下的容器变量,所述容器变量中定义了用于表征动态编程语言下的每个所述赋值类型的类型。

一种可选的实施方式中,所述确定所述待转换代码中的目标动态变量,包括:

基于所述动态编程语言的语法规则,确定所述待转换代码中包含的各个动态变量;

基于所述各个动态变量在被赋值时对应的赋值代码,确定所述各个动态变量在所述待转换代码中被赋值时对应的赋值类型;

将所述各个动态变量中,被多次赋值、且被赋值的赋值类型存在多个的动态变量作为所述目标动态变量。

一种可选的实施方式中,所述创建静态编程语言下与各个所述赋值类型分别对应的静态变量,包括:

在检测到当前转换的目标动态变量被赋值的赋值类型变化时,创建静态编程语言下与新的赋值类型对应的静态变量。

一种可选的实施方式中,所述创建静态编程语言下与所述新的赋值类型对应的静态变量,包括:

若所述静态编程语言的语法规则不允许类型不同的变量具有相同的名称,则基于预设的变量名称创建规则,创建静态编程语言下与所述新的赋值类型对应的静态变量,以使转换为静态编程语言的代码中不存在具有相同名称且类型不同的变量。

一种可选的实施方式中,所述创建静态编程语言下与所述新的赋值类型对应的静态变量,还包括:

若所述静态编程语言的语法规则允许类型不同的变量具有相同的名称,则创建静态编程语言下与所述新的赋值类型对应的静态变量,并在声明所述静态变量的代码中加入类型可变标识;所述静态变量的名称与所述目标动态变量的名称相同。

一种可选的实施方式中,在创建静态编程语言下的容器变量之后,所述方法还包括:

在转换过程中,将所述容器变量作为所述目标动态变量在转换后的静态变量,并将所述容器变量对应的运算代码转换为所述容器变量对应的运算函数;所述运算函数定义了所述容器变量中每个类型对应的运算代码。

一种可选的实施方式中,在所述待转换代码转换为静态编程语言之后,所述方法还包括:

对转换后得到的目标代码进行编译,得到所述目标代码的可执行产物;

在执行包含所述容器变量的可执行产物时,根据所述容器变量对应的赋值类型,从所述运算函数中选取并执行与所述容器变量的赋值类型对应的运算代码。

一种可选的实施方式中,所述方法还包括:

响应针对转换后得到的目标代码的修改指令,对转换后得到的目标代码进行修改,得到修改后的目标代码;

对修改后的目标代码进行编译,得到所述目标代码的可执行产物。

第二方面,本公开实施例还提供一种代码转换装置,包括:

获取模块,用于获取由动态编程语言编写的待转换代码;所述待转换代码为待转换为静态编程语言的代码;

确定模块,用于确定所述待转换代码中的目标动态变量;所述目标动态变量为在所述待转换代码中被多次赋值、且被赋值的赋值类型存在多个的动态变量;

转换模块,用于在转换过程中,针对所述目标动态变量,创建静态编程语言下与各个所述赋值类型分别对应的静态变量,或者,创建静态编程语言下的容器变量,所述容器变量中定义了用于表征动态编程语言下的每个所述赋值类型的类型。

一种可选的实施方式中,所述确定模块具体用于:

基于所述动态编程语言的语法规则,确定所述待转换代码中包含的各个动态变量;

基于所述各个动态变量在被赋值时对应的赋值代码,确定所述各个动态变量在所述待转换代码中被赋值时对应的赋值类型;

将所述各个动态变量中,被多次赋值、且被赋值的赋值类型存在多个的动态变量作为所述目标动态变量。

一种可选的实施方式中,所述转换模块在创建静态编程语言下与各个所述赋值类型分别对应的静态变量时,用于:

在检测到当前转换的目标动态变量被赋值的赋值类型变化时,创建静态编程语言下与新的赋值类型对应的静态变量。

一种可选的实施方式中,所述转换模块在创建静态编程语言下与所述新的赋值类型对应的静态变量时,用于:

若所述静态编程语言的语法规则不允许类型不同的变量具有相同的名称,则基于预设的变量名称创建规则,创建静态编程语言下与所述新的赋值类型对应的静态变量,以使转换为静态编程语言的代码中不存在具有相同名称且类型不同的变量。

一种可选的实施方式中,所述转换模块在创建静态编程语言下与所述新的赋值类型对应的静态变量时,还用于:

若所述静态编程语言的语法规则允许类型不同的变量具有相同的名称,则创建静态编程语言下与所述新的赋值类型对应的静态变量,并在声明所述静态变量的代码中加入类型可变标识;所述静态变量的名称与所述目标动态变量的名称相同。

一种可选的实施方式中,在创建静态编程语言下的容器变量之后,所述转换模块还用于:

在转换过程中,将所述容器变量作为所述目标动态变量在转换后的静态变量,并将所述容器变量对应的运算代码转换为所述容器变量对应的运算函数;所述运算函数定义了所述容器变量中每个类型对应的运算代码。

一种可选的实施方式中,所述装置还包括编译模块,用于:

对转换后得到的目标代码进行编译,得到所述目标代码的可执行产物;

在执行包含所述容器变量的可执行产物时,根据所述容器变量对应的赋值类型,从所述运算函数中选取并执行与所述容器变量的赋值类型对应的运算代码。

一种可选的实施方式中,装置还包括编译模块修改模块,用于:

响应针对转换后得到的目标代码的修改指令,对转换后得到的目标代码进行修改,得到修改后的目标代码;

对修改后的目标代码进行编译,得到所述目标代码的可执行产物。

第三方面,本公开实施例还提供一种电子设备,包括:处理器、存储器和总线,所述存储器存储有所述处理器可执行的机器可读指令,当电子设备运行时,所述处理器与所述存储器之间通过总线通信,所述机器可读指令被所述处理器执行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。

第四方面,本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。

本公开实施例提供的代码转换方法及装置,获取由动态编程语言编写的待转换代码;所述待转换代码为待转换为静态编程语言的代码;确定所述待转换代码中的目标动态变量;所述目标动态变量为在所述待转换代码中被多次赋值、且被赋值的赋值类型存在多个的动态变量;在转换过程中,针对所述目标动态变量,创建静态编程语言下与各个所述赋值类型分别对应的静态变量,或者,创建静态编程语言下的容器变量,所述容器变量中定义了用于表征动态编程语言下的每个所述赋值类型的类型。本公开实施例通过在转换过程中创建静态编程语言下与各个赋值类型对应的静态变量,或创建静态编程语言下的容器变量,以满足在静态语言下的语法对变量的需求,使转换后得到的代码能够正确运行。

为使本公开的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。

附图说明

为了更清楚地说明本公开实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,此处的附图被并入说明书中并构成本说明书中的一部分,这些附图示出了符合本公开的实施例,并与说明书一起用于说明本公开的技术方案。应当理解,以下附图仅示出了本公开的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。

图1示出了本公开实施例所提供的一种代码转换方法的流程图;

图2示出了本公开实施例所提供的另一种代码转换方法的流程图;

图3示出了本公开实施例所提供的一种代码转换装置的示意图;

图4示出了本公开实施例所提供的一种电子设备的示意图。

具体实施方式

为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。

应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。

本文中术语“和/或”,仅仅是描述一种关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中术语“至少一种”表示多种中的任意一种或多种中的至少两种的任意组合,例如,包括A、B、C中的至少一种,可以表示包括从A、B和C构成的集合中选择的任意一个或多个元素。

在将由动态编程语言编写的代码转换为由静态编程语言编程的代码时,由于静态编程语言中变量的类型是固定的,而动态编程语言中变量的类型却是动态的,可以存在多种类型,导致转换过程中难以对变量进行合适的处理,容易导致转换得到的代码无法正常运行,因此,转换过程通常由人工进行,要求业务人员对两种编程语言具有较高的了解程度。

基于上述研究,本公开提供了一种代码转换方法及装置,通过在转换过程中创建静态编程语言下与各个赋值类型对应的静态变量,或创建静态编程语言下的容器变量,以满足在静态语言下的语法对变量的需求,使转换后得到的代码能够正确运行。

为便于对本实施例进行理解,首先对本公开实施例所公开的一种代码转换方法进行详细介绍,本公开实施例所提供的代码转换方法的执行主体一般为具有一定计算能力的计算机设备,如终端设备,在一些可能的实现方式中,该代码转换方法可以通过处理器调用存储器中存储的计算机可读指令的方式来实现。

参见图1所示,为本公开实施例提供的代码转换方法的流程图,所述方法包括步骤S101~S103,其中:

S101、获取由动态编程语言编写的待转换代码;所述待转换代码为待转换为静态编程语言的代码。

该步骤中,待转换代码为由动态编程语言编写的代码,用户可以利用动态编程语言编写好需要的代码后,将其作为待转换代码,终端设备可以获取这些待转换代码,并对其进行处理,使其转换为由静态编程语言编写的代码。

其中,动态编程语言可以包括TypeScript语言、JavaScript语言等,静态编程语言可以包括Rust语言、C++语言等。

S102、确定所述待转换代码中的目标动态变量;所述目标动态变量为在所述待转换代码中被多次赋值、且被赋值的赋值类型存在多个的动态变量。

由于待转换代码中的动态变量可能存在多种类型,而静态编程语言下的同名变量不能出现不同的类型,因此,需要对存在多种类型的变量进行特殊处理,需要从待转换代码中筛选出存在多种类型的目标动态变量。

示例性的,在获取到待转换代码后,确定待转换代码中的各个赋值代码,比如,“d=10”即为一段赋值代码,在确定赋值代码后,可以根据赋值代码中变量被赋值的赋值类型,确定变量在代码中的实际类型,若一动态变量在待转换代码中存在多个实际类型,则将其筛选出来作为目标动态变量。

具体的,可以基于动态编程语言的语法规则,确定出待转换代码中包含的各个动态变量,然后,基于各个动态变量在赋值时对应的赋值代码,确定各个动态变量在待转换代码中被赋值时对应的赋值类型,最后,将各个动态变量中,被多次赋值、且被赋值的赋值类型存在多个的动态变量作为目标动态变量。

示例性的,在待转换代码中,若依次出现了“d=10”、“d=d+1”及“d=‘abc’”三段赋值代码,在“d=10”中,赋值的“10”为数值类型,则可以确定变量d此时的实际类型为数值类型,在“d=d+1”中,赋值的“d+1”中“1”为数值类型,“d”为变量自身,此时变量d的实际类型为数值类型,在“d=‘abc’”中,被赋值的“‘abc’”为字符类型,则变量d此时的实际类型为字符类型,在上述代码中,变量d先后被赋值多次,且被赋值的赋值类型为两种,则可以将变量d作为目标动态变量。

S103、在转换过程中,针对所述目标动态变量,创建静态编程语言下与各个所述赋值类型分别对应的静态变量,或者,创建静态编程语言下的容器变量,所述容器变量中定义了用于表征动态编程语言下的每个所述赋值类型的类型。

该步骤中,可以按照动态编程语言及静态编程语言之间的语法差异,对待转换代码进行转换,转换过程中,可以按照动态编程语言的语法将待转换代码分解为多个语法单元,并按照语法差异将动态编程语言的源语法单元转换为静态编程语言的目标语法单元。

这里,根据动态编程语言及静态编程语言之间的语法差异,按照语义等价标准,可以确定源语法单元与目标语法单元之间的转换关系,转换关系可能包含的种类如下:

(1)一对一关系,一个源语法单元转换为一个目标语法单元。

(2)多对一关系,多个源语法单元转换为一个目标语法单元。

(3)一对多关系,一个源语法单元转换为多个目标语法单元。

(4)多对多关系,多个源语法单元转换为多个目标语法单元。

在将待转换代码的源语法单元转换为静态编程语言的目标语法单元后,可以将得到的目标语法单元输入至语法汇总工具中,将目标语法单元汇总为连续的代码语句,得到转换后的目标代码。

这里,由于动态编程语言与静态编程语言在变量类型上的不同,单纯的根据语义转换无法保证转换后的代码能够正常运行,其转换后代码的功能也有可能会变化,因此,在转换过程中,需要对变量相关的语法单元进行特殊处理。

在转换过程中,可以创建静态编程语言下与各个赋值类型分别对应的静态变量,这些静态变量可以是相互独立的,具有不同的类型,在转换过程中可以将目标动态变量转换为对应的静态变量,使转换后得到的代码能够正常运行。

具体的,在转换过程中,可以在检测到当前转换的目标动态变量被赋值的赋值类型变化时,创建静态编程语言下与新的赋值类型对应的静态变量。

比如,在JS代码片段“d=10;d=d+1;d=‘abc’”中,变量“d”对应的实际类型包括数值类型和字符类型,在转换过程中,在转换“d=d+1”时,赋值类型并未变化,则不创建新的静态变量,在转换“d=‘abc’”时变量d对应的赋值类型从数值类型变为字符类型,因此可以生成静态变量e,转换为C++代码后可以为“d=10;d=d+1;e=‘abc’”其中,“d”与“e”即为生成的静态变量。

在静态编程语言中,有允许类型不同的变量具有相同名称的语言,也存在不允许类型不同的变量具有相同名称的语言,因此,可以检测转化的静态语言是否允许类型不同的变量具有相同的名称,再根据检测结果采取不同的处理方式。

具体的,若所述静态编程语言的语法规则不允许类型不同的变量具有相同的名称,如C++语言,则基于预设的变量名称创建规则,创建静态编程语言下与所述新的赋值类型对应的静态变量,以使转换为静态编程语言的代码中不存在具有相同名称且类型不同的变量。

进一步的,若所述静态编程语言的语法规则允许类型不同的变量具有相同的名称,如Rust语言,则创建静态编程语言下与所述新的赋值类型对应的静态变量,并在声明所述静态变量的代码中加入类型可变标识;所述静态变量的名称与所述目标动态变量的名称相同。

该步骤中,类型可变标识可以添加在变量首次声明的位置,比如,若待转换的JS代码为“var d=10;d=d+1;d=‘abc’”,则转换后的Rust代码可以为“let mut d=10;d=d+1;let d=‘abc’”,其中,“let”为声明字段,由“var”转换而来,在“d=d+1”字段中,变量“d”的类型没有变化,因此该变量“d”与“d=10”中的变量“d”是同一静态变量,不生成新的静态变量,而在“d=‘abc’”中,变量“d”的类型变为了字符类型,因此,需要生成新的静态变量,在转换的代码中加入声明新的变量的“let”字段,由于上述代码中存在多个时代的变量“d”,因此,在首次声明变量“d”时需要加入“mut”字段,表示变量“d”是可变的“mutable”。

进一步的,在创建静态编程语言下的容器变量的方式中,上述容器变量中可以定义了用于表征动态编程语言下的每个赋值类型的类型。

示例性的,若待转换代码为“var d=10;d+10;d-2;d=d+‘abc’”其对应的Rust代码可以为:“let d:Primitive=10;Primitive(Number)Add10;Primitive(Number)Minus2;Primitive(Number)Add‘abc’”。

其中,“Primitive”即为生成的容器变量,定义容器变量的代码可以为:

其中,容器变量中“String”、“Number”、“Boolean”为动态编程语言下的各个赋值类型,也即变量类型,而与上述动态编程语言下的赋值类型对应的“(String)”、“(f64)”、“(bool)”则为其对应的静态编程语言下的变量类型。

在上述转化后的Rust代码中,由于将变量的类型定义为了容器变量,而Rust语言中并没有关于容器变量的计算规则,需要向转换的代码中添加补充代码,用于定义容器变量的计算方法,再用定义的计算方法替换动态编程语言下的各个计算符号。可以在转换过程中,将容器变量作为目标动态变量在转换后的静态变量,并将容器变量对应的运算代码转换为容器变量对应的运算函数;运算函数定义了容器变量中每个类型对应的运算代码。

示例性的,定义的计算方法可以如下:

上述定义的计算方法中定义了“ADD”方法在不同类型下对应的计算规则,将运算符“+”转换为“ADD”方法,可以实现变量“b”在不同类型下的计算。

进一步的,在待转换代码转换为静态编程语言后,可以对转换后得到的目标代码进行编译,得到目标代码的可执行产物,目标代码的可执行产物能够被计算机设备运行,并执行目标代码对应的计算逻辑。

在执行包含容器变量的可执行产物时,可以根据容器变量对应的赋值类型,从上述运算函数中选取并执行与所述容器变量的赋值类型对应的运算代码。比如,在执行代码“Primitive(Number)Add‘abc’”时,调用上述运算代码中的ADD方法,经过判断,“ADD”字符左侧的赋值类型为Number,右侧的赋值类型为字符String,符合上述ADD方法中“(x,Primitive::String(y))”的情况,则执行其对应的代码“format!("{}{}",x,y).into()”,将变量与字符‘abc’拼接。

进一步的,在得到转换后的目标代码后,可以响应针对转换后的目标代码的修改指令,根据修改指令对转换后得到的目标代码进行修改,得到修改后的目标代码,再对修改后的目标代码进行编译,得到目标代码的可执行产物。

其中,针对目标代码的修改指令可以是用户输入的。

参见图2所示,为本公开实施例提供的另一种代码转换方法的流程图,其中,获取由TypeScript(TS)编程语言或JavaScript(JS)编程语言编写的源代码(待转换代码)A,然后,将A转换为抽象语法树(abstract syntax code,AST)B,抽象语法树B中可以包含多个语法单元,如图2中的B1、B2、B3、B4及BX等,其中,BX可以为包含多个语法单元的集合,之后,可以按照动态编程语言及静态编程语言之间的语法差异,按照语义等价标准,可以确定源语法单元与目标语法单元之间的转换关系,将TS或JS语言语法单元转换为Rust编程语言的语法单元,比如,TS或JS语言语法单元B1转换为了Rust编程语言的语法单元R1,B2与B3共同转为了R2,B4则转换为了两个Rust语言语法单元,分别为R3及R4,多个TS或JS语言语法单元BX可以转换为多个Rust编程语言的语法单元RY,上述创建静态编程语言下与各个赋值类型分别对应的静态变量,以及上述创建静态编程语言下的容器变量的步骤,可以作为转换语法单元步骤的一部分,将变量对应的语法单元转换为创建的静态变量或容器变量。

本公开实施例提供的代码转换方法,获取由动态编程语言编写的待转换代码;所述待转换代码为待转换为静态编程语言的代码;确定所述待转换代码中的目标动态变量;所述目标动态变量为在所述待转换代码中被多次赋值、且被赋值的赋值类型存在多个的动态变量;在转换过程中,针对所述目标动态变量,创建静态编程语言下与各个所述赋值类型分别对应的静态变量,或者,创建静态编程语言下的容器变量,所述容器变量中定义了用于表征动态编程语言下的每个所述赋值类型的类型。本公开实施例通过在转换过程中创建静态编程语言下与各个赋值类型对应的静态变量,或创建静态编程语言下的容器变量,以满足在静态语言下的语法对变量的需求,使转换后得到的代码能够正确运行。

本领域技术人员可以理解,在具体实施方式的上述方法中,各步骤的撰写顺序并不意味着严格的执行顺序而对实施过程构成任何限定,各步骤的具体执行顺序应当以其功能和可能的内在逻辑确定。

基于同一发明构思,本公开实施例中还提供了与代码转换方法对应的代码转换装置,由于本公开实施例中的装置解决问题的原理与本公开实施例上述代码转换方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。

参照图3所示,为本公开实施例提供的一种代码转换装置的示意图,所述装置包括:

获取模块310,用于获取由动态编程语言编写的待转换代码;所述待转换代码为待转换为静态编程语言的代码;

确定模块320,用于确定所述待转换代码中的目标动态变量;所述目标动态变量为在所述待转换代码中被多次赋值、且被赋值的赋值类型存在多个的动态变量;

转换模块330,用于在转换过程中,针对所述目标动态变量,创建静态编程语言下与各个所述赋值类型分别对应的静态变量,或者,创建静态编程语言下的容器变量,所述容器变量中定义了用于表征动态编程语言下的每个所述赋值类型的类型。

一种可选的实施方式中,所述确定模块320具体用于:

基于所述动态编程语言的语法规则,确定所述待转换代码中包含的各个动态变量;

基于所述各个动态变量在被赋值时对应的赋值代码,确定所述各个动态变量在所述待转换代码中被赋值时对应的赋值类型;

将所述各个动态变量中,被多次赋值、且被赋值的赋值类型存在多个的动态变量作为所述目标动态变量。

一种可选的实施方式中,所述转换模块330在创建静态编程语言下与各个所述赋值类型分别对应的静态变量时,用于:

在检测到当前转换的目标动态变量被赋值的赋值类型变化时,创建静态编程语言下与新的赋值类型对应的静态变量。

一种可选的实施方式中,所述转换模块330在创建静态编程语言下与所述新的赋值类型对应的静态变量时,用于:

若所述静态编程语言的语法规则不允许类型不同的变量具有相同的名称,则基于预设的变量名称创建规则,创建静态编程语言下与所述新的赋值类型对应的静态变量,以使转换为静态编程语言的代码中不存在具有相同名称且类型不同的变量。

一种可选的实施方式中,所述转换模块330在创建静态编程语言下与所述新的赋值类型对应的静态变量时,还用于:

若所述静态编程语言的语法规则允许类型不同的变量具有相同的名称,则创建静态编程语言下与所述新的赋值类型对应的静态变量,并在声明所述静态变量的代码中加入类型可变标识;所述静态变量的名称与所述目标动态变量的名称相同。

一种可选的实施方式中,在创建静态编程语言下的容器变量之后,所述转换模块330还用于:

在转换过程中,将所述容器变量作为所述目标动态变量在转换后的静态变量,并将所述容器变量对应的运算代码转换为所述容器变量对应的运算函数;所述运算函数定义了所述容器变量中每个类型对应的运算代码。

一种可选的实施方式中,所述装置还包括编译模块,用于:

对转换后得到的目标代码进行编译,得到所述目标代码的可执行产物;

在执行包含所述容器变量的可执行产物时,根据所述容器变量对应的赋值类型,从所述运算函数中选取并执行与所述容器变量的赋值类型对应的运算代码。

一种可选的实施方式中,装置还包括编译模块修改模块,用于:

响应针对转换后得到的目标代码的修改指令,对转换后得到的目标代码进行修改,得到修改后的目标代码;

对修改后的目标代码进行编译,得到所述目标代码的可执行产物。

关于装置中的各模块的处理流程、以及各模块之间的交互流程的描述可以参照上述方法实施例中的相关说明,这里不再详述。

对应于图1中的代码转换方法,本公开实施例还提供了一种电子设备400,如图4所示,为本公开实施例提供的电子设备400结构示意图,包括:

处理器41、存储器42、和总线43;存储器42用于存储执行指令,包括内存421和外部存储器422;这里的内存421也称内存储器,用于暂时存放处理器41中的运算数据,以及与硬盘等外部存储器422交换的数据,处理器41通过内存421与外部存储器422进行数据交换,当所述电子设备400运行时,所述处理器41与所述存储器42之间通过总线43通信,使得所述处理器41执行以下指令:

获取由动态编程语言编写的待转换代码;所述待转换代码为待转换为静态编程语言的代码;

确定所述待转换代码中的目标动态变量;所述目标动态变量为在所述待转换代码中被多次赋值、且被赋值的赋值类型存在多个的动态变量;

在转换过程中,针对所述目标动态变量,创建静态编程语言下与各个所述赋值类型分别对应的静态变量,或者,创建静态编程语言下的容器变量,所述容器变量中定义了用于表征动态编程语言下的每个所述赋值类型的类型。

一种可选的实施方式中,所述处理器41执行的指令中,所述确定所述待转换代码中的目标动态变量,包括:

基于所述动态编程语言的语法规则,确定所述待转换代码中包含的各个动态变量;

基于所述各个动态变量在被赋值时对应的赋值代码,确定所述各个动态变量在所述待转换代码中被赋值时对应的赋值类型;

将所述各个动态变量中,被多次赋值、且被赋值的赋值类型存在多个的动态变量作为所述目标动态变量。

一种可选的实施方式中,所述处理器41执行的指令中,所述创建静态编程语言下与各个所述赋值类型分别对应的静态变量,包括:

在检测到当前转换的目标动态变量被赋值的赋值类型变化时,创建静态编程语言下与新的赋值类型对应的静态变量。

一种可选的实施方式中,所述处理器41执行的指令中,所述创建静态编程语言下与所述新的赋值类型对应的静态变量,包括:

若所述静态编程语言的语法规则不允许类型不同的变量具有相同的名称,则基于预设的变量名称创建规则,创建静态编程语言下与所述新的赋值类型对应的静态变量,以使转换为静态编程语言的代码中不存在具有相同名称且类型不同的变量。

一种可选的实施方式中,所述处理器41执行的指令中,所述创建静态编程语言下与所述新的赋值类型对应的静态变量,还包括:

若所述静态编程语言的语法规则允许类型不同的变量具有相同的名称,则创建静态编程语言下与所述新的赋值类型对应的静态变量,并在声明所述静态变量的代码中加入类型可变标识;所述静态变量的名称与所述目标动态变量的名称相同。

一种可选的实施方式中,在执行创建静态编程语言下的容器变量之后,所述处理器41还用于执行:

在转换过程中,将所述容器变量作为所述目标动态变量在转换后的静态变量,并将所述容器变量对应的运算代码转换为所述容器变量对应的运算函数;所述运算函数定义了所述容器变量中每个类型对应的运算代码。

一种可选的实施方式中,在所述待转换代码转换为静态编程语言之后,所述处理器41还用于执行:

对转换后得到的目标代码进行编译,得到所述目标代码的可执行产物;

在执行包含所述容器变量的可执行产物时,根据所述容器变量对应的赋值类型,从所述运算函数中选取并执行与所述容器变量的赋值类型对应的运算代码。

一种可选的实施方式中,所述处理器41还用于执行:

响应针对转换后得到的目标代码的修改指令,对转换后得到的目标代码进行修改,得到修改后的目标代码;

对修改后的目标代码进行编译,得到所述目标代码的可执行产物。

本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法实施例中所述的代码转换方法的步骤。其中,该存储介质可以是易失性或非易失的计算机可读取存储介质。

本公开实施例还提供一种计算机程序产品,该计算机程序产品承载有程序代码,所述程序代码包括的指令可用于执行上述方法实施例中所述的代码转换方法的步骤,具体可参见上述方法实施例,在此不再赘述。

其中,上述计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(Software Development Kit,SDK)等等。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。

所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-OnlyMemory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。

最后应说明的是:以上所述实施例,仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应所述以权利要求的保护范围为准。

相关技术
  • 代码转换装置、用于代码转换装置的代码转换方法及程序
  • 代码转换方法、装置、计算机存储介质和代码转换终端
技术分类

06120112986762