V8 引擎基本概念
下面我们来看一看 V8 引擎中的基本概念,熟悉这些基本概念,有助于理解后续小节中的示例:
- handle,handle是指向对象的指针,在V8中,所有的对象都通过handle来引用, handle 主要用于 V8 的垃圾回收机制。
- scope,scope是handle的集合,可以包含若干个handle,这样就无需将每个handle 逐次释放,而是直接释放整个 scope。
- context,context 是一个执行器环境,使用 context 可以将相互分离的 JavaScript 脚本在同一个 V8 实例中运行,而互不干涉。在运行 JavaScript 脚本是,需要显式的指定 context 对象。
在 V8 中,handle 分为两种:持久化(Persistent)handle 和本地(Local)handle,持久化 handle 存放在堆上,而本地 handle 存放在栈上。这个与 C/C++中的堆和栈的意义相同。 持久化 handle 与本地 handle 都是 Handle 的子类。在 V8 中,所有数据访问均需要通过 handle。需要注意的是,使用持久化 handle 之后,需要显式的调用 Dispose()来通知垃 圾回收机制。
在使用本地 handle 时,需要声明一个 HandleScope 的实例,scope 是 handle 的容器,使用 scope,则无需依次释放 handle。
HandleScope handle_scope;
Local<ObjectTemplate> temp;
由于 C++原生数据类型与 JavaScript 中数据类型有很大差异,因此 V8 提供了 Data 类,从 JavaScript 到 C++,从 C++到 JavaScrpt 都会用到这个类及其子类,比如:
Handle<Value> Add(const Arguments& args){
int a = args[0]->Uint32Value();
int b = args[1]->Uint32Value();
return Integer::New(a+b);
}
Integer 即为 Data 的一个子类。
V8 中,有两个模板(Template)类(并非 C++中的模板类):对象模板(ObjectTempalte) 和函数模板(FunctionTemplate),这两个模板类用以定义JavaScript对象和JavaScript 函数。我们在后续的小节部分将会接触到模板类的实例。通过使用 ObjectTemplate,可以将 C++中的对象暴露给脚本环境,类似的,FunctionTemplate 用以将 C++函数暴露 给脚本环境,以供使用。
初始化 context 是使用 V8 引擎所必需的过程,代码非常简单:
Persistent<Context> context = Context::New();
有了上面所述的基本概念之后,我们来看一下一个使用 V8 引擎的应用程序的基本流程:
- 创建HandleScope实例
- 创建一个持久化的Context
- 进入Context
- 创建脚本字符串
- 创建Script对象,通过Script::Compile()
- 执行脚本对象的Run方法
- 获取/处理结果
- 显式的调用Context的Dispose方法
{$ activeFileHint $}