TurboFan JITの掘り下げ
先週私たちは、特定の種類のJavaScriptに対してTurboFanをオンにしたことを発表しました。この投稿ではTurboFanの設計に深く掘り下げたいと思います。
性能は常にV8の戦略の核心にあります。TurboFanは最先端の中間表現と多層の翻訳と最適化パイプラインを組み合わせることで、以前のCrankShaft JITでは不可能だった高品質な機械コードを生成します。TurboFanでの最適化はより多く、より洗練され、より徹底的に適用されます。これにより、流動的なコード移動、制御フローの最適化、精確な数値範囲分析など、以前は達成が困難だったものが可能になります。
層ごとのアーキテクチャ
コンパイラは時間が経つにつれて、言語の機能の増加、新しい最適化の追加、ターゲットとなるコンピュータアーキテクチャの増加に伴い、複雑化する傾向があります。TurboFanでは、数多くのコンパイラから得た教訓を活かし、層ごとのアーキテクチャを開発して、コンパイラがこれらの要求に対応できるようにしました。ソースレベル言語(JavaScript)、VMの能力(V8)、アーキテクチャの複雑さ(x86からARM、MIPSまで)の間で明確な分離を行うことで、コードをよりクリーンかつ堅牢にします。階層化により、コンパイラを開発する人々が最適化や機能を実装するときに局所的に考えることができ、より効果的な単体テストを書くことが可能になります。また、コードの節約にもつながります。TurboFanがサポートする7つのターゲットアーキテクチャのそれぞれは、プラットフォーム特有のコードが3000行未満で済んでおり、これはCrankShaftでは13,000〜16,000行でした。この設計により、ARM、Intel、MIPS、IBMのエンジニアが重症でTurboFanに貢献できるようになりました。TurboFanは柔軟な設計のおかげで、JavaScriptのフロントエンドをアーキテクチャ依存のバックエンドから分離することで、ES6の今後の機能すべてをより簡単にサポートすることができます。
より洗練された最適化
TurboFan JITはCrankShaftよりも積極的な最適化をより高度な手法を通じて実現しています。JavaScriptはほとんど未最適化の形でコンパイラのパイプラインに入り、進行的に低層の形式に翻訳され最適化されて最終的に機械コードが生成されます。設計の中心はコードのより効果的な並べ替えと最適化を可能にする、より緩やかなノードの海内部表現(IR)です。
数値範囲分析により、TurboFanは数値処理コードをより深く理解できるようになります。グラフベースのIRにより、多くの最適化が単純な局所削除として表現可能となり、独立して記述およびテストしやすくなっています。最適化エンジンはこれらのローカルルールを体系的かつ徹底的に適用します。グラフ表現からの移行には、ループからコードを移動して頻度が低い実行パスに配置するための再順序化の自由を活用する革新的なスケジューリングアルゴリズムを使用します。最後に、複雑な命令選択のようなアーキテクチャ固有の最適化は、各ターゲットプラットフォームの特徴を活用して最高品質のコードを生成します。
新しいレベルの性能提供
TurboFanによる素晴らしい速度の向上を既に見ていますが、まだ多くの作業が残っています。さらに多くの最適化が有効になり、より多くのコードタイプに対してTurboFanがオンになるのをお待ちください!