我正在尝试理解Node内部工作,并且我无法拼凑出用js编写的Node如何挂钩/绑定到用C / C ++编写的低级系统调用。
当我写这段代码时 -
var http = require('http');
var server = http.createServer(function(req,res) { res.end('Hacking Node'); });
server.listen(8081);
server.listen如何侦听只有操作系统可以访问的特定端口?其他各种功能也是如此。
到目前为止的旅程一直都是这样。
我检查了net.js和os.js文件。但不能说得多。
此外,我挖掘了用C语言编写的进程文件 - unix和windows版本。
最后,经过进一步调查后,点击了Node.js文件
// https://github.com/joyent/node/tree/6cbfcdad46d733bb04332063727e304e449dc86b/src/node.js
有以下评论 -
// This file is invoked by node::Load in src/node.cc, and responsible for
// bootstrapping the node.js core. Special caution is given to the performance
// of the startup process, so many dependencies are invoked lazily.
Node.cc在第2708行加载此Node.js文件。
// https://github.com/joyent/node/blob/6cbfcdad46d733bb04332063727e304e449dc86b/src/node.cc - line 2708
就我而言。有人能指出我接下来会发生什么,并帮助我填补这个难题的部分。
答案 0 :(得分:5)
我很惊讶没有人提到libuv。这是一个示意图。 (这不是100%准确)。
2 V8 compiler
/ \
/ \
1 Your code 3 node.js core system libraries(net,fs,events)
JavaScript
------------
V8 bindings(C++)
/ | \
/ | \
4 node.js platform code C/C++
events fs net
\ | /
\ | /
\|/
runs on
5 libuv C/C++
High Performance Event Loop
|
syscalls
|
6 Kernel
记住你如何做.toString()并展示JS函数。这对V8绑定不起作用(显示[本机代码])。 node.js platform(C ++)函数具有V8绑定。因为节点提供了事件和异步执行,所以您在事件循环上执行的所有操作都在libuv上运行。显示libuv用法的旧blog。
libuv为您处理系统调用的调度,V8处理您的JS代码。节点将JS扩展到系统。
答案 1 :(得分:3)
谢谢user568109。真的,这帮助我得到了一个完整的图片,它只是js,V8,libuv,kernel的组合。它还使我能够深入潜水直到已知的抽象点。
我想分享一些我沿途收集的知识。 (如果它太琐碎,请原谅我的忽视)
虽然对于普通人来说,以下js代码行可能会显示为js,但实际上它们是不同的。一个是纯粹的js-> js调用,而第二个是通过底层绑定实现的。
//normal js
var x = require('http');
var s = x.createServer();
//native binding
var tty = process.binding('tty_wrap');
tty.guessHandleType();
使用C ++中绑定的本机实现,表面javascript只不过是语法糖或底层C ++片段的抽象。 Nikhil Marathe的这个talk - 幻灯片here - 有助于更好地理解事物。
现在已经解开了js和V8胶水,很明显,一旦我们处于C / C ++级别,它就可以直接(如果需要)或通过libuv与其他本机内核库通信。 Bert Belder编写的这个talk帮助更详细地理解了libuv。
了解了这张照片,现在我可以理解当我看到以下几行时会发生什么。
var http = require('http');
var server = http.createServer(function(req,res) { res.end('Hacking Node'); });
server.listen(8081);