CPython を Yk に適応させる

2026/11/12 21:51

CPython を Yk に適応させる

RSS: https://news.ycombinator.com/rss

要約▶

Japanese Translation:

ykcpython が実証した核心的な進歩は、標準的な「ティア 1」バージョンではなく CPython の「ティア 2」インタプリタに適応することで、完全なコード互換性を維持しつつ、現実世界における顕著なパフォーマンス向上を実現できる点です。このアプローチは理論的上限よりも実践的な速度向上を優先します。AMD EPYC 7773X マシン上で AWFY スイートを実行したベンチマーク(30 プロセス実行からの平均値と 99% 信頼区間)の結果では、ykcpython はほぼすべてのシナリオにおいて標準 CPython および Python の実験的 JIT よりも高性能でありましたが、例外として DeltaBlue ベンチマークにおいては CPython よりも 2.5% スロートです。

このブレイクスルーは、CPython のティア 1 インタプリタにおける Quickening により引き起こされる頻繁な「オPCODE 遷移」に対応することで達成されており、それがトレース無効化を引き起こしていました。ティア 2 インタプリタはこの遷移をより効率的に処理し、オーバーヘッドを大幅に削減します。YkLua を用いた以前の取り組みで他の言語における概念の証明がなされたものの、CPython に適用するには、長い実行トレースの処理などの課題に対処するためには慎重な適応が必要でした。具体的には、オPCODE ロードに

yk_idempotent
を使用し、
_PyObject_GC_Link
に対して
yk_outline
を用い、
YkLocation
ヒントを追加するなどといった最適化が重要であり、例えばこれらが Mandelbrot ベンチマークを 13.70 秒(CPython の 1.17 倍)から 5.09 秒(CPython の 0.43 倍)に削減し、標準 CPython および cpython_jit の両方をはるかに上回りました。

生産環境への導入にはまだ至っておらず、さらなる最適化作業が必要であるものの、このプロジェクトは既存のインタプリタに対する段階的な変更を通じて実質的なパフォーマンス向上を実現できることを示しています。

本文

yk ツールによる CPython JIT コンパイラの実装とベンチマーク結果

1. はじめに

今年初め、私は

yk
というツールの機能についてブログ投稿を行いました。このツールは C 言語のインタプリタに自動的に JIT コンパイラを追加できるものです。 以来、より多くのインタプリタに
yk
を適用し、バグ修正を繰り返しながらパフォーマンスを著しく改善してきました。

  • 10 月下旬: ベンチマークスイートでの測定結果を発表。
    • PUC Lua インタープリタと比較して
      yklua
      が 2 倍高速化されていることが確認されました。

当初は成果に満足しておりましたが、**「この技術が大型のインタプリタでも機能するかどうか、どうやって判断しているのか?」**という問いかけにより、実用性の検証が必要だと気づかされました。

  • PUC Lua は CPython や CRuby に比べ桁違いに小さいため、**「もっと大きいインタプリタでは通用するのか」**という懸念は妥当です。

以前

yk
が機能していなかったため他プロジェクトへ移ろうとしましたが、最近の LLM による実験結果や自身の進捗により、もう一度取り組む価値があると判断し、CPython を対象に検証を行いました。

2. ベンチマーク結果:ykcpython vs cpython/jit4

ykcpython
(コミット 31b4d387)のベンチマーク結果を示します。AWFY スイートで測定され、各数値はプロセス実行を 30 回繰り返した平均および 99% 信頼区間です。

ベンチマークcpythoncpython_jitykcpython
Bounce19.27±0.2010.09±0.0411.09±0.05
CD32.21±0.2326.10±0.0829.33±0.16
DeltaBlue7.43±0.026.21±0.027.62±0.04
Json11.81±0.0810.93±0.059.98±0.03
List15.01±0.228.10±0.0510.44±0.09
Mandelbrot11.66±0.286.94±0.274.20±0.07
NBody18.97±0.1312.77±0.1210.98±0.02
Permute22.97±0.3417.95±0.1321.04±0.05
Queens13.18±0.149.65±0.118.32±0.03
Richards54.80±0.2040.56±0.4033.18±0.17
Sieve23.34±0.0617.02±0.0713.74±0.06
Storage22.03±0.1919.94±0.0819.67±0.04
Towers20.46±0.2512.65±0.0513.67±0.04

結果の要約

  • cpython: 通常の CPython 3.15.1 版。
  • cpython_jit: 実験的な JIT(JIT4)を有効化した CPython 3.15.1 版。
  • ykcpython:
    yk
    を適用した CPython 3.15.1 版。
    • DeltaBlue を除く全てのベンチマークで通常の CPython より高速です(平均約 2.5% 遅い程度)。
    • 13 つのベンチマーク中 8 つで、実験的な JIT を有効化した CPython よりも高速です。

注意: この数値は「実用上利用可能」や「全てのパフォーマンス向上を保証」という主張ではありません。ベンチマークでの高速化は通過すべき「ハードル」であり、「ゴールそのもの」ではありません。

3. yk とインタプリタの適応化について

yk の仕組み

  • 入力: 軽量に修正された C インタープリタ。
  • 出力: メータースレーシング JIT コンパイラを搭載した VM。
  • 目的: 完全な言語実装からの書き換えではなく、既存のインタプリタをわずかに高速化しつつ互換性を維持すること(フォーク)。
  • 手法:
    • インタープリタ内の「ホットループ」を特定し C コードを実行記録。
    • トレースを最適化してマシンコードに変換。
    • YkLocation
      を介してインタープリタ側が潜在的なループ位置を告知(オプションだが推奨)。

適応化の課題とアプローチ

  • 課題: インタープリタ自体を熟知していない場合、一度に全てを行うのは困難。
  • 戦略: シンプルな変更から始め、最小限の変更で JIT の起動を達成する。
    • ビルドシステムの理解。
    • 適切な
      YkLocation
      の配置。
    • テストスイートの動作保証(保守性を高める)。

単純なインタプリタなら 10 LoC 未満で JIT が稼働しますが、CPython 等大型化インプタータではさらに作業が必要です。

4. CPython への適応プロセス

ステップ 1: チェックポイントの選定

  • 初期調査では「ティア 1(Tier 1)インタープリタ」(標準的な実行器)を採用しましたが、いくつかの問題が浮上しました。
    • 欠けていた機能(原子操作、sub のビット幅など)。
    • 互換性問題。
    • バグ(スタックマップ修正など)。
  • これらの汎用的な修正は約半週間かかりました。

ステップ 2: 「クイッキニング」との相性問題

  • CPython は「ジェネリック」オペコードを「専用」オペコードに書き換える**クイッキニング(specialisation)**機能を持っていました。
  • 問題:
    yk
    の単純な実装では、クイッキニングによる状態遷移がトレースを破棄し、コスト以上のパフォーマンス向上を生んでいませんでした。

ステップ 3: チア 2 (Tier 2) インタープリタへの移行

  • CPython は実験的な JIT(JIT4)のために「ティア 2」インタープリタを用意しています。
  • 移行決定: ティア 1 よりもティア 2 インタープリタが yk との相性が良かったため。
    • ティア 1 を取り払い、ティア 2 に
      yk
      サポートを追加。
    • 実装コストはわずか 80 LoC で済みました。

初期バージョンの結果と最適化ヒント

初期の

ykcpython
は CPython より遅い状態でしたが、以下の最適化ヒントを適用しました。

冪等関数(Idempotent Functions)の利用

インタプリタディスパッチにおける「メモリからオペコードの種類を読み取る」処理は不変であるため、これを冪等関数として

yk
に認識させます。これにより関数呼び出しを削除し定数結果に置換できます。

// 冪等関数の定義
__attribute__((yk_idempotent))
uint16_t idempotent_load_opcode(uint64_t code_id, const _PyUOpInstruction *pc) {
    __asm__ volatile("" : "+r"(code_id));
    return pc->opcode;
}

// インタプリタループ内の使用例
yk_promote(next_uop);
yk_promote_code_id(yk_code_id);
uopcode = idempotent_load_opcode(yk_code_id, next_uop);

この変更により、マンドルブロートベンチマークで 2.7 倍の高速化(約 30 LoC の変更)が達成されました。

5. 詳細な最適化テクニック

(1) トレース開始地点の追加

CPython のすべての実行器に

_JUMP_TO_TOP
オペコードを持たないため、初期段階からトレースされていませんでした。実行器の先頭に
YkLocation
を追加することで、即座にトレースを開始させました。

(2) アンロール(Unrolling)

yk
はデフォルトでループを含む関数をアウトライン化(トレースから除外)しますが、引数数が一定の関数など特定ケースではインライン化を希望します。

  • 手法:
    yk_unroll
    属性を追加し、意図的に展開させる。
  • 対象例:
    _PyFrame_Initialize
    ,
    _PyFrame_ClearLocals
    等。

(3) 間接インライン化(Indirect Inlining)

間接呼び出し(ポインタ経由の関数呼び出し)はデフォルトでトレースできませんが、定数のポインタであれば可能にできます。

  • 基本パターン:

    function_type f = ...;
    if (!yk_is_interpreting()) { // 解釈中は true (削除される)
      yk_promote(f);
    }
    (f)(...);
    
  • 間接呼び出しの対応:

    yk_indirect_inline
    を使用し、静的にトレース可能な経路を指示します。

    • 例: リスト/文字列の長さを取得する
      _sq_length
      のようなコード。

(4) アウトライン除外(yk_outline)

ガーベッジコレクション等の動的なチェックを含む関数(例:

_PyObject_GC_Link
)は、トレースを失敗させる可能性があります。これらを
yk_outline
でマークすることで、呼び出し自体をトレース対象から外しました。

6. 結論と考察

達成されたこと

  • CPython への適用成功: 約 450 LoC の追加コードで機能し、ベンチマークスイートにおいて CPython や実験的 JIT と遜色ない結果を出しました。
  • パフォーマンス向上:
    • json
      ベンチマークでは、11.52s から 10.85s に改善。
    • 特定の最適化(間接インライン化など)によりさらに高速化を達成。

今後の課題と限界

  • 過学習の回避: 一部のベンチマーク(例:
    deltablue
    )では特定の条件で性能が低下するため、注意が必要です。
  • 万能ではない: 幅広いプログラムのパフォーマンス向上を保証するものではありません。
  • ボトルネックの存在: HIR パターンの最適化や JIT コンパイラ自体の改善余地は残っています。

yk の強み

  • 汎用性:
    ykcpython
    で発見された欠陥やバグは、他のインタプリタの適応にも役立ちます。
  • ゼロからの再開発ではない: 既存の高性能な JIT ツールキットを再利用できるため、短時間で大きな成果を出せます。

謝辞 本研究には Edd Barrett、Lukas Diekmann の貢献、Shopify と英国王立工学アカデミーの資金提供、Chris Seaton のサポートに感謝します。

同じ日のほかのニュース

一覧に戻る →

2026/11/13 3:39

Rust 1.100

## Japanese Translation: はい、元のサマリーは具体的な技術的な安定化の範囲を捉えたり、アロケータの機能に関する曖昧さを解消したりするために改善が必要です。 **改訂されたサマリー:** Rust チームは公式にバージョン 1.100.0 をリリースしました。これは長待たされてきた機能である「never type」(`!`)を安定化させ、より効率的でカスタマイズ可能なメモリ管理システムを構築するための強力な新 API を導入するマイルストーンです。このリリースには、トランザクションのような安全性を提供する `DropGuard` API、ゼロサイズタイプを作成するための `conjure_zst`、および `Vec` および `Box` 用のアロケータに特化したコンストラクタなど、主要な機能が追加されています。 アップグレードするには、ユーザーは `rustup update stable`を実行するか、`rustup` が不足している場合は Rust ウェブサイトからツールを直接ダウンロードしてください。ほとんどの変更は安全ですが、2024 年版より前のエディションのユーザーにとっては重要な不互換の変更があります:never type の内部フォールバックが `()` から `!` にシフトしました。開発者はコードを調整し、互換性を維持するために新しい `Infallible`アリアスを使用する必要があります。また、このアップデートは Cargo において重大な安全性の向上をもたらしており、未使用の依存関係に対するデフォルト警告や、サプライチェーンリスクを軽減するための最小公開年齢の設定などが含まれます。チームは、早期の問題発見に貢献し、よりスムーズなエコシステムの発展を実現するため、ユーザーがベータまたはナイトリーチャンネルで今後のリリースを試すことを推奨しています。

2026/11/13 3:52

ジェミニ4水和素およびオーケストレーター

## Japanese Translation: 本日、Google は独立した AI モデル「Gemini 4 Hydrogen」を発表し、人工知能分析指数(Artificial Analysis Intelligence Index)でスコア 51 を記録して Argon の 50 を上回るとともに、Terminal-Bench 4.1 で 57% のスコアを取得し、前 versions の 3.8 Flash バージョンの性能を 3 倍以上向上させました。このリリースでは、「Orchestrator」という動的システムが新たに導入されました。これは現在、Google AI Ultra サブスクリプションユーザーに利用可能であり、Hydrogen と Carbon 計画モデルを組み合わせることで複雑なワークフローを最適化します。静的ルーティングシステムとは異なり、Orchestrator は双方向のアプローチを採用しており、Carbon が読み取り専用フェーズと計画を担当し、Hydrogen が書き込み、編集、テストを担当します。Hydrogen が困難に遭遇した場合は、自動的に Carbon に戻って計画の修復を受け、その後再開を行います。この動的な協調により、Carbon のタスク成功率达到にほぼ匹敵しつつ、コンピューティングクォータは 24% 削減し、タスク完了を 19% 高速化を実現しています。開発者は Antigravity SDK を直接使用して多モデルパイプラインに対するプログラム制御を行うことができ、Hydrogen は推論深度の 4 レベル(low、medium、high、xhigh)を提供します。今後の更新では、オープンソースデモへのアクセスが拡大され、例えばエージェントが高速な反復と高レベルのセキュリティチェックの間で任務を分担する問題の分類など、新たなユースケースが追加される予定です。最終的に、このイノベーションは要求の高いソフトウェア開発タスクに対して効率的なリソース配分を提供し、速度や品質を損なうことなく高度な低遅延推論機能を備えています。

2026/11/13 6:13

Foundation Models フレームワーク (macOS)

## Japanese Translation: Apple の Foundation Models フレームワークは、大規模言語モデルをシームレスに統合するネイティブ Swift API を提供することで、アプリ開発を革新します。その最も重要な特徴は、オンデバイスまたはクラウドにあるどの AI モデルプロバイダーにも、複雑な設定なしでアクセスできるようにする統一プロトコルです。ガイド付き生成、ツール呼び出し、画像理解(マルチモーダルプロンプト、Vision フレームワークによる OCR、バーコードスキャンを含む)、ダイナミックプロファイルといった組み込みツールがワークフローを簡素化し、Evaluations フレームワークはプロンプトのテストおよび動的条件下での機能検証を可能にします。プライバシー重視の Private Cloud Compute は、ユーザーデータが安全な環境外に出るか Apple によって保存されることはありません。特に、App Store Small Business プログラムに登録しており、初回ダウンロード数が 200 万未満の開発者は、これらのリソースを無料でお使いいただけます。さらに、新しい Python SDK がエコシステムのリーチを広げ、人気ツールとの統合を容易にし、カスタムスキルやコンテキスト管理ヘルパーなどの実験的機能を備えたオープンソースユーティリティパッケージが提供されています。今後、macOS 27 ではフルアプリケーションを書かずに高速なスクリプト作成と自動化を実現する `fm` CLI ツールを導入します。多様なモデル機能—from オンデバイス機能から Claude サーバーサイドの巨人まで—を一元化することで、このフレームワークは開発を簡素化しユーザーデータを保護し、あらゆるデバイスにわたる AI 統合のための堅牢な未来を確立します。

CPython を Yk に適応させる | そっか~ニュース