一种支持多语言脚本执行的方法和装置与流程

文档序号:18256845发布日期:2019-07-24 10:18阅读:171来源:国知局
一种支持多语言脚本执行的方法和装置与流程

本发明涉及信息技术领域,尤其涉及一种支持多语言脚本执行的方法和装置。



背景技术:

目前绝大部分软件工程都只使用一种编程语言,而面对不同的应用场景,不同的编程语言各有其特性。不同的编程语言,由于运行环境不同,往往无法使用工程里面的功能,编程语言之间的调用无法互相打通。

虽然有些编程语言自带的语法糖能够大大降低代码量和维护工作,但是目前并没有一种方案可以轻量级的让一个工程支持多种编程语言。



技术实现要素:

本发明提供一种支持多语言脚本执行的方法和装置,以解决支持包含多种语言的脚本执行的问题。

本发明提供的支持多语言脚本执行的方法,包括:

在执行脚本之前,生成上下文数据的拷贝;其中,所述脚本由至少两种语言编写,所述上下文数据被至少两个脚本语言引擎共享;

根据所述脚本的语言为所述脚本匹配与所述脚本的语言相对应的所述脚本语言引擎以进行编译执行。

进一步,本发明所述的方法,还包括:

在执行脚本之前,将所述脚本的部分逻辑打包为函数;

在对所述函数编译时,将所述函数编译生成类文件;

将所述类文件的实例缓存至所述上下文数据。

进一步,本发明所述的方法,还包括:

使用类加载器运行所述类文件;其中,每个所述类文件对应一个所述类加载器。

进一步,本发明所述的方法,根据所述脚本的语言为所述脚本匹配与所述脚本的语言相对应的所述脚本语言引擎以进行编译执行的步骤还包括:

从所述上下文数据查询获取变量;

若在所述上下文数据未查询获取到所述变量,从缓存的所述类文件的实例查询获取所述变量;

若在缓存的所述类文件的实例未查询获取到所述变量,从工程的开源框架查询获取所述变量。

进一步,本发明所述的方法,根据所述脚本的语言为所述脚本匹配与所述脚本的语言相对应的所述脚本语言引擎以进行编译执行的步骤还包括:

若在所述工程的开源框架未查询到所述变量,则通过所述上下文数据的拷贝查询所述变量。

进一步,本发明所述的方法,还包括:

在每次所述脚本执行之前,使所述上下文数据的拷贝入栈;

在每次所述脚本执行之后,使所述上下文数据的拷贝出栈。

本发明提供的支持多语言脚本执行的装置,包括:

拷贝模块,用于在执行脚本之前,生成上下文数据的拷贝;其中,所述脚本由至少两种语言编写,所述上下文数据被至少两个脚本语言引擎共享;

编译执行模块,用于根据所述脚本的语言为所述脚本匹配与所述脚本的语言相对应的所述脚本语言引擎以进行编译执行。

进一步,本发明所述的装置,还包括:

缓存模块,用于:

在执行脚本之前,将所述脚本的部分逻辑打包为函数;

在对所述函数编译时,将所述函数编译生成类文件;

将所述类文件的实例缓存至所述上下文数据。

进一步,本发明所述的装置,还包括:

类加载器,用于运行所述类文件;其中,每个所述类文件对应一个所述类加载器。

进一步,本发明所述的装置,所述编译执行模块还用于:

从所述上下文数据查询获取变量;

若在所述上下文数据未查询获取到所述变量,从缓存的所述类文件的实例查询获取所述变量;

若在缓存的所述类文件的实例未查询获取到所述变量,从工程的开源框架查询获取所述变量。

进一步,本发明所述的装置,所述编译执行模块还用于:

若在所述工程的开源框架未查询到所述变量,则通过所述上下文数据的拷贝查询所述变量。

进一步,本发明所述的装置,还包括:

管理栈模块,用于:

在每次所述脚本执行之前,使所述上下文数据的拷贝入栈;

在每次所述脚本执行之后,使所述上下文数据的拷贝出栈。

本发明还提供一种存储介质,所述存储介质存储计算机程序指令,所述计算机程序指令根据本发明所述的方法进行执行。

本发明还提供一种计算设备,包括:用于存储计算机程序指令的存储器和用于执行计算机程序指令的处理器,其中,当该计算机程序指令被该处理器执行时,触发所述计算设备执行本发明所述的方法。

本发明提供的支持多语言脚本执行的方法和装置,可以轻量级支持多语言集成在一个工程中,并且语言之间可以互相调用。

附图说明

通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:

图1为本发明实施例一的支持多语言脚本执行的方法的流程示意图;

图2为本发明实施例二的支持多语言脚本执行的方法的流程示意图;

图3为本发明实施例三的支持多语言脚本执行的装置的结构示意图;

图4为本发明实施例四的支持多语言脚本执行的装置的结构示意图。

附图中相同或相似的附图标记代表相同或相似的部件。

具体实施方式

下面结合附图对本发明作进一步详细描述。

图1为本发明实施例一的支持多语言脚本执行的方法的流程示意图,如图1所示,本发明实施例一提供的支持多语言脚本执行的方法,包括:

步骤S101,在执行脚本之前,生成上下文数据的拷贝;其中,所述脚本由至少两种语言编写,所述上下文数据被至少两个脚本语言引擎共享。

步骤S102,根据所述脚本的语言为所述脚本匹配与所述脚本的语言相对应的所述脚本语言引擎以进行编译执行。

其中,脚本包含的多种语言中,既可以包含静态编程语言,也可以包含动态编程语言。即一脚本中,其一部分代码通过静态编程语言实现,而其它部分代码通过动态编程语言实现。动态编程语言相对于静态编程语言是不同的。动态编程语言在运行时进行编译并执行。而静态编程语言是在运行前,例如编译阶段,进行类型判断的。软件的工程以静态语言作为工程框架主体,可以保证架构的稳定性。但是在处理某些对灵活性要求高的业务逻辑场景的时候,静态语言每次需要重新修改、测试、编译、上线,迭代速度低。因此,面对迭代速度高的业务需求,采取动态编程语言实现的动态脚本更适配,例如需要在执行时动态判断调整的业务逻辑场景下,动态脚本更为适配。并且动态脚本可以提供更易用的语法糖来缩短脚本内容。如果在一个工程中以静态语言支撑工程的主体,以动态脚本来执行多变的业务逻辑,可以在保证架构稳定的前提下,极大地提升迭代速度。

其中,上下文数据可以被至少两个脚本语言引擎所共享,避免了开发人员需要手工介入脚本的引入和埋点,不需要事先在脚本的代码中埋下钩子就可以实现脚本之间的调用,还适用于具有并发或者事务的场景。

此外,通过不同的脚本语言引擎共享一个上下文数据,并且在每次执行脚本的时候生成一份该上下文数据的拷贝,可以保证数据不会被污染。即使脚本的执行发生错误,使上下文数据的变量发生错误,仍然可以在执行过程中从上下文数据的拷贝中自动恢复数据继续执行,提高多语言脚本执行时的容错率。

其中,脚本语言引擎可以包括动态脚本引擎和静态脚本引擎,分别对脚本中的动态编程语言实现的代码和静态编程语言实现的代码进行编译执行。在脚本执行过程中,当执行的是静态编程语言实现的代码部分时,调用静态脚本引擎对该部分代码进行编译执行。当执行过程中顺序执行至动态编程语言实现的代码部分时,切换为动态脚本引擎对该部分代码进行编译执行。

通过本发明实施例一的支持多语言脚本执行的方法,能够同时支持静态语言和动态语言,可以在保证架构稳定的前提下,极大地提升迭代速度,保证脚本执行过程中数据不会被污染。

图2为本发明实施例二的支持多语言脚本执行的方法的流程示意图,如图2所示,本发明实施例二提供的支持多语言脚本执行的方法,包括:

步骤S201,将所述脚本的部分逻辑打包为函数。

其中,每个脚本都可以将自身包含的一段独立的逻辑打包成为一个函数,这段独立的逻辑可通过一种语言编写完成。每个脚本可以包括若干相互独立的逻辑,每个逻辑即为脚本的一个部分。各个逻辑可分别采用不同的语言编写,即脚本由各个部分的独立逻辑构成整体,各个逻辑之间的语言不同。其中,可通过步骤S205在编译时将该打包得到的函数编译为一段class文件(类文件),并生成该class文件的实例缓存在上下文数据中,以供脚本执行时使用。

其中,所述脚本由至少两种语言编写。该脚本在运行时可以被动态编译为class文件(类文件)。脚本包含的多种语言中,既可以包含静态编程语言,也可以包含动态编程语言。即一脚本中,其一部分代码通过静态编程语言实现,而其它部分代码通过动态编程语言实现。动态编程语言相对于静态编程语言是不同的。动态编程语言在运行时进行编译并执行。而静态编程语言是在运行前,例如编译阶段,进行类型判断的。软件的工程以静态语言作为工程框架主体,可以保证架构的稳定性。但是在处理某些对灵活性要求高的业务逻辑场景的时候,静态语言每次需要重新修改、测试、编译、上线,迭代速度低。因此,面对迭代速度高的业务需求,采取动态编程语言实现的动态脚本更适配,例如需要在执行时动态判断调整的业务逻辑场景下,动态脚本更为适配。并且动态脚本可以提供更易用的语法糖来缩短脚本内容。如果在一个工程中以静态语言支撑工程的主体,以动态脚本来执行多变的业务逻辑,可以在保证架构稳定的前提下,极大地提升迭代速度。

步骤S202,生成上下文数据的拷贝。

其中,所述上下文数据被至少两个脚本语言引擎共享。上下文数据可以被至少两个脚本语言引擎所共享,避免了开发人员需要手工介入脚本的引入和埋点,不需要事先在脚本的代码中埋下钩子就可以实现脚本之间的调用,还适用于具有并发或者事务的场景。通过不同的脚本语言引擎共享一个上下文数据,并且在每次执行脚本的时候生成一份该上下文数据的拷贝,可以保证数据不会被污染。

步骤S203,在每次所述脚本执行之前,使所述上下文数据的拷贝入栈。

其中,每次脚本执行,都生成一份上下文数据的拷贝入栈,脚本执行完毕后,通过步骤S206使该份上下文数据的拷贝出栈,由此可以支持脚本的自调用,并保证上下文数据的独立性。即使脚本的执行发生错误,使上下文数据的变量发生错误,仍然可以在执行过程中从上下文数据的拷贝中自动恢复数据继续执行,提高多语言脚本执行时的容错率。

步骤S204,根据所述脚本的语言为所述脚本匹配与所述脚本的语言相对应的所述脚本语言引擎。

其中,脚本语言引擎可以包括动态脚本引擎和静态脚本引擎,分别对脚本中的动态编程语言实现的代码和静态编程语言实现的代码进行编译执行。在脚本执行过程中,当执行的是静态编程语言实现的代码部分时,调用静态脚本引擎对该部分代码进行编译执行。当执行过程中顺序执行至动态编程语言实现的代码部分时,切换为动态脚本引擎对该部分代码进行编译执行。

步骤S205,使用匹配得到的脚本语言引擎对脚本进行编译执行。

其中,步骤S205中,在对脚本进行编译时,按照如下步骤a1~a2进行:

a1.在对所述函数编译时,将所述函数编译生成类文件;

a2.将所述类文件的实例缓存至所述上下文数据。

其中,将生成的类文件的实例缓存在上下文数据时,可以在脚本执行时,便于从上下文数据中的缓存实例中查询获取执行所必需的变量。如果执行没有问题,则不再需要保存该实例,同时为了执行效率,需要每次执行结束后删除该实例,所以该实例仅为缓存于上下文数据。

其中,步骤S205中,当执行过程需要获取变量时,按照如下步骤b1~b4进行:

b1.从所述上下文数据查询获取变量;

b2.若在所述上下文数据未查询获取到所述变量,从缓存的所述类文件的实例查询获取所述变量;

b3.若在缓存的所述类文件的实例未查询获取到所述变量,从工程的开源框架查询获取所述变量;

b4.若在所述工程的开源框架(Spring)未查询到所述变量,则通过所述上下文数据的拷贝查询所述变量。

其中,步骤b4为可选步骤,当在工程的开源框架未查询到变量,即可结束脚本的执行并报错。但是考虑到上下文数据的拷贝独立的保存了脚本执行过程中的数据,因此,如果在开源框架未查询到变量,可通过上下文数据的拷贝继续查询。通过对脚本语言引擎中查询变量的逻辑进行重写,使其符合b1至b3的查询顺序,厘清变量获取规则,可以实现不同的脚本语言引擎之间共享同一个上下文数据。

步骤S206,在每次所述脚本执行之后,使所述上下文数据的拷贝出栈。

其中,脚本执行完以后,将上下文数据的拷贝出栈,由此可以支持脚本的自调用,并保证上下文数据的独立性。

步骤S207,使用类加载器运行所述类文件。

其中,每个所述类文件对应一个所述类加载器。由于脚本内容可以随时更改、随时替换,因此将每个编译后的class文件(类文件)单独运行在一个类加载器(classloader)中,可以避免各个逻辑执行时造成的相互干扰。

通过本发明实施例二的支持多语言脚本执行的方法,能够同时支持静态语言和动态语言,可以在保证架构稳定的前提下,极大地提升迭代速度,保证脚本执行过程中数据不会被污染。

图3为本发明实施例三的支持多语言脚本执行的装置的结构示意图,如图3所示,本发明实施例三提供的支持多语言脚本执行的装置,包括:拷贝模块31和编译执行模块32。

拷贝模块31,用于在执行脚本之前,生成上下文数据的拷贝;其中,所述脚本由至少两种语言编写,所述上下文数据被至少两个脚本语言引擎共享;

编译执行模块32,用于根据所述脚本的语言为所述脚本匹配与所述脚本的语言相对应的所述脚本语言引擎以进行编译执行。

本发明实施例三所述的装置为本发明实施例一所述的方法的实现装置,其具体原理与本发明实施例一所述的方法相同,此处不再赘述。

图4为本发明实施例四的支持多语言脚本执行的装置的结构示意图,如图4所示,本发明实施例四提供的支持多语言脚本执行的装置,包括:拷贝模块31、编译执行模块32、缓存模块41、类加载器42和管理栈模块43。

其中,拷贝模块31,用于在执行脚本之前,生成上下文数据的拷贝;其中,所述脚本由至少两种语言编写,所述上下文数据被至少两个脚本语言引擎共享。

其中,编译执行模块32,用于根据所述脚本的语言为所述脚本匹配与所述脚本的语言相对应的所述脚本语言引擎以进行编译执行。

其中,所述编译执行模块32还用于:

从所述上下文数据查询获取变量;

若在所述上下文数据未查询获取到所述变量,从缓存的所述类文件的实例查询获取所述变量;

若在缓存的所述类文件的实例未查询获取到所述变量,从工程的开源框架查询获取所述变量。

其中,所述编译执行模块32还用于:

若在所述工程的开源框架未查询到所述变量,则通过所述上下文数据的拷贝查询所述变量。

其中,缓存模块41,用于:

在执行脚本之前,将所述脚本的部分逻辑打包为函数;

在对所述函数编译时,将所述函数编译生成类文件;

将所述类文件的实例缓存至所述上下文数据。

其中,类加载器42,用于运行所述类文件。其中,每个所述类文件对应一个所述类加载器。

其中,管理栈模块43,用于:

在每次所述脚本执行之前,使所述上下文数据的拷贝入栈;

在每次所述脚本执行之后,使所述上下文数据的拷贝出栈。

本发明实施例四所述的装置为本发明实施例二所述的方法的实现装置,其具体原理与本发明实施例二所述的方法相同,此处不再赘述。

在本发明一个实施例中,还提供一种计算设备,包括:用于存储计算机程序指令的存储器和用于执行计算机程序指令的处理器,其中,当该计算机程序指令被该处理器执行时,触发所述计算设备执行本发明实施例一、实施例二所述的方法。

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

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

在本发明一个实施例中,还提供一种存储介质,所述存储介质存储计算机程序指令,所述计算机程序指令根据本发明实施例一、实施例二所述的方法进行执行。

计算机可读存储介质包括永久性和非永久性、可移动和非可移动媒体,可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的装置或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。

需要注意的是,本发明可在软件和/或软件与硬件的组合体中被实施,例如,可采用专用集成电路(ASIC)、通用目的计算机或任何其他类似硬件设备来实现。在一些实施例中,本发明的软件程序可以通过处理器执行以实现上文步骤或功能。同样地,本发明的软件程序(包括相关的数据结构)可以被存储到计算机可读记录介质中,例如,RAM存储器,磁或光驱动器或软磁盘及类似设备。另外,本发明的一些步骤或功能可采用硬件来实现,例如,作为与处理器配合从而执行各个步骤或功能的电路。

对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本发明内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。装置权利要求中陈述的多个单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。

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