V8引擎、 libuv 和 N-API

Node.js系统

 application 应用将代码送到V8处理引擎处理js,其他io操作通过nodejs bindings 内部封装的 os operation。

 

llibuv是一个调度系统,本身不处理底层api,只负责接住从nodejs传过来的事件,剩下的事情由操作系统处理,操作系统处理事件的时候 worker threads 等待处理结果。

 

V8的线程是程序调起来的,当执行程序的时候,就会拉起nodejs的进程,工作进程也是主进程。

 

libuv 异步机制和调用系统两个作用。

 

什么是V8引擎

v8引擎是一种JavaScript引擎的实现。JavaScript引擎是执行JavaScript代码的程序或解释器。除了v8引擎,还有其他 JavaScript引擎,比如:Rhin、SpiderMonkey、JavaScriptCore、Chakra、Nashorn、JerryScript等。

 

V8使用C++开发,在运行JavaScript之前,相比其它的JavaScript的引擎转换成字节码或解释执行,V8将其编译成原生机器码(IA-32, x86-64, ARM, or MIPS CPUs),在V8引擎下的运行速度媲美二进制程序。

 

V8支持众多操作系统,如windows、linux、android等,也支持其他硬件架构,如IA32,X64,ARM等,具有很好的可移植和跨平台特性。

 

 

libuv

libuv是一个跨平台聚焦于异步IO的库,著名的event-loop便是libuv的一大特色。Node.js 能够实现跨平台,就是利用了libuv。

 


N-API

编写 C/C++ 的扩展本来就是一件很复杂的事情,另外,开发者需要了解 V8 以及 NAN(Native Abstractions for Node.js) 的 API/ABI, 而这些 API/ABI 本身不是为 Node.js 的场景设计的因此并不友好。另外,C/C++ 的扩展直接依赖 V8 以及 NAN 的接口稳定性,使得编译维护的成本非常高。

 

Node 10 正式引入的 N-API 就是要解决这个问题,通过提供一个稳定的 ABI 抽象层,使得 C/C++ 扩展的跨平台编译成本显著降低。

 

C/C++ 的生态因为缺乏统一的构建工具链以及包管理工具,用 Rust 替代 C/C++ 是一个很好的选择,Rust 有现代化的包管理器,经过这么多年的发展有了非常多的沉淀。比起 C/C++ 生态,Rust 生态的包属于只要有,都可以直接用 的状态,而 C/C++ 生态中的第三方代码则属于肯定有,但不一定能直接用的状态。这种状态下,用 Rust 开发 Node addon 是更好的选择。



参考:

https://www.jianshu.com/p/81f6ded64ab2

https://www.yuque.com/nznql7/qgxbp1/lvoyu1

https://cloud.tencent.com/developer/article/1700664

修改时间 2021-05-03

真诚赞赏,手留余香
赞赏
随机推荐
Javascript 获取时间戳
jQuery Mobile弹出对话框后不刷新原页面,保持原页面内容不变
JS时间戳转换
Node.js 异步异常处理
javascript延迟操作setInterval
Dedecms 织梦5.7 文章时间问题
Webpack使用polyfill打包兼容低版本浏览器
PSR规范
MYSQL导入数据出现The MySQL server is running with the --secure-file-priv
php生成唯一识别码uuid
QQ号

微信联系我

夜间模式切换
回到顶部