解构/黑客NodeJs

时间:2014-06-03 06:51:26

标签: javascript node.js operating-system

我正在尝试理解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

就我而言。有人能指出我接下来会发生什么,并帮助我填补这个难题的部分。

2 个答案:

答案 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的组合。它还使我能够深入潜水直到已知的抽象点。

我想分享一些我沿途收集的知识。 (如果它太琐碎,请原谅我的忽视)

  1. 首先,作为在浏览器上使用已经在浏览器上实现的DOM API的浏览器上使用js的人,我不会想到可以在V8之上创建新的API。 user568109在[原生代码]上的位上引导了我herehere。节点绑定是这个难题中最重要的部分。
  2. 虽然对于普通人来说,以下js代码行可能会显示为js,但实际上它们是不同的。一个是纯粹的js-> js调用,而第二个是通过底层绑定实现的。

    //normal js
    var x = require('http');
    var s = x.createServer();
    
    //native binding
    var tty = process.binding('tty_wrap');
    tty.guessHandleType();
    
    1. 使用C ++中绑定的本机实现,表面javascript只不过是语法糖或底层C ++片段的抽象。 Nikhil Marathe的这个talk - 幻灯片here - 有助于更好地理解事物。

    2. 现在已经解开了js和V8胶水,很明显,一旦我们处于C / C ++级别,它就可以直接(如果需要)或通过libuv与其他本机内核库通信。 Bert Belder编写的这个talk帮助更详细地理解了libuv。

    3. 了解了这张照片,现在我可以理解当我看到以下几行时会发生什么。

      var http = require('http');
      var server = http.createServer(function(req,res) { res.end('Hacking Node'); });
      server.listen(8081);