G018_star sky♬头像
nodeJS他是如何用JavaScript封装C++的呢封面图

nodeJS他是如何用JavaScript封装C++的呢

Node.js 的 http 模块之所以能用 JavaScript 封装 C++,核心在于 Node.js 内部有一层 C++ Bindings(C++ 绑定层)。它扮演着“胶水”的角色,让上层的 JavaScript 代码能够调用底层由 C++ 和 C 语言库实现的功能。
具体过程可以拆解为以下几个步骤:
底层:C/C++ 库负责核心工作
Node.js 的底层依赖了多个高性能的 C/C++ 库。对于 http 模块来说,最核心的是 llhttp(一个用 C 语言写的轻量级 HTTP 解析器),以及负责处理网络连接的 libuv 和底层的 TCP 封装。这些库处理了 HTTP 报文的解析、TCP 流的读写等繁重且需要高性能的工作。

桥梁:C++ Bindings 暴露接口
JavaScript 无法直接调用 C++ 函数。因此,Node.js 在 C++ 层面写了一层“包装代码”(Bindings)。这层代码利用 Node.js 提供的机制(如 internalBinding 或早期的 process.binding),将底层 C++ 库的功能(比如“解析 HTTP 报文头”、“建立 TCP 连接”)映射成 JavaScript 可以识别的对象和方法。
例如,当你调用 http.createServer 时,JavaScript 代码实际上是在操作一个由 C++ 暴露出来的底层对象。

上层:JavaScript 模块进行逻辑编排
http 模块的 JavaScript 代码(如 lib/http.js)并不负责底层的字节解析。它的工作是:
调用 Bindings:通过 C++ 绑定层,触发底层的网络监听或数据解析。
事件驱动封装:将底层 C++ 的回调(如收到数据、连接建立)封装成 JavaScript 的 EventEmitter 事件(如 ‘request’、‘connection’)。
提供易用 API:提供 createServer、request、get 等方便开发者调用的接口。

当你写 http.createServer(…).listen(3000) 时:

JS 层:listen 方法被调用,它准备参数并调用 C++ Binding。

C++ Binding:接收到指令,调用底层的 libuv 去监听 3000 端口,并注册好当有连接进来时的回调。

C++ 底层:当有 HTTP 请求到达时,llhttp 解析原始数据,然后通过 Binding 层通知 JavaScript 层。

JS 层:封装好的 JavaScript 代码接收到通知,构造出 req(IncomingMessage)和 res(ServerResponse)对象,并触发你写的 createServer 回调函数。

总结来说,JavaScript 负责“指挥”和对外提供接口,C++ 负责“干活”和处理高性能的底层 I/O 与解析,而 C++ Bindings 是连接两者的通道。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/qq_42526440/article/details/169069820

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--