展开

关键词

【nodejs系列】使用v8编写c++插件

虽然现在大部分情况都是使用n-api来编写插件,但是底层毕竟是v8(和libuv),使用v8编写简单的插件,同时熟悉v8的使用。 本文介绍在写c++插件时,简单又常用的写法,其实本质上,写插件的难处在于底层的能力和对libuv、v8的了解。话不多说,直接看代码。 #include <node.h> namespace demo { using v8::FunctionCallbackInfo; using v8::Isolate; using v8::Local ; using v8::Object; using v8::String; using v8::Value; using v8::FunctionTemplate; using v8::Function ; using v8::Number; using v8::MaybeLocal; using v8::Context; using v8::Int32; static int seq; // 定义一个工具函数

17010

V8 发布 v8

来源:开源中国 JavaScript 引擎 V8 发布了 8.0 版本,此版本除了修复一些 bug,毫无疑问又带来了性能的提高。 性能改进 先看看性能改进,这包括内存占用减少与速度提升: 指针压缩 V8 堆包含整个项目所有东西,例如浮点值、字符串字符、编译的代码和标定值(tagged values),标定值代表指向 V8 堆的指针或小整型 通常在减少内存的同时,也会牺牲速度性能,但是经过这一改进,V8 及其垃圾收集器中,都能够看到真实网站性能的提升。 ?

19120
  • 广告
    关闭

    腾讯云+社区系列公开课上线啦!

    Vite学习指南,基于腾讯云Webify部署项目。

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    c++服务器嵌入v8 js引擎胎教级教程

    逐渐有些原生语言项目(比如c++)因为希望有不停机更新的能力而引入脚本。这些团队往往有一套成熟c++服务器框架,他们往往选择把脚本作为库嵌入到C++程序的做法。 对于c++程序猿,v8还有个很诱人的地方,wasm的支持,c++编译成wasm在v8上跑,性能比js还能高一个台阶,而且还能热更新。 于是有了本文,本文会循序渐进的介绍怎么在linux c++程序里头嵌入v8: HelloWorld级别的示例; c++类封装到js; 把v8改为嵌入式nodejs; 上述三步都会附带完整的可运行代码 上述代码我用分割线分成了6块,其中: 第2块是v8的启动,第6块是v8的关闭,除非你要定制启动参数,启动多虚拟机啥的,否则这两部分都是固定的; 第1块有个Print函数,和这函数同声明的C++函数,都可以注册到 至此,我们能在c++程序里执行js代码, js能调用到c++代码。这对一些项目已经足够了。

    13720

    v8源码解析之ByteArray(v8 0.1.5)

    ByteArray是字节数组的实现,顾名思义,该数组的元素大小的一个字节,不过类似js的Uint16Array,Uint32Array数组一样,我们可以把多个元...

    30620

    C++协程库与嵌入V8的兼容性问题

    环境介绍 因为业务需求,需要在 C++ 中调用 js 代码,这里选择使用 V8 引擎。 C++ 中使用了部门自研的有一定历史的 RPC 框架,所绑定的协程库是 GNU pth。 碰到的第一个问题是: 在 Init 函数初始化 V8 实例的话,在业务函数中对 V8 的调用都会返回失败。 但是,如果在业务函数中再初始化 V8 实例的话,就可以成功调用 V8。 随着业务的发展,增加了第二个需要使用 V8 的接口。一开始很直接的思路,就是使用单例 V8 引擎,然后在调用业务函数的时候再初始化 V8V8 的问题? 另一个方向是从 V8 下手。首先得到最小复现代码:v8::JSON::Parse(...) 。如果出问题了,那么这个简单的从 JSON 中构造 V8 对象的语句就会失败。 (currentStackLimit) 这里又有个坑,是在调用这个函数的时候,需要加一个锁,否则它只会修改 C++ 栈阈值,而不会修改 js 的栈阈值,同样会导致栈溢出。

    1K90

    v8源码解析之Dictionary(v8 0.1.5)

    Dictionary底层是数组实现的,每个元素的大小是三个指针(key、value、detail)。接着我们看一下类的具体实现。1 value的存取

    29230

    保姆级教程: c++游戏服务器嵌入v8 js引擎

    导语 | 本文将介绍在c++游戏服务器上嵌入v8 js引擎的详细教程,关键步骤都会附带完整的可运行代码。并在文末为您附上github仓库链接。 而且由于大多数项目已经有现成的c++服务器框架,他们往往选择把脚本作为库嵌入到c++程序的做法。 对于c++程序猿,v8还有个很诱人的地方:支持wasm,c++编译成wasm在v8上跑,性能比js还能高一个台阶,而且还能热更新。 于是有了本文,本文会循序渐进的介绍怎么在linux c++程序里头嵌入v8: HelloWorld级别的示例; c++类封装到js; 把v8改为嵌入式nodejs; 上述三步都会附带完整的可运行代码,最后会附上 上述代码我用分割线分成了6块,其中: 第2块是v8的启动,第6块是v8的关闭,除非你要定制启动参数,启动多虚拟机啥的,否则这两部分都是固定的; 第1块有个Print函数,和这函数同声明的c++函数,

    15820

    v8源码解析之SymbolTable(v8 0.1.5)

    SymbolTable是哈希表的子类,元素大小是一个Object*。SymbolTable主要使用哈希表来存储字符串,给定一个字符串,算出哈希值,然后插入哈希表...

    19820

    v8源码解析之HashTable(v8 0.1.5)

    HashTable是v8中哈希表的实现,HashTable继承Array。HashTable提供一些公共的逻辑,供后续子类使用。我们看一下他 大内存布局。 ? 然后看一下类的定义。

    27330

    v8源码解析之数组系列1(v8 0.1.5)

    前言:很久没有看了,花点时间继续分析一下v8v8中很多数据结构都具备数组的特性,今天我们先介绍Array和FixedArray。他们是V8中很多数据结构的基类。 kSize; static const int kHeaderSize = kLengthOffset + kIntSize; private: // 禁止直接创建对象,复制函数,赋值函数,通过v8

    38120

    V8系统解读(一): V8 在 Chrome 中的位置&编译调试V8

    谈到 V8 ,估计大部分人会一种畏惧感,首先映入脑海的便是天花乱坠的 C++ 源码,但其实就算你掌握了 C++,也很难读懂源码,读懂里面的源码,并不是语言的问题,而是一个工程复杂度的问题。 所以 V8 所在的宿主环境也就是渲染进程,会给 V8 注入许多运行时的能力,使得在 JS 中能够顺利地调用。 这些能力并不属于 V8, 但对于 V8 的执行确实至关重要的。 你没有听错,这些能力都不是 V8 的,所以跟 V8 的创建和销毁没有关系,当你往这些 API 对象上挂载属性后,会一直会驻留于堆内存中。 以 v8 命令为例,对于一个 demo 文件: // index.js var text = '111'; 执行以下命令查看 V8 为这段 js 生成的字节码: v8 --print-bytecode 接着,我们搭建了 v8 的调试环境,能够输出 v8 的中间产物,让我们对 v8 的工作有更加直观的认识。

    76110

    Google V8 引擎

    V8可以独立运行,也可以嵌入到C++应用程序中运行。 为了提高性能,JavaScript引入了Java虚拟机和C++编译器中的众多技术。而一个完整JavaScript引擎的执行过程大致流程如下:源代码-→抽象语法树-→字节码-→JIT-→本地代码。 而java、C++等静态类型语言,在编译时候就可以确切知道变量的类型。因而JavaScript运行效率比C++或Java低。 在C++中,源代码需要经过编译才能执行,在生成本地代码的过程中,变量的地址和类型已经确定,运行本地代码时利用数组和位移就可以存取变量和方法的地址,不需要再进行额外的查找,几个机器指令即可完成,节省了确定类型和地址的时间 而对于JavaScript 来说,并不能像C++那样在执行时已经知道变量的类型和地址,所以在代码解析过程中,会产生很多的临时变量,而变量的存取是非常普遍和频繁的。

    1.2K50

    js引擎v8源码分析之MemoryAllocator(基于v8 0.1.5)

    length); Counters::memory_allocated.Decrement(length); size_ -= length; ASSERT(size_ >= 0); } // v8

    30210

    js引擎v8源码分析之Object(基于v8 0.1.5)

    Object是所有js对象在c++层的基类。 1 c++对象的类型 1 v8的对象是4字节对齐的,用地址的低两位出来标记对象的类型。 2 堆对象(HeapObject)是Object的子类。 1 type主要是用于记录c++对象的类型。 2 有一些单例的map对象,也是用于判断c++对象的类型的。 在这里插入图片描述 我们对c++对象的类型大概有了一个印象,下面看一下Object类的定义。下面是几个宏,用来判断c++对象的类型的。 smi是小整形,在v8中表示整形。长度是31位。 double Object::Number() { return IsSmi() ?

    25610

    js引擎v8源码分析之GlobalHandles(基于v8 0.1.5)

    GlobalHandles是实现v8中持久句柄功能的类。GlobalHandles主要是维护一个链表,每个节点维护堆对象的状态。我们先看看节点的定义。 = NULL) { func(v8::Persistent<v8::Object>(ToApi<v8::Object>(handle())), par); } } Object p = (*p)->next_addr(); } } // 重置free队列的头指针,因为链表的节点都被释放了 set_first_free(NULL); } 总结,主要介绍了v8

    48410

    js引擎v8源码分析之NewSpace(基于v8 0.1.5)

    NewSpace是v8内存管理中,负责管理新生代区的类。分为from和to两个区,每个区由SemiSpace对象管理。

    26720

    js引擎v8源码分析之HandleScope(基于v8 0.1.5)

    void** v8::HandleScope::CreateHandle(void* value) { // 获取下一个可用的地址 void** result = current void v8::HandleScope::DeleteExtensions() { ASSERT(current_.extensions ! 在这里插入图片描述 这就是v8中的HandleScope的大致原理。

    28710

    编译和使用V8

    V8编译是个比较麻烦的事情,不仅是下载、编译的过程,不同系统、不同编译器、不同C++版本都可能会出现不同的问题。 1 编译V8 2 编译V8为静态库 3 使用V8 1 编译V8 1 下载工具: git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git depot_tools和v8两个目录) 5 执行命令:alias gm=/code/v8_code/v8/tools/dev/gm.py,然后cd v8进入v8源码目录。 3 使用V8 我们可以在自己的项目里使用V8,这个已经有不少的例子,Node.js就是典型的例子,不过Node.js比较复杂,不利于快速理解如何使用V8,其实V8静态库和其他的静态库是一样,下面以V8的 ; return 0;} V8的API使用过程就是初始化V8,编译执行脚本,销毁V8

    43010

    js引擎v8源码分析之Handle(基于v8 0.1.5)

    Handle是使用v8的时候很重要的一个概念和类。他本质是堆对象的封装。我们通过Handle管理真正的对象,而不是直接操作对象。Handle在v8中有两个实现。一个是对外使用的一个是内部使用的。 ::String> Utils::ToLocal(v8::internal::Handle<v8::internal::String> obj) { return Local<String>( Persistent<Context> v8::Context::New(v8::ExtensionConfiguration* extensions, v8::Handle<ObjectTemplate> global_template, v8::Handle<Value> global_object 总结,这就是v8中关于handle的一些知识。

    33310

    js引擎v8源码分析之SemiSpace(基于v8 0.1.5)

    SemiSpace的管理新生代内存的类,即我们常听到的from区和to区。from区和to区都由一个SemiSpace对象管理。SemiSpace只管理地址,不...

    42410

    扫码关注云+社区

    领取腾讯云代金券