この環境には、ヒープ空間とスタック空間、グローバル実行コンテキスト、グローバルスコープ、組み込みコンストラクタ関数、ホスト環境が提供する拡張関数とオブジェクト、メッセージループシステムなどが含まれます。実行環境が準備された後、V8はJSコードの実行を開始します:ソースコードの解析、バイトコードの生成、実行のための解釈とコンパイル。
ホスト環境
ブラウザとNode.jsは共にV8のホスト環境であり、ブラウザは基本的なメッセージループシステム、グローバル変数、V8のWeb APIを提供します。 V8のコアはECMAScript標準の実装であり、ECMAScriptで定義されたオブジェクトとObject、functionなどのコア関数を提供し、V8はゴミコレクター、連結などの基本的なコンテンツも提供します。V8の不適切な使用は、メインスレッドのリソースを占有し、その結果、ブラウザが立ち往生します。
データストアの構築:ヒープ空間とスタック空間
V8は起動時にヒープ空間とスタック空間の両方を作成し、生成されたデータは両方の空間に配置されます。
スタックスペースはネイティブデータの格納とJS関数呼び出しの管理に使用され、スタック構造は先入れ先出しです。関数の実行が終了すると、関数の実行コンテキストは破棄されます。スタック空間の探索効率は非常に高く、メモリ上の比較的大きな連続空間を見つけることは困難です。そのため、V8はスタック空間のサイズに制限を設け、関数呼び出しが深すぎる場合、V8はスタックオーバーフローエラーを投げることがあります。
データが大きかったり、離散的な場合は、ヒープ空間を使って格納することができます。ヒープ空間はオブジェクト型の離散的なデータを格納するために使用することができます。JSの基本的なデータを除いて、関数、オブジェクト、配列などの他のデータはすべてヒープ空間に存在します。
グローバル実行コンテキストとグローバルスコープ
ベースメモリ空間を初期化した後、V8はグローバル実行コンテキストとグローバルスコープを初期化します。グローバルスコープは、現在のコードを実行するために必要な変数宣言や thisポインタなどを保持するために使用されます。
実行コンテキストには、変数環境、語彙環境、thisキーワードが含まれます。
- 可変環境:グローバル関数、グローバルウィンドウオブジェクトなど。
- 語彙環境: let、const で定義された変数の内容。
- this」キーワード:グローバルなthisのポイント。
グローバルな実行コンテキストはV8が生きている間は破棄されず、ヒープにキャッシュされたままです。グローバルスコープは静的で、実行コンテキストは動的です。
イベントループシステムの構築
ヒープ空間とスタック空間、生成されたグローバルスコープとグローバル実行コンテキストを使用して、次のステップは、V8がイベントループシステムを使用してタスクを実行することです。V8は、ホスト環境が提供するメインスレッドを使用し、ループ呼び出しは次のイベントを待ち受けます。シミュレーションコードは以下の通りです:
while(1){
Task task = GetNewTask();
RunTask(task);
}
もしV8がDOMの処理をしていて、その間に他の処理が入った場合、この場合はメッセージキューを導入して、保留中のイベントを一時的にメッセージキューに格納できるようにし、現在の処理が完了した時点でキューに入れられたタスクをメッセージキューから取り出して実行します。イベントループシステムは、メッセージキューが空になるまでこの処理を繰り返します。V8とブラウザはメインスレッドとメッセージキューを共有しているため、V8が関数を長時間実行することは避けてください。
まとめ
V8がJSを実行する場合、ヒープ空間やスタック空間、グローバル実行コンテキスト、グローバルスコープ、イベントループシステムなど、一部の環境はブラウザやnode.jsなどのホスト環境から提供されます。
ホスト環境の起動時、スタック空間にはネイティブ・データが、ヒープ空間にはオブジェクト・データが格納されます。スタック空間はスタックのオーバーフローを避けるために使用されます。
例えば、ブラウザウィンドウやノードグローバルなどのグローバルオブジェクトはV8起動時に準備され、グローバル実行コンテキストに格納されます。グローバル実行コンテキストは常に存在し、関数の実行コンテキストは関数の実行が終わると破棄されます。そのため、変数やデータをグローバルオブジェクトに置かないようにして、メモリを使いすぎないようにしてください。
ホスト環境はまた、タスクのシーケンスとタスクのスケジューリングを処理するためのイベントループシステムを提供します。
後で書く
Geek Timeの李冰さんによる「図解 goole V8」コースから、V8関連の学習内容をまとめました。