Upgrade to Pro — share decks privately, control downloads, hide ads and more …

V8のTorqueを語りたい

 V8のTorqueを語りたい

このスライドはSlidevで作られており、以下のレポジトリで公開しています
https://github.com/riya-amemiya/amemiya_riya_slide_data/tree/main/v8_torque

Avatar for Riya Amemiya

Riya Amemiya

July 21, 2026

More Decks by Riya Amemiya

Other Decks in Technology

Transcript

  1. 自己紹介 西 悠太 (Nishi Yuta) V8 Contributor Platform Engineer at

    Dinii Inc. TSKaigi Staff が好きです。 の中身をのぞくのも好きです。 TypeScript V8 実は21歳) (
  2. これがTorqueです // src/builtins/array-foreach.tq より抜粋 transitioning javascript builtin ArrayForEach( js-implicit context:

    NativeContext, receiver: JSAny)( ...arguments): JSAny { const o: JSReceiver = ToObject_Inline(context, receiver); const len: Number = GetLengthProperty(o); const callbackfn = Cast<Callable>(arguments[0]) otherwise TypeError; // ... }
  3. は速い。けれど… CSA の強み → 関数呼び出しの余計なコストを避けられる → 機械語レベルで攻めた最適化ができる → 1つの記述で全アーキ向けに生成できる CSA

    の弱み → 型の保証が弱い → 制御フローが手続き的で読みにくい → 正しく書くのに深い専門知識が要る CSA
  4. 一番の問題は、型の保証が弱いこと TNode<Object> elem = LoadFixedArrayElement(elements, index); TNode<JSArray> arr = UncheckedCast<JSArray>(elem);

    にも TNode<T> という型はあります。 ただ無検査のキャストが通るため、 elem が本当に JSArray かまでは保証されません。 CSA
  5. Torque = 静的型付きのDSL CSA Torque × ◦ V8 型の保証が弱い ×

    無検査キャストで取り違えが起きうる × 専門知識が前提 の値に静的な型が付く ◦ 取り違えをコンパイル時に検出しやすい ◦ 仕様に近い書き方ができる
  6. 仕様の手順と対応づけて書ける ECMAScript 仕様 (forEach) 1. Let O be ? ToObject(this

    value). 2. Let len be ? LengthOfArrayLike(O). 3. If IsCallable(callbackfn) is false, throw a TypeError exception. Torque const o: JSReceiver = ToObject_Inline(context, receiver); const len: Number = GetLengthProperty(o); const callbackfn = Cast<Callable>(arguments[0]) otherwise TypeError;
  7. 失敗経路を、コンパイル時に強制 const arr = Cast<JSArray>(obj) otherwise Bailout; const n: Number

    = x; typeswitch (n) { case (s: Smi): { ... } case (h: HeapNumber): { ... } } は実行時に型を検査し、失敗経路を書かないとコンパイルが通りません。 typeswitch は共用型を型ごとに分け、網羅性まで検査されます。 Cast
  8. CSA の操作を、extern macro で呼ぶ // src/builtins/js-array.tq extern macro MoveElements( FixedArray|FixedDoubleArray,

    Smi, Smi, Smi): void; は、CSA 側の実装を Torque から呼ぶ宣言です。 MoveElements の実体は CodeStubAssembler にあります。 同じ処理を CSA で手書きし直す必要がありません。 Runtime を経由せず、生成コード側で完結させられます。 extern macro
  9. 最適化後も、Torque builtin が使われる では、Maglev や TurboFan が生成するコードからも で書いた builtin を呼ぶことがあります。

    一方で、TurboFan が forEach をインライン展開するように、 最適化側が別経路を持つ場合もあります。 それでも、Torque で書いた builtin は インタプリタ実行や、インライン化されない呼び出しの土台になります。 V8 Torque
  10. が同時に狙ったもの Torque 読みやすさ 仕様の手順と対応づけて書ける 安全性 型の取り違えをコンパイル時に検出 しやすい 速度 CSA の性能を

    Torque から使える この3つを同時に満たすために、Googleは専用言語という重い選択をしました。
  11. 今日覚えて帰ってほしいこと の builtins の多くは Torque という専用言語で書かれている → CSA の手書きは速いが、型の保証が弱かった →

    Torque は静的型付きで、取り違えをコンパイル時に検出しやすい → CSA を使う C++ にコンパイルされるため、速さを犠牲にしない → extern macro で CSA の操作を呼べる → 最適化後も Torque builtin が使われることが多い(インライン化など例外あり) → V8
  12. 参考資料 V8 Docs: Torque user manual V8 Docs: Torque builtins

    V8 Blog: Taming architecture complexity in V8 — the CodeStubAssembler