Node.jsとV 8エンジン

3590 ワード

Node.jsはChrome V 8 JavaScript engineに基づくJavaScript実行時の環境です.別の角度からいえば、Node.jsはV 8を使ってJavaScriptという言語の境界を広げています.ブラウザを出て、直接操作システムのレベルで運行できます.
NodeはV 8のバッグをどう使いますか?
ps:本論文で研究したNode.jsのバージョンは6.10.3です.
起点:メーン
main関数はsrc/node_にあります.メール.ccの中
int main(int argc, char *argv[]) {
  // Disable stdio buffering, it interacts poorly with printf()
  // calls elsewhere in the program (e.g., any logging from V8.)
  setvbuf(stdout, nullptr, _IONBF, 0);
  setvbuf(stderr, nullptr, _IONBF, 0);
  return node::Start(argc, argv);
}
コードから分かるように、node名前空間のStart関数を呼び出しました.実際のことは何もしていません.
node:Startはsrc/node.ccのラインにあります.4709
最初はlibuv(本文はまだ議論しません.後は専門的な文章があります.)とV 8のために起動するパラメータを準備します.
ここで注目しているのはライン4742です.
StartNodeInstance(&instance_data);
メソッド名から、このfunctionで正式にnodeのインスタンスが起動していることが分かります.
起動ノードの例
この方法はsrc/node.ccのライン4604にあります.
この方法については次の内容に重点を置いています.
Isolate* isolate = Isolate::New(params);//line 4612

Isolate::Scope isolate_scope(isolate); //line 4628
HandleScope handle_scope(isolate);
Local context = Context::New(isolate);

Context::Scope context_scope(context);//line 4633

LoadEnvironment(env); //line 4651
4612行のnodeの例は自分のためにV 8エンジンの実例を作成しました.V 8の公式文書では、Isolateは独立したV 8エンジンの例を表しており、異なるIsolateは完全に分離されているという.
続いて、4628はこのエンジンの中に入り、その中でContectを作成しました.Contentという概念についてはもう少し話します.
In 8,a context is an execution environment that allows separate,unrelated,JavaScript apple appications to run in a single instance of V 8.You must explicity specify the context in which you want javapt.co.
公式の説明から、私達はcontextもサンドボックスの感じです.ただisolateより軽い砂箱です.なぜこのようなものが必要ですか?例えばブラウザの中にiframeがあります.新しいcontextを作成して、元のグローバルオブジェクトを多重化する方法などがあります.
4633行でこの運行環境に入って、そして重要な方法LoadEnvironmentを実行して、この方法の中でcppの世界からJavaScriptの中に入りました.
LoadEnvironment
この方法はsrc/node.c line 3482にあります.
この方法に対して、次の行に注目します.
//line 3500
Local script_name = FIXED_ONE_BYTE_STRING(env->isolate(),
                                                    "bootstrap_node.js");
Local f_value = ExecuteString(env, MainSource(env), script_name);

//line 3508
CHECK(f_value->IsFunction());
  Local f = Local::Cast(f_value);

//line 3547
Local arg = env->process_object();
f->Call(Null(env->isolate()), 1, &arg);
f_valueの内容はbootstrapです.node.js、このjsファイルの構造は以下の通りです.valueは匿名関数のcppの対象です.
(function(process){
    function startup(){
      ...
         //line 137
         // read the source
         const filename = Module._resolveFilename(process.argv[1]);                    
         var source = fs.readFileSync(filename, 'utf-8');
         // remove shebang and BOM
         source = internalModule.stripBOM(source.replace(/^#!.*/, ''));
         // wrap it
         source = Module.wrap(source);
         // compile the script, this will throw if it fails
         new vm.Script(source, {filename: filename, displayErrors: true});

        preloadModules();
        run(Module.runMain);
      ...
    }

    startup()
})
次に3547行で、この方法のCallを呼び出して、jsの世界に入りました.
命令行で指定されたスクリプトファイルをjsの137ギルドで読み込み、実行します.
締め括りをつける
nodeの起動過程は次のステップに分けられます.
  • 初期化V 8 Engine
  • コンパイルしてbootstrapを実行します.node.js
  • は、V 8モデルのjs functionの例
  • を得る.
  • はこのjs functionを実行します.このfunctionではコマンドラインで指定されたスクリプトを読み込み、
  • を実行します.
    試験アプレット:https://github.com/Acceptedlc/wddlc_js/blob/lanch 1/src/lach_stage1.c
    ps:運転環境はUbuntu 16.04 x 86_64