nodejs v8 新特性——利用N-API编写c++ node扩展

JavaScript022

nodejs v8 新特性——利用N-API编写c++ node扩展,第1张

相信为nodejs写过 c++扩展的人,都有过nodejs版本升级之后c++需要重新编译的惨痛经历。nodejs v8.0之后node官方推出了N-API 大大的解决了这一问题。

N-API 是独立于v8引擎之外的模块。用来向c++扩展程序提供接口,从而达到了c++扩展程序和v8引擎的隔离。因此在当nodejs版本变化之后c++扩展程序无需重新编译也能运行。

下面我们来看如何利用N-API为nodejs写一个简单的扩展:

我们的例子只从nodejs方面讲起。nodejs版本为8.x 。

首先安装 node-gyp 用来编译我们的扩展程序

V8是一个由丹麦Google开发的开源JavaScript引擎,用於Google Chrome中。[2]Lars Bak是这个项目的组长。[3]

V8在执行之前将JavaScript编译成了机器码,而非位元组码或是直译它,以此提升效能。更进一步,使用了如内联缓存(inline caching)等方法来提高性能。有了这些功能,JavaScript程序与V8引擎的速度媲美二进制编译。[4]

传统的javascript是动态语言,又可称之为Prototype-based Language,JavaScript继承方法是使用prototype,透过指定prototype属性,便可以指定要继承的目标。属性可以在运行时添加到或从对象中删除,引擎会为执行中的物件建立一个属性字典,新的属性都要透过字典查找属性在内存中的位置。V8为object新增属性的时候,就以上次的hidden class为父类别,创建新属性的hidden class的子类别,如此一来属性访问不再需要动态字典查找了。

为了缩短由垃圾收集造成的停顿,V8使用stop-the-world, generational, accurate的垃圾收集器。[5]在执行回收之时会暂时中断程序的执行,而且只处理物件堆叠。还会收集内存内所有物件的指标,可以避免内存溢位的情况。V8组译器是基於Strongtalk组译器。[6]。

esmodulesimport是异步的。在游览器渲染进程内,v8和渲染引擎是共用一个主线程的,页面渲染的时候,渲染引擎作为同步任务跑在主线程上面,dom解析标签时,发现了脚本标签,经过解析,游览器会通过特定的io线程发出js资源请求,同时在渲染引擎运行在主线程上时,v8引擎是被挂起的。script标签上有2个属性,分别是defer和async,v8引擎执行js的时机取决于这2个属性,defer属性的效果是,脚本下载与DOM解析并行,只有当DOM解析完毕,才会执行JS内容。async属性的效果是,脚本下载与DOM解析并行,不管DOM是否解析完毕,只要脚本一旦下载完毕,就会执行JS内容。