JSConf JP

Node.jsで覗くV8バイトコード:3つのJavaScript実験

SessionTrack BJapanese

「JavaScriptを実行する」とき、私たちが書いたソースコードはV8の中でどのような姿になっているのでしょうか。

本セッションでは、まずパース、AST、バイトコード生成から、Ignition、Sparkplug、Maglev、TurboFan/Turboshaftへ至るV8の実行パイプラインを短く整理します。その後、Node.jsの診断オプションを使い、足し算、条件分岐、プロパティアクセスという3つの小さな関数から、実際のIgnitionバイトコードを観察します。

ソースコードを一か所ずつ変更しながら、アキュムレータ、比較とジャンプ、プロパティアクセス命令、フィードバックの記録場所が出力にどう現れるかを読み解きます。さらに、一つの関数についてJavaScript、バイトコード、最適化された機械語を並べ、MaglevやTurboFanが実行時の情報を利用して演算を特殊化すること、仮定をガードし、成立しなければdeoptする仕組みを概観します。

コンパイラやアセンブリの事前知識は必要ありません。V8の用語を暗記するのではなく、「小さな関数を作る、出力を絞る、一か所だけ変える、差分を比較する」という、JavaScriptエンジンを自分で調査するための実践的な方法を持ち帰っていただきます。