次期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
MuleSoftはデータとAIの“神経系”–セールスフォースが最新動向解説
IT関連
2024-08-06 01:58
イオンペット、クラウド型マニュアル作成・共有システムを導入
IT関連
2022-10-20 14:49
【3月15日】掲載記事アクセスランキング・トップ5―1位はロシアがアップルとグーグルを脅迫との報道
IT関連
2022-03-16 22:59
2030年以降も生き残る組織とは? 誰もがテクノロジーでワクワクできる仕組みを
IT関連
2023-05-23 10:42
Google、パスワードレスを実現する「Passkey」の開発者向けサポート開始。Androidデバイス間の同期、Androidを使ってWin/MacでのWebサイトへのログインなど実現
Android
2022-10-17 18:32
リコー、屋内でも発電できる“曲がる太陽電池” 「充電のない世界へ」
ライフ
2021-08-21 07:02
DXの浸透と定着化–全社的かつ継続的な取り組みとするために
IT関連
2023-02-16 02:24
HPEとGMのCEOが対談–DX、リーダーの役割、仕事への姿勢で何を語ったか
IT関連
2021-07-01 08:55
Twitterに「自動ブロック」搭載へ クリエイター月額支援などマネタイズ機能も
企業・業界動向
2021-02-27 10:47
高配当利回り株で資産形成:次の景気後退はいつか?どう乗り切るか?(その1)
IT関連
2021-06-30 00:35
Next.jsの開発元Vercel、Edge FunctionsでWebAssemblyのサポートを発表
JavaScript
2022-08-30 05:43
AWS、「HashiCorp Terraform Cloud」をService Catalogでサポート
IT関連
2023-08-16 12:03
ビジネスメール詐欺が増加、人的セキュリティ対策が重要に–ベライゾン報告書
IT関連
2023-07-14 21:29
透明性を高めたサービスで安全なデジタル社会に貢献–カスペルスキー・藤岡社長
IT関連
2022-01-19 19:09