zoukankan      html  css  js  c++  java
  • Node.js-C++Plug-In_v8

    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 using UniquePersistent = Global;

    从例子中我们可以看到,通常我们使用的变量都是Local为主。不管是Context,String,Script还是Value都是通过Local模板来进行管理的:
    // Create a new context.
    Local context = Context::New(isolate);
    Local source =
    String::NewFromUtf8(isolate, "'Hello' + ', World!'",
    NewStringType::kNormal).ToLocalChecked();
    // Compile the source code.
    Local