Node.js- C++ Plug-In v8
几个重要的类:
- V8:这个是个大杂烩的工具类,从初始化到关闭平台都离不开它;
- ArrayBuffer是v8的数据类型;
- Isolate是v8中最重要的功能类,代表了一个v8引擎的实例。它不是线程安全的,如果在线程不安全情况下运行需要加锁;
- Local是v8中存储对象的结构,代表了被GC管理的对象引用。与其对应的就是持久性对象,如Global和Persistent;
- Context代表了在沙箱中运行的上下文。与Java一样,JavaScript也运行在一个沙箱安全环境中;
- Script代表了运行在v8中的脚本;
对象与句柄
与C/C++与Rust等存在栈式管理的语言不同,JavaScript并没有栈上分配这样的概念。但是在v8的实现中,是有通过栈式管理作用域的数据结构,就是例程中我们所看到的HandleScope。
另外还有SealHandleScope类,将当前的HandleScope封装起来,强制需要创建新的HandleScope.
v8中的对象按生命周期可以分为两类,由GC管理的局部对象Local,还有持久性的对象。
持久性的对象分为:一次性的永续对象Eternal,和全局性的PersistentBase。
PersistentBase根据管理所有权方式的不同,采用赋值和复制方式的叫做Persistent,采用移动语义的叫做Global.
还有个UniquePersistent的模块类,其实是Global的别名。C++11中定义模板别名的方式,之前我们有文章讲过了:
template
从例子中我们可以看到,通常我们使用的变量都是Local为主。不管是Context,String,Script还是Value都是通过Local模板来进行管理的:
// Create a new context.
Local
Local
String::NewFromUtf8(isolate, "'Hello' + ', World!'",
NewStringType::kNormal).ToLocalChecked();
// Compile the source code.
Local