我试图理解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和视窗版本编写的进程文件。
最后,经过进一步的调查,点击了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这就是我所得到的。谁能告诉我接下来会发生什么,并帮我填上这个谜题的碎片。
发布于 2014-06-03 12:14:52
我很惊讶没人提到利布夫。这是一个示意图。(这并不是百分之百准确)。
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平台(C++)函数具有V8绑定。因为节点提供事件执行和异步执行,所以您在事件循环上所做的一切都运行在libuv上。显示libuv用法的旧博客。
libuv为您处理系统调用的调度,V8处理您的JS代码。节点将JS扩展到系统。
发布于 2014-06-05 11:47:54
谢谢你user568109。这真的帮助我了解到,这不是单一的事情,而是js、V8、libuv、内核的组合。它也使我能够潜入更深的地方,直到一个已知的抽象点。
我想分享我在路上收集到的一些知识。(如果太琐碎的话,请原谅我的无知)
虽然对于普通的人来说,下面的js代码线可能以js的形式出现,但实际上它们是不同的。一个是纯js->js调用,第二个是通过底层绑定实现的。
//normal js
var x = require('http');
var s = x.createServer();
//native binding
var tty = process.binding('tty_wrap');
tty.guessHandleType();在理解了这张图片之后,现在我可以理解当我看到以下几行时会发生什么。
var http = require('http');
var server = http.createServer(function(req,res) { res.end('Hacking Node'); });
server.listen(8081);https://stackoverflow.com/questions/24008770
复制相似问题