次期Python、ついにJITコンパイラ搭載の見通し。「copy-and-patch」と呼ばれる新たなJITコンパイラの仕組みとは?

今回は「次期Python、ついにJITコンパイラ搭載の見通し。「copy-and-patch」と呼ばれる新たなJITコンパイラの仕組みとは?」についてご紹介します。

関連ワード (内部、処理、部分等) についても参考にしながら、ぜひ本記事について議論していってくださいね。

本記事は、Publickey様で掲載されている内容を参考にしておりますので、より詳しく内容を知りたい方は、ページ下の元記事リンクより参照ください。


機械学習やAI処理の分野を中心に非常に高い人気のプログラミング言語である「Python」の次期バージョンに、処理速度の向上を目指したJITコンパイラが搭載される見通しです。

このJITコンパイラは、PythonコアデベロッパーのBrandt Bucher氏が提案し、実装しています。

そしてPython Software FoundationのフェローであるAnthony Shaw氏がブログ「ython 3.13 gets a JIT」で、このJITコンパイラについて解説しています。

fig

これらの情報を元に、PythonのJITコンパイラがどのように実装されようとしているのか、少し紹介していきましょう。

RubyもJavaScriptもJITが高速化を実現してきた

Pythonは前述の通り非常に人気の高いプログラミング言語でありながら、その公式実装であるC言語で記述されたCPythonはインタプリタであるため、実行速度の面で課題を抱えていました。

JavaScriptやRubyなど人気の高いプログラミング言語の多くは、処理速度を高速化するためにすでにJITコンパイラを搭載し、さらなる実行速度の向上のために最適化を進めているところです。

例えばPythonと同様にインタプリタとして登場したRubyは、実行速度を3倍に向上させるという目標の下、2016年にリリースされたRuby 2.6で初めてJITコンパイラ(MJIT)を実験的に搭載しました。

2022年にリリースされたRuby 3.1では、それまでのJITコンパイラとは別に新たに開発されたJITコンパイラ(YJIT)をメインラインにマージし、現時点で最新版のRuby 3.3ではこのYJITがさらに改良され、実行速度の向上を実現しています。

JavaScriptもWebブラウザ上で実行可能なインタプリタ型の言語として登場していますが、現在の主要なWebブラウザやJavaScriptランタイムにはJITコンパイラが搭載されています。現在のJavaScriptの実行速度の向上は、おおむねJITコンパイラの改善によって行われていると言ってよいでしょう。

PythonもそうしたJITコンパイラ搭載言語の仲間入りを果たすことになるわけで、今後はJITコンパイラによって実行速度の改善が進められるのではないかと見られます。

今回、PythonのJITコンパイラ搭載について解説記事をブログに書いたAnthony Shaw氏も次のようにJITコンパイラへの期待を示しています。

I think that whilst the first version of this JIT isn’t going to seriously dent any benchmarks (yet), it opens the door to some huge optimizations and not just ones that benefit the toy benchmark programs in the standard benchmark suite.

JITの最初のバージョンは、(まだ)ベンチマークの結果に対して大きな影響を与えることはないだろうが、今後は標準のベンチマーク群に含まれる簡単なベンチマークで良好な結果を得るにとどまらず、大きな最適化への扉を開くものになると思う。

一般的なフル機能のJITコンパイラの仕組みとは

Anthony Shaw氏の解説によると、次期Pythonに搭載予定のJITコンパイラは、一般的なフル機能のJITコンパイラとは多少異なった仕組みのものになるとのことです。

一般的なフル機能のJITコンパイラは、インタプリタでコードを実行しつつ、バックグラウンド処理でネイティブなバイナリコードを生成し、実行をインタプリタから生成済みのバイナリコードへ切り替えていくことで高速なコードの実行を実現するという仕組みです。

おおむねネイティブコードへに実行が切り替われば高速な実行が期待できますが、十分に高速な実行速度が得られるまでネイティブコードが生成されるには時間がかかること、そしてインタプリタとコンパイラを同時に走らせることになるため、実行時には多くのメモリを消費すること、という課題もあります。

これに対し、次期Pythonに搭載予定のJITコンパイラは「copy-and-patch」(コピー&パッチ)と呼ばれる仕組みで実現されると説明されています。

新しく採用されるコピー&パッチ方式のJITとは?

コピー&パッチ方式は、2021年に提案された新しい方式のJITコンパイラです。ここではその仕組みを、Anthony Shaw氏の説明を元に手短に紹介してみましょう。

Pythonのランタイム(CPython)の内部は、Pythonのコードを読み込んで中間言語に変換する部分と、その中間言語を実行する部分の2つに大別できます。

中間言語を実行する部分には多数のif文/Case文が並んでおり、中間言語がそのif文/Case文に合致したところに、その中間言語で実際に処理すべき命令が書かれています。そしてそれが実行されることになります。

Pythonランタイムは、インタプリタとしてこの処理をPythonコードの1行目から最後の行まで延々と繰り返すわけです。

コピー&パッチ方式のJITは、このPythonランタイムの中間言語の実行部分に手を入れることで実現されます。

後半の中間言語を実行する部分を、中間言語を実行するのではなく、実行するための命令をどんどんつなぎ合わせていく、という仕組みにするのです。

A copy-and-patch JIT is the idea that you copy the instructions for each command and fill-in-the-blanks for that bytecode arguments (or patch).

コピー&パッチ方式のJITの考え方は、コード内のそれぞれのコマンド(Command)に対応する処理命令(Instructions)をコピーし、バイトコードの列(すなわちパッチ)としてどんどんつなげていく、というものです。

そして実際の処理すべき命令がある程度つながった後にJITコンパイラに渡すと、if文/Case文によるオーバーヘッドなく、まとまった処理として高速に実行可能となります。

Copy-and-patch was selected because the compilation from bytecodes to machine code is done as a set of “templates” that are then stitched together and patched at runtime with the correct values. > コピー&パッチが選択された理由は、バイトコードからマシンコードへのコンパイルが「テンプレート」のセットとして行われ、それがつなぎ合わされ、実行時には適切な値のパッチとなるからです。

これによる利点は、インタプリタの中に並列処理としてJITコンパイラを組み込むのではなく、インタプリタから別コンポーネントへ処理命令をどんどん渡していくだけ、という比較的簡単な実装で済む点です。

そして肝心のJITコンパイラ部分は、既存のLLVM JITツールなどと組み合わせることで実現できるようです。

A copy-and-patch JIT only requires the LLVM JIT tools be installed on the machine where CPython is compiled from source, and for most people that means the machines of the CI that builds and packages CPython for python.org.

コピーアンドパッチJITに必要なのは、CPythonをソースからコンパイルするマシンにLLVM JITツールをインストールしておくだけです。これは多くの人にとって、python.orgからCPythonをビルドするCIマシンにこの環境が必要となることを意味します。

現時点でのJITコンパイラによる性能向上は2%から9%

JITコンパイラの実装を進めているBrandt Bucher氏によると、現時点でのJITコンパイラによる性能向上は2%から9%としています。

しかし、前述の通りこれは今後の最適化への第一歩であり、今後さらなる改善による性能向上を期待したいところです。

COMMENTS


Recommended

TITLE
CATEGORY
DATE
[速報]Windows 11でAndroidアプリが実行可能に、マイクロソフトが発表
Android
2021-06-25 17:49
エーピーコミュニケーションズ、開発者のノンコア業務効率化を支援する新サービス
IT関連
2024-03-08 01:50
「Docker Desktop」のLinux版が登場
IT関連
2022-05-15 18:47
デジサート、証明書ライフサイクル管理をAWSやマイクロソフトの認証局などに拡張
IT関連
2023-09-01 20:13
分散型プロトコルMatrixを採用したメッセージングアプリElementが33億円を調達
ソフトウェア
2021-07-29 16:39
「大江戸温泉物語」9月閉館 借地契約の期限で
くらテク
2021-06-24 16:08
自らを「爆弾探知犬」と呼ぶ、暗号資産取引プラットフォーム間不正操作検出ソフトのSolidus Labs
ブロックチェーン
2021-07-29 15:47
バイデン政権、半導体不足への対策検討へ
IT関連
2021-02-15 17:52
Okta、開発者向けの新たな無料プラン–最大1.5万人の月間ユーザーに対応
IT関連
2021-04-07 06:24
「えきねっと」がUI刷新 JR東「この20年で最も大規模なリニューアルに挑戦」
企業・業界動向
2021-04-14 11:05
AIがヒット曲を量産? 人気曲の特徴を学習、メロディやコード進行を自動生成するアプリ登場
ネットトピック
2021-02-23 07:00
クアルコムが示した自社製品への自信–「Copilot+ PC」は始まりに過ぎない
IT関連
2024-07-02 07:25
AWS、ロシアで新規契約の受け付けを停止–マイクロソフトも新規販売を一時停止
IT関連
2022-03-10 10:57
サステナビリティー経営成功のカギはデータの利用/活用–富士通が調査
IT関連
2024-04-26 21:38