[0]ここは定数値プールの中身。今回は変数名のaがプールされている。a>さてこれらの情報を踏まえて、先程のソースコードとバイトコードを見ていこう。以下の部分はすっとばしてよい。ここはインタープリタの準備なので。StackCheck本番はここから解説はコード中に書いていく。定数プールのインデックス1(変数名a)から値をaccumulatorにロードする。accumulator(変数名a)からr1レジスタに値をロードする。accumulatorに0をロードする。accumulator(0)からr2レジスタに値をロードする。accumulatorに即値1をロードする。accumulator(1)からr3レジスタに値をロードする。1)を使ってInitializeVarGlobalランタイムを呼び出す。Returnこれがバイトコードの実行である。ちなみにCallRuntimeの場合、各Runtime毎に呼び出し規約が決まっているので、それぞれに合わせたレジスタの割り当てが必要になる。InitializeVarGlobalランタイム呼び出しは以下のレジスタを期待している。束縛される値そのため、上記のコードはaccumulatorに値をロードレジスタに値をロードを繰り返して、Runtime呼び出しのコードを生成している。とこの調子でIgnitionはバイトコードを実行していくが、そのバイトコードを実行しているのはBytecodeHandlerとよばれるクラスである。バイトコード実行BytecodeHandlerバイトコードの実行はBytecodeHandlerによって行われる。このBytecodeHandlerはV8の初期化時に生成され、配置される。以下がBytecodeHandlerの例である。Dispatch();}LadZeroの処理を行うBytecoeHandlerで、中では単純にaccumulatorに0をセットするだけ。このような調子で各バイトコードにつき一つのBytecodeHandlerが実装されている。各BytecodeHandlerは直接次のBytecodeHandlerを呼び出す。このDispatchが次のBytecodeHandlerを呼び出している。実行予定Nodeを組み立てているだけで、実際には何かを実行するわけではない。Ignitionインタープリタは最初にBytecodeの処理手順をグラフノードで生成し、生成したグラフからマシンコードを生成する。これをBytecodeのdispatch-tableに設定することで、各バイトコード毎に行う処理が設定されたBytecodeHandlerが実装される。以下の図はBytecodeHandlerの生成InterpreterEntryTrampolineIgnitionは最終的にBytecodeArrayを生成し終わった後に、InterpreterEntryTrampolineというbuiltinsからIgnitionのDispatchTableを発火するコード生成し、BytecodeArrayからバイトコードを取り出し、対応するDispatchTableの処理を実行して回っていく。以下の図はIgnitionが実行される様子まとめ一通りIgnitionの実行パスを眺めた。実際にはベースラインで生成されたコードが実行されている事を確認した。TurboFan経由の最適化部分等については今後の記事を書く予定。Engineについて最近、JSエンジンが何故かいくつか出て来たのでいっちょ見て見...2018-03-16JSのproposal-numeric-separatorを実装したよタイトルの通りなんだけど、書くのが遅れてしまった。2はてなブログをはじめよう!brn_takeさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。