nodejsソース分析

2839 ワード

(簡単にnodejsのコードを分析して、大体のものを見てください.)
node_main.cc:入り口だけです.
int main(int argc, char *argv[]) {
  return node::Start(argc, argv);
}
 node.cc:
int Start(int argc, char *argv[]) {
  // This needs to run *before* V8::Initialize()
  // Use copy here as to not modify the original argv:
  Init(argc, argv_copy);
  V8::Initialize();
  {
    // Create all the objects, load modules, do everything.
    // so your next reading stop should be node::Load()!
    Load(process_l); 

    // All our arguments are loaded. We've evaluated all of the scripts. We
    // might even have created TCP servers. Now we enter the main eventloop. If
    // there are no watchers on the loop (except for the ones that were
    // uv_unref'd) then this function exits. As long as there are active
    // watchers, it blocks.
    uv_run(uv_default_loop(), UV_RUN_DEFAULT);

    EmitExit(process_l);
    RunAtExit();
  }
  return 0;
}
Init:入力パラメータに関するものを方法で処理し、また初期時間を得ました.
ロード:すべてのシナリオはこの時にロードされます.
uv_run(uvudfaultuloop):これはnodejsメッセージループのものですが、直接使うものです.
 
void Load(Handle<Object> process_l) {
  // Compile, execute the src/node.js file. (Which was included as static C
  // string in node_natives.h. 'natve_node' is the string containing that
  // source code.)

  // The node.js file returns a function 'f'
  atexit(AtExit);

  Local<Value> f_value = ExecuteString(MainSource(),
                                       IMMUTABLE_STRING("node.js"));
  assert(f_value->IsFunction());
  Local<Function> f = Local<Function>::Cast(f_value);

  // Now we call 'f' with the 'process' variable that we've built up with
  // all our bindings. Inside node.js we'll take care of assigning things to
  // their places.

  // We start the process this way in order to be more modular. Developers
  // who do not like how 'src/node.js' setups the module system but do like
  // Node's I/O bindings may want to replace 'f' with their own function.

  // Add a reference to the global object
  Local<Object> global = v8::Context::GetCurrent()->Global();
  Local<Value> args[1] = { Local<Value>::New(process_l) };

  f->Call(global, 1, args);

}
 ここからコードがnode.jsに移行することが分かります.これもこのオープンソースプロジェクトの名前がnode.jsです.C部分のコードは実際にロードと実行の役割を果たします.本当の内容はjsの部分で、node.jsはjsの部分の根です.
 
 まとめ:本質的にはnode.jsはlibevとv 8だけを組み合わせてjsのサーバー環境を作っています.それ自体は限られた機能を提供しています.例えば、v 8はブザーのサポートが足りなくて、自分でこれを強化しました.