Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Pythonのcopy-and-patch JITの実装を読む
Search
Arata
October 03, 2025
0
48
Pythonのcopy-and-patch JITの実装を読む
Arata
October 03, 2025
Tweet
Share
More Decks by Arata
See All by Arata
eBPFを使った動的解析手法
arata_nvm
0
570
カーネルハック実験の振り返り
arata_nvm
0
25
Improving LLVM Backend Development with a New TableGen Language Server
arata_nvm
0
13
コードエディターのシンタックスハイライトの話
arata_nvm
0
170
LLVMのコード自動生成機構におけるコード記述を支援するツールの作成
arata_nvm
0
73
TableGenの言語サーバーをつくる
arata_nvm
0
580
pwn入門 / introduction to pwn
arata_nvm
1
2.5k
TableGenと和解せよ / make peace with TableGen
arata_nvm
0
150
Nixで最強の開発環境を作る
arata_nvm
0
11
Featured
See All Featured
How to Ace a Technical Interview
jacobian
280
24k
Build The Right Thing And Hit Your Dates
maggiecrowley
38
3k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
1k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
The Pragmatic Product Professional
lauravandoore
37
7.1k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.1k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
140
34k
Music & Morning Musume
bryan
46
7k
Building Adaptive Systems
keathley
44
2.9k
Git: the NoSQL Database
bkeepers
PRO
432
66k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.5k
Transcript
copy-and-patch JITを書く Pythonのcopy-and-patch JITの 実装を読む 2025/10/03 コンパイラのコンパの部分 #01 @Arata
2025/10/02 コンパイラのコンパの部分 #01 @Arata 背景: Python 3.13での試験的なJITの導入 2
2025/10/02 コンパイラのコンパの部分 #01 @Arata Python 3.11: PEP659 - Specializing Adaptive
Interpreter • 汎用的な命令から特定の型に特化した命令へ実行時に書き換える ◦ e.g. x + 1: BINARY_OP(ADD) -> BINARY_OP_ADD_INT • データの型、よく実行される経路などのプロファイルも取る Python 3.12: DSLからのインタプリタ生成 • バイトコードのセマンティクスがより明確に Python 3.13ではこれらのプロファイラやDSLがJIT実装の基礎となった 背景: Faster CPythonの道のり 3
2025/10/02 コンパイラのコンパの部分 #01 @Arata copy-and-patchと呼ばれる仕組みを用いてJITを実装している Pythonビルド時: インタプリタのコードから各命令のステンシルを作成 1. インタプリタのコードから各命令の実行処理を抽出 2.
各命令の実行処理をそれぞれコンパイル 3. コンパイル結果からステンシル作成 Pythonコード実行時: ステンシルを使ってJITコンパイル 1. 各命令に対応するステンシルをコピー 2. ステンシル中の一部にパッチを当てる PythonのJIT実装 4
2025/10/02 コンパイラのコンパの部分 #01 @Arata Python/bytecodes.c (DSL)からPython/executor_cases.c.h (C)を生成 巨大なswitch-caseになる Pythonビルド時: インタープリタのコード生成
5 Python/bytecodes.c Python/executor_cases.c.h
2025/10/02 コンパイラのコンパの部分 #01 @Arata Python/executor_cases.c.hから正規表現で各命令の実装コードを抽出 Pythonビルド時: インタプリタからコード抽出 6 Tools/jit/_targets.py Python/execuor_cases.c.h
抽出対象
2025/10/02 コンパイラのコンパの部分 #01 @Arata Pythonビルド時: ステンシル作成 7 抽出した各命令の実装コードをテンプレートに挿入・コンパイル 実行時に決まる値はテンプレートで外部シンボルとして定義 コード挿入場所→
Tools/jit/template.c
2025/10/02 コンパイラのコンパの部分 #01 @Arata Pythonビルド時: ステンシルの最適化 8 ステンシルをアセンブリレベルで最適化 • 条件分岐命令でホットパスをフォールスルー側に配置
• 冗長な条件分岐命令の削除 Tools/jit/_optimizers.py
2025/10/02 コンパイラのコンパの部分 #01 @Arata Pythonビルド時: ステンシルのホール作成 9 実行時に決まる値=外部シンボルの参照には再配置エントリがあるはず それらの参照位置と参照シンボルを記録 Tools/jit/_stencils.py
2025/10/02 コンパイラのコンパの部分 #01 @Arata Pythonビルド時: ヘッダーファイルの作成 10 ここまででステンシルの情報が集まったので、JITコンパイルに使う 関数たちを生成
2025/10/02 コンパイラのコンパの部分 #01 @Arata Pythonビルド時: ヘッダーファイルの作成 11 ここまででステンシルの情報が集まったので、JITコンパイルに使う 関数たちを生成 ここではUNARY_NOTの例を紹介
ステンシルのアセンブリ UNARY_NOTの例 ステンシルのバイト列 code + data ステンシルのコピー&パッチ False,Trueへの参照を解決
2025/10/02 コンパイラのコンパの部分 #01 @Arata 結局何ができたのか? • 「あるバイトコード命令を実行する機械語」を生成する関数が全ての 命令について手に入った • これを命令ごとに呼び出せばバイトコードを機械語に変換できる
→ JITコンパイル達成 copy-and-patchの名前の由来は? • JITコンパイル時にステンシルをコピー&パッチするため • パッチは実行時に決まるオペランド、外部シンボルの参照等で必要 まとめ 12
2025/10/02 コンパイラのコンパの部分 #01 @Arata 余談: PyTorchのJITコンパイラ(TorchDynamo)も面白い 概要 • PEP 523で評価器を差し替えて、実行されたテンソル演算をトレース
• トレースから計算グラフを構築してコンパイル • 特殊化のため、コンパイルされたコードから参照する変数の値が変化 していないことを実行時に検証する仕組みがある 終わりに 13
2025/10/02 コンパイラのコンパの部分 #01 @Arata • https://peps.python.org/pep-0659/ • https://peps.python.org/pep-0744/ • https://github.com/python/cpython/tree/main/Tools/jit
• https://www.youtube.com/watch?v=HxSHIpEQRjs • https://docs.pytorch.org/docs/stable/torch.compiler_dynamo_ov erview.html 参考文献 14