一种脚本引擎接口抽象层及其应用方法技术

技术编号:19542398 阅读:23 留言:0更新日期:2018-11-24 20:23
本发明专利技术提出脚本引擎接口抽象层及其应用方法,涉及计算机软件领域,包括宏模块、脚本与C++对象映射表、ScriptEngine模块、Value模块、AutoHandleScope模块、Class模块、State模块、Object模块、HandleObject模块。本发明专利技术可轻松适配不同的JavaScript甚至其它非JavaScript脚本引擎,保证脚本语言与原生语言之间调用的性能不下降的同时,做到轻松切换或升级底层脚本引擎且不需要修改任何的绑定代码;设计更加高效,代码从脚本层调用到用户C++层的调用是通过宏的方式在绑定代码编译期间确定的;抽象层接口采用面向对象的设计,接口简洁,满足编写绑定代码需要的所有功能,支持市面上主流的JavaScript脚本引擎。

A script engine interface abstraction layer and its application method

The invention provides an abstraction layer of script engine interface and its application method, which relates to the field of computer software, including macro module, script and C++ object mapping table, script Engine module, Value module, AutoHandleScope module, Class module, State module, Object module and HandleObject module. The invention can easily adapt different JavaScript or even other non-JavaScript script engines to ensure that the performance of calling between script language and native language does not decline, and at the same time, it can easily switch or upgrade the underlying script engine without modifying any binding code; the design is more efficient, and the code is called from script layer to user. The invocation of C++ layer is determined by macro during the compilation of binding code; the interface of abstract layer adopts object-oriented design, which is concise, meets all the functions needed to write binding code, and supports the mainstream JavaScript script engine on the market.

【技术实现步骤摘要】
一种脚本引擎接口抽象层及其应用方法
本专利技术涉及计算机软件领域,尤其是一种脚本引擎接口抽象层及其应用方法。
技术介绍
脚本绑定技术是指通过脚本引擎提供的接口将原生语言(C或C++)编写的类和方法注册到脚本层供脚本调用的一种技术。市面上主流的JavaScript脚本引擎有V8、JavaScriptCore、SpiderMonkey,ChakraCore,它们分别是Chrome、Safari、Firefox、微软Edge浏览器内嵌的JavaScript脚本引擎。不同脚本引擎提供的C++接口是不同的,甚至同一个脚本引擎在不同的版本提供C++接口也存在差异,这导致C++与脚本交互的绑定代码也存在很大差异。基于一种脚本引擎接口编写的绑定代码不可能通过简单的配置切换到其它脚本引擎,同一脚本引擎的不同版本也可能存在接口兼容问题导致无法轻松升级脚本引擎。当一个应用在不同平台需要不同的脚本引擎时,比如安卓手机上使用V8引擎,苹果手机使用系统内嵌的JavaScriptCore引擎,现有技术方案有:1、分别为不同平台使用不同的脚本引擎编写不一样的绑定代码,即需要多份绑定代码,维护成本翻倍,无法切换底层引擎。2018年初上线的微信小游戏采用此方案。2、NodeJS这个业界流行的开源库使用V8将一些C++编写的类型和方法注册到JavaScript脚本层中,开发者可以通过更易使用的JavaScript脚本语言编写复杂的客户端与服务端逻辑。微软ChakraCore团队通过node-chakracore项目成功地将NodeJS的底层切换为ChakraCore。Mozilla公司也使用类似方案(spidernode)将NodeJS底层切换为SpiderMonkey脚本引擎。此类型的方案需要实现一套适配层,适配层的接口与V8引擎提供的接口完全一致,使用ChakraCore或者SpiderMonkey等非V8引擎提供的功能来适配V8的所有接口。这种方案的缺点为:1)需要用非V8引擎实现V8引擎的全部功能,实现逻辑较复杂。2)绑定代码的编写者需要深入了解复杂的V8引擎提供的接口,学习成本较高。3)未提供便捷方法快速切换脚本引擎。3、NodeN-API:从NodeJS8.0开始,Node官方提供了一套N-API,N-API是一套抽象层接口,此抽象层接口不随着V8引擎接口的变化而变化,使用此API编写Node插件的开发者无需因为Node升级版本而修改绑定代码和重新编译插件,即插件的兼容性比NodeJS8.0之前版本更高。此方案的缺点为:1)抽象层只适配了V8引擎,暂时无法适配其它脚本引擎;2)抽象层解决的问题是插件升级问题,并不是最优性能的方案,即脚本接口的调用需要通过一层代码中转才能调用到用户编写的回调函数,调用开销较大。
技术实现思路
本专利技术一方面提供一种脚本引擎接口抽象层,包括宏模块、脚本与C++对象映射表、ScriptEngine模块、Value模块、AutoHandleScope模块、Class模块、State模块、Object模块、HandleObject模块,其中,所述宏模块用于解决不同脚本引擎回调函数参数类型和返回值类型不同的问题,不管底层使用什么引擎,开发者使用同一种回调函数的定义方式,定义完回调函数后,需要使用SE_BIND_XXX系列的宏对回调函数进行包装;所述脚本与C++对象映射表用于查询C++对象指针获取对应的脚本对象;所述ScriptEngine模块用于掌管脚本引擎的初始化、销毁、重启、C++模块注册、加载脚本、强制垃圾回收、脚本异常清理以及是否启用调试器;所述Value模块为脚本变量在C++层的引用;所述Object模块保存了对脚本对象的弱引用;所述HandleObject模块是一个辅助类,用于更加简单地管理Object模块中手动创建对象的释放、root和unroot操作;所述Class模块用于暴露C++类到脚本环境中,Class类型创建后,不需要手动释放内存,其占用内存会被抽象层自动处理;所述AutoHandleScope模块,其只在V8引擎上有实现,抽象层适配的其它脚本引擎目前都只是空实现这个类型;所述State模块作为绑定回调中的一个上下文对象,通过State模块可以取得当前的C++对象指针、se::Object对象指针、参数列表、返回值引用。本专利技术另一方面提供一种脚本引擎接口抽象层的应用方法,设定脚本相关操作的C++回调函数,在回调函数中关联C++对象,具体步骤如下:步骤1:获取namepace对象;步骤2:创建se::Class;步骤3:为se::Class定义属性与方法;步骤4:注册se::Class到脚本虚拟机中;步骤5:获取se::Class的proto对象;步骤6:通过proto对象设置绑定类的静态属性与静态方法;步骤7:清空异常。本专利技术提供的一种脚本引擎接口抽象层及其应用方法,其有益效果在于:可轻松适配不同的JavaScript甚至其它非JavaScript脚本引擎,保证脚本语言与原生语言(C/C++)之间调用的性能不下降的同时,做到轻松切换或升级底层脚本引擎且不需要修改任何的绑定代码;本专利技术的抽象层设计更加高效,代码从脚本层调用到用户C++层的调用是通过宏的方式在绑定代码编译期间确定的,这个过程不存在中转分发;抽象层接口采用面向对象的设计,接口简洁,包括了ScriptEngine,Class,Value,Object,HandleObject,State,AutoHandleScope这几种数据类型模块,满足编写绑定代码需要的所有功能,支持市面上主流的JavaScript脚本引擎。附图说明图1是本专利技术的脚本引擎接口抽象层模块图;图2是本专利技术的脚本引擎接口抽象层的应用框架图;图3是本专利技术的脚本引擎接口抽象层的应用流程图。具体实施方式为进一步说明各实施例,本专利技术提供有附图。这些附图为本专利技术揭露内容的一部分,其主要用以说明实施例,并可配合说明书的相关描述来解释实施例的运作原理。配合参考这些内容,本领域普通技术人员应能理解其他可能的实施方式以及本专利技术的优点。图中的组件并未按比例绘制,而类似的组件符号通常用来表示类似的组件。现结合附图和具体实施方式对本专利技术进一步说明。如图1所示,本实施例提供的脚本引擎接口抽象层,包括宏模块、脚本与C++对象映射表、ScriptEngine模块、Value模块、AutoHandleScope模块、Class模块、State模块、Object模块、HandleObject模块,其中,宏模块用于解决不同脚本引擎回调函数参数类型和返回值类型不同的问题,不管底层使用什么引擎,开发者使用同一种回调函数的定义方式,定义完回调函数后,需要使用SE_BIND_XXX系列的宏对回调函数进行包装。脚本引擎抽象层提供了如下几个宏:SE_BIND_PROP_GET宏:包装脚本对象属性读取的回调函数;SE_BIND_PROP_SET宏:包装脚本对象属性写入的回调函数;SE_BIND_FUNC宏:包装脚本函数,可用于全局函数、类成员函数、类静态函数;SE_DECLARE_FUNC宏:声明脚本函数,一般在.h头文件中使用;SE_BIND_CTOR宏:包装脚本构造函数;SE_BIND_SUB_C本文档来自技高网
...

【技术保护点】
1.一种脚本引擎接口抽象层,其特征在于,包括宏模块、脚本与C++对象映射表、ScriptEngine模块、Value模块、AutoHandleScope模块、Class模块、State模块、Object模块、HandleObject模块,其中,所述宏模块用于解决不同脚本引擎回调函数参数类型和返回值类型不同的问题,不管底层使用什么引擎,开发者使用同一种回调函数的定义方式,定义完回调函数后,需要使用SE_BIND_XXX系列的宏对回调函数进行包装;所述脚本与C++对象映射表用于查询C++对象指针获取对应的脚本对象;所述ScriptEngine模块用于掌管脚本引擎的初始化、销毁、重启、C++模块注册、加载脚本、强制垃圾回收、脚本异常清理以及是否启用调试器;所述Value模块为脚本变量在C++层的引用;所述Object模块保存了对脚本对象的弱引用;所述HandleObject模块是一个辅助类,用于更加简单地管理Object模块中手动创建对象的释放、root和unroot操作;所述Class模块用于暴露C++类到脚本环境中,Class类型创建后,不需要手动释放内存,其占用内存会被抽象层自动处理;所述AutoHandleScope模块,其只在V8引擎上有实现,抽象层适配的其它脚本引擎目前都只是空实现这个类型;所述State模块作为绑定回调中的一个上下文对象,通过State模块可以取得当前的C++对象指针、se::Object对象指针、参数列表、返回值引用。...

【技术特征摘要】
1.一种脚本引擎接口抽象层,其特征在于,包括宏模块、脚本与C++对象映射表、ScriptEngine模块、Value模块、AutoHandleScope模块、Class模块、State模块、Object模块、HandleObject模块,其中,所述宏模块用于解决不同脚本引擎回调函数参数类型和返回值类型不同的问题,不管底层使用什么引擎,开发者使用同一种回调函数的定义方式,定义完回调函数后,需要使用SE_BIND_XXX系列的宏对回调函数进行包装;所述脚本与C++对象映射表用于查询C++对象指针获取对应的脚本对象;所述ScriptEngine模块用于掌管脚本引擎的初始化、销毁、重启、C++模块注册、加载脚本、强制垃圾回收、脚本异常清理以及是否启用调试器;所述Value模块为脚本变量在C++层的引用;所述Object模块保存了对脚本对象的弱引用;所述HandleObject模块是一个辅助类,用于更加简单地管理Object模块中手动创建对象的...

【专利技术属性】
技术研发人员:陈建华凌华彬
申请(专利权)人:厦门雅基软件有限公司
类型:发明
国别省市:福建,35

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

1