粗略研究了一下node.js源码,它有8000行C++代码,2000行javascript代码,来看看js和C++间是怎么组织连接起来,以及各个模块是怎样互相调用的。
本文使用的node.js版本是0.4.8,可以在https://github.com/joyent/node/tree/v0.4.8这里看到源码。
js2c.py
node.js使用了V8附带的js2c.py工具把所有内置的js代码转换成C++里的数组,生成node_natives.h直接include到程序中,成了C++源码的一部分。这样做能提高内置js模块的编译效率。
node.js里内置的javascript包括了主程序src/node.js和模块程序lib/*.js,通过js2c.py让每一个js文件都生成一个源码数组,存放在build/src/node_natives.h里,node_natives.h在node.js编译后才会生成(编译的脚本wscript中调用了js2c.py),可以看到大致的结构如下:
namespace node {
const char node_native[] = {47, 47, 32, 67, 112 ......}
const char console_native[] = {47, 47, 32, 67, 112 ......}
const char buffer_native[] = {47, 47, 32, 67, 112 ......}
.....
}
struct _native { const char* name; const char* source; size_t source_len;};
static const struct _native natives[] = {
{ "node", node_native, sizeof(node_native)-1 },
{ "dgram", dgram_native, sizeof(dgram_native)-1 },
{ "console", console_native, sizeof(console_native)-1 },
{ "buffer", buffer_native, sizeof(buffer_native)-1 },
....
}
这个文件被包含在node_javascript.cc里,node_javascript.cc提供了两个接口:
MainSource() 处理node_native源码返回v8::Handle类型的数据可供编译。
DefineJavaScript(target) 把其他所有模块源码变成v8::Handle类型后加载到传入的target对象上。
所有的js模块都被转换成了C数组,接下来看看它们怎么执行和互相调用。
(更多…)
