nodejs什么开发语言
Node.js 什么开发语言?
直接说结论:Node.js 本身是用 C++ 和 JavaScript 写的。但如果你以为它“只是发语 JavaScript”,那可能把问题想简单了。什开我第一次翻 Node.js 源码时,发语看到一堆 .cc 和 .h 文件,什开心里还嘀咕——这不是发语 JavaScript 运行时吗?怎么全是 C++ 的活儿?
打开 Node.js 的 GitHub 仓库,根目录下 src/ 文件夹里躺着大量 C++ 代码。什开比如 node.cc、发语node.h、什开node_buffer.cc,发语这些是什开 Node.js 的核心骨架。V8 引擎负责跑 JavaScript,发语但 V8 自己也是什开 C++ 写的。Node.js 把 V8 嵌进来,发语再自己写一套事件循环、什开文件系统、网络模块——这些底层能力,JavaScript 干不了,必须靠 C++ 直接跟操作系统对话。
那 JavaScript 在 Node.js 里扮演什么角色?很大一部分是“胶水”和“门面”。你写 require('fs') 的时候,调用的那个 fs 模块,上层接口是 JavaScript,底层实现是 C++。Node.js 源码里有个 lib/ 目录,里面全是 .js 文件,比如 fs.js、net.js、events.js。这些文件定义了开发者看到的 API,但真正干活的时候,它们会通过内部绑定(binding)调用 C++ 层。
fs.readFile('/etc/passwd', callback)。JavaScript 层先做参数校验、处理回调,然后调用 process.binding('fs') 拿到 C++ 暴露的 readFile 函数。C++ 层用 libuv 的线程池去读文件,读完再把结果传回 JavaScript 层,触发你的 callback。整条链路里,C++ 负责脏活累活,JavaScript 负责让你写得舒服。 libuv 是另一个关键角色。它是 Node.js 的跨平台异步 I/O 库,纯 C 写的。事件循环、非阻塞网络、文件系统操作,全靠 libuv 撑起来。Node.js 作者 Ryan Dahl 当年就是嫌 Apache 处理并发太笨重,才动手把 V8 + libuv + 自己的 C++ 绑定拼在一起。所以 Node.js 的“基因”里,C++ 和 C 占了很大比重。
有人可能会问:那 TypeScript 呢?Node.js 官方从 2023 年开始逐步把部分内部 JavaScript 代码迁移到 TypeScript,比如 lib/ 下的一些模块。但 TypeScript 最终编译成 JavaScript,运行时还是 V8 跑 JS。C++ 核心层没变,变的只是上层代码的组织方式。你写 Node.js 应用时用 TypeScript 很常见,但那是你的事,跟 Node.js 本身用什么语言开发是两码事。
我试过用 node --v8-options 看 V8 的编译参数,也翻过 deps/ 目录——里面躺着 V8、libuv、OpenSSL、zlib 这些依赖。V8 是 C++,libuv 是 C,OpenSSL 是 C,zlib 是 C。Node.js 像个总装厂,把这一堆 C/C++ 库拼起来,再用 JavaScript 和 C++ 写一层粘合代码。你运行的 node 可执行文件,本质上是一个 C++ 程序,只是它内置了一个 JavaScript 引擎。
所以下次有人问你 Node.js 是什么语言写的,别只说 JavaScript。准确点:C++ 是骨架,JavaScript 是皮肤,C 是神经,libuv 是血管。 你写业务逻辑用 JavaScript 或 TypeScript,但 Node.js 自己能跑起来,靠的是底下那一大坨 C++ 和 C。这个分层设计挺聪明的——底层性能敏感的部分用 C++,上层灵活多变的部分用 JavaScript。代价就是调试 Node.js 核心崩溃时,你得会看 C++ 堆栈,那感觉跟写 JS 完全两个世界。
最后提一句,Node.js 源码里 C++ 和 JavaScript 的比例大概是 6:4 左右,不同版本有浮动。你要是好奇,克隆下来跑个 cloc . 就知道了。我跑过一次,C++ 代码行数确实压过 JavaScript。这数字挺说明问题的。
(责任编辑:探索)














