Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
PHP8.4におけるJITフレームワークIRと中間表現について理解を深める
Search
02
March 23, 2025
1.3k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PHP8.4におけるJITフレームワークIRと中間表現について理解を深める
02
March 23, 2025
More Decks by 02
See All by 02
なぜarray_firstとarray_lastは採用、 array_value_firstとarray_value_lastは 見送りだったか / Why array_value_first and array_value_last was declined, then why array_first and array_last was accpeted?
cocoeyes02
0
490
Amazon ECS Managed Instances が リリースされた!キャッチアップしよう!! / Let's catch up Amazon ECS Managed Instances
cocoeyes02
0
530
新しいPHP拡張モジュールインストール方法「PHP Installer for Extensions (PIE)」を使ってみよう!
cocoeyes02
0
1.9k
RemoveだらけのPHPUnit 12に備えよう
cocoeyes02
0
1.3k
PHP RFC: Deprecate implicitly nullable parameter types をサクッと話す
cocoeyes02
0
1.1k
PHPUnit 11 概論
cocoeyes02
5
3.8k
Random\Randomizer クラスで日常のあれこれを解決しよう! / Random\Randomizer class solves familiar trouble
cocoeyes02
1
1.4k
BASEにおける インシデント対応フローと工夫
cocoeyes02
0
1.3k
AWS Lambdaから始める Devチームの小さなDevOps改善 〜QCDどれも諦めない運用を目指して〜 / Start to improving small DevOps with AWS Lambda by Dev Team
cocoeyes02
0
1.5k
Featured
See All Featured
Designing for humans not robots
tammielis
254
26k
WENDY [Excerpt]
tessaabrams
11
38k
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
Unsuck your backbone
ammeep
672
58k
How to train your dragon (web standard)
notwaldorf
97
6.7k
Making the Leap to Tech Lead
cromwellryan
135
9.9k
Become a Pro
speakerdeck
PRO
31
6k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
250
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Writing Fast Ruby
sferik
630
63k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
440
Transcript
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める |
BASE, Inc. PHP8.4におけるJITフレームワーク IR と中間表現について理解を深める 02 @PHPerKaigi 2025 2025.03.23
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める Speaker
Profile 2 02 Otsu Kazuki BASE BANK Dept. Engineering Program Manager :@cocoeyes02 PHPカンファレンス2024, 2025 実行委員長
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める BASE
Recruitment Information Our Mission Payment to the People, Power to the People. 自分の好きなことを仕事にしたり経済活動を行っている個人やスモールチーム のエンパワーメントを目指しています。 3 BASE BANKで一緒に働くメンバーを募集中! 絶賛募集中! - Webアプリケーションエンジニア - シニアエンジニア - テックリード - とにかくエンジニア
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 4
今回話すこと • PHPのコンパイルについて軽くおさらいしつ つ、JITと中間表現の基本概念を説明する • JITフレームワーク IRのしくみについてざっくり 知る
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 5
今回話さないこと • IRに関係ない範囲の、 PHPコンパイルの詳細 の話 • JITフレームワーク IRで使用しているアルゴリズ ムの説明
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 6
一般的な言葉の定義① • マシンコード ◦ コンピュータが理解できる言語のこと(機械語やアセンブリ言語など) • コンパイル ◦ ソースコードを、マシンコードやバイトコードなどへ変換すること ◦ 目的に応じたコードへ変換することで、効率化を図っている • 中間表現(中間コード) ◦ マシンコード変換する前に、一度任意のデータ形式に変える手法やコードそのも のこと ◦ 一気にマシンコードへ変換するよりも、無駄な計算を省いたり複数フォーマットへ の変換処理を効率化するなどの恩恵をもたらす
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 7
• バイトコード ◦ 中間表現の一種。命令長がバイト可変長だったり、命令中のフィールドの区切り がバイト単位になっているところから来ている ◦ 今日では、 VM向けの命令コード体系を表現しているところも多い • VM(仮想環境) ◦ コンピュータ上でソフトウェア的に動作する仮想的な「コンピュータ」環境を提供す る技術 ◦ 実際のハードウェアとは独立して動作し、異なるアーキテクチャのシステム上で も同じ環境を再現する目的がある 一般的な言葉の定義②
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める ©
2012-2025 BASE, Inc. 8 PHPのコンパイルについて おさらい( PHP8.3まで) 8
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 9
PHPのコンパイルについておさらい( PHP8.3まで) https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 10
https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP PHPソースコードをVM(Zend Engine)が理 解できるオペコードへ変換する。 その後、オペコードをより効率よく実行できる よう最適化する(数を減らしたり、効率の良い ものにしたりする) オペコード: Zend Engine向けの操作に関する命令の コード。中間表現、バイトコードの一つ。 PHPのコンパイルについておさらい( PHP8.3まで)
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 11
https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP VM(Zend Engine)でオペコードを使って コードを実行する。 本来ならIntel x86とM1 Mac(AArch64)で それぞれマシンコードが必要だが、 オペコードがあれば、 IntelでもMacでも同じ オペコードを実行するだけで OK PHPのコンパイルについておさらい( PHP8.3まで)
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 12
https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP コンパイル済みのオペコードを、 共通メモリにキャッシュする。 Opcache: コンパイル処理のスキップによ る高速化図る目的の PHP拡張モ ジュール。 コンパイル済みのオペコードを、 共通メモリにキャッシュする。 Opcache: 上記のようなキャッシュを用い て、高速化図る目的を持った PHP拡張モジュール。 PHPのコンパイルについておさらい( PHP8.3まで)
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 13
https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP JITコンパイルでマシンコードを生成する。 JIT(ジャストインタイム)コンパイル: PHP8.0で追加されたOPcacheの拡張機能。 Cache Hit時に、VMを通さずマシンコード実 行できる(≒早い)メリットがある。 頻繁に実行されるコー ドを検知して、キャッ シュするよう条件決め ができる PHPのコンパイルについておさらい( PHP8.3まで)
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 14
https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP JITコンパイル時には、 Intel x86とM1 Mac(AArch64)でそ れぞれのマシンコードを分けて生成し ている PHPのコンパイルについておさらい( PHP8.3まで)
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 15
本当はおさらいの方も深く話したいですが、時間が無いので詳細は割愛します! 詳細を知らない人は、下記の記事を読んでみると良いです! • 【PHP】Zend Engine の内部を図示した記事・資料まとめ ◦ https://qiita.com/7968/items/2aa487e2e515dba2fd03 • OPcache オペコードキャッシュの仕組み - Shin x Blog ◦ https://blog.shin1x1.com/entry/php-opcache-under-the-hood • PHP8から追加された JITについて学ぼう ! - takeokunn's blog ◦ https://www.takeokunn.org/posts/permanent/20221222111924-about_php_jit/ PHPのコンパイルについておさらい( PHP8.3まで)
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める ©
2012-2025 BASE, Inc. 16 PHP8.4でJITフレームワーク IRが 導入された背景 16
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 17
https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP JITコンパイル時には、 Intel x86とM1 Mac(AArch64)でそ れぞれのマシンコードを分けて生成 している PHP8.4でJITフレームワーク IRが導入された背景
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 18
PHP8.3の現在について (前略) • PHP JITはターゲット CPU用に機械語を「手動で」直接生成します • 各CPU(x86_64およびAArch64)を個別にサポートする必要があります • 最適化およびレジスタ割り当ての範囲には制限があります • PHP JITは非常に短時間で中間的な品質のコードを生成します • PHP JITに関連する修正には、サポートされているすべてのプラットフォームに対してアセン ブラコードの変更が必要な場合があります ◦ サポートが難しいです PHP8.4でJITフレームワーク IRが導入された背景 https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 19
PHP8.3の現在について (前略) • PHP JITはターゲット CPU用に機械語を「手動で」直接生成します • 各CPU(x86_64およびAArch64)を個別にサポートする必要があります • 最適化およびレジスタ割り当ての範囲には制限があります • PHP JITは非常に短時間で中間的な品質のコードを生成します • PHP JITに関連する修正には、サポートされているすべてのプラットフォームに対してアセン ブラコードの変更が必要な場合があります ◦ サポートが難しいです PHP8.4でJITフレームワーク IRが導入された背景 https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP 各CPUへのサポートを持続的かつ、 品質を担保するため、 効率化が必須
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 20
https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP 効率化のため、独自の JITフレームワーク IRが爆誕! PHP8.4でJITフレームワーク IRが導入された背景
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 21
https://github.com/dstogov/ir PHP8.4でJITフレームワーク IRが導入された背景
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 22
https://github.com/dstogov/ir PHP8.4でJITフレームワーク IRが導入された背景 IRフレームワークは、中規模のプロジェクトで JITを実装するための実用的なソリューションです。 これには、中間表現( IR)の定義、 IR構築のためのシンプルな API、最適化、スケジューリング、レ ジスタ割り当て、コード生成のアルゴリズムが提供されます。生成されたインメモリコードは、直接 実行することができます。 これはまだ安定した完成品ではなく、現在も積極的に開発中です。 PHP-9の次世代 JITコンパイラ 開発のための基盤として始まりましたが、 PHPには完全に依存していません。
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める ©
2012-2025 BASE, Inc. 23 JITフレームワーク IRでどう 中間表現が実現されているか 23
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 24
PHPでのJITコンパイルの流れを、 BeforeAfterで見てみる Before After IRでどう中間表現が実現されているか PHP Script オペコード マシン コード PHP Script オペコード マシン コード IR用 中間コード
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 25
オペコードから IR用中間コードを生成している流れを、 PHPではどうなっているか追ってみる Before After PHP Script オペコード マシン コード PHP Script オペコード マシン コード IR用 中間コード IRでどう中間表現が実現されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 26
php-srcで、JITのコンパイルを実行しているコードを見てみる https://github.com/php/php-src/blob/master/ext/opcache/jit/zend_jit.c#L1413 IRでどう中間表現が実現されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 27
各所でIR ビルダー API(ir_builder.h)を使って、 IR用の中間コードを生成していた https://github.com/php/php-src/blob/master/ext/opcache/jit/zend_jit.c#L1756 IRでどう中間表現が実現されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 28
各所でIR ビルダー API(ir_builder.h)を使って、 IR用の中間コードを生成していた https://github.com/php/php-src/blob/master/ext/opcache/jit/zend_jit.c#L1756 IRでどう中間表現が実現されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 29
各所でIR ビルダー API(ir_builder.h)を使って、 IR用の中間コードを生成していた https://github.com/php/php-src/blob/master/ext/opcache/jit/zend_jit_ir.c#L5684 IRでどう中間表現が実現されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 30
各所でIR ビルダー API(ir_builder.h)を使って、 IR用の中間コードを生成していた https://github.com/php/php-src/blob/master/ext/opcache/jit/zend_jit_ir.c#L5684 IRでどう中間表現が実現されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 31
各所でIR ビルダー API(ir_builder.h)を使って、 IR用の中間コードを生成していた https://github.com/dstogov/ir/blob/master/ir_builder.h IRでどう中間表現が実現されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 32
各所でIR ビルダー API(ir_builder.h)を使って、 IR用の中間コードを生成していた IRでどう中間表現が実現されているか https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 33
IR用中間コードからマシンコード生成をしているコードを追ってみる Before After PHP Script オペコード マシン コード PHP Script オペコード マシン コード IR用 中間コード IRでどう中間表現が実現されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 34
php-srcで、JITのコンパイルを実行しているコードを見てみる … https://github.com/php/php-src/blob/master/ext/opcache/jit/zend_jit.c#L2938 IRでどう中間表現が実現されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 35
zend_jit_ir_compile で、組み立てた IR用中間コードをコンパイルしている … https://github.com/php/php-src/blob/master/ext/opcache/jit/zend_jit_ir.c#L16734 IRでどう中間表現が実現されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 36
zend_jit_ir_compile で、組み立てた IR用中間コードをコンパイルしている … https://github.com/php/php-src/blob/master/ext/opcache/jit/zend_jit_ir.c#L16734 IRでどう中間表現が実現されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 37
zend_jit_ir_compile で、組み立てた IR用中間コードをコンパイルしている https://github.com/php/php-src/blob/master/ext/opcache/jit/zend_jit_ir.c#L268-L296 IRでどう中間表現が実現されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 38
zend_jit_ir_compile で、組み立てた IR用中間コードをコンパイルしている https://github.com/php/php-src/blob/master/ext/opcache/jit/zend_jit_ir.c#L268-L296 IRでどう中間表現が実現されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 39
ir_emit_codeでマシンコードを生成する( CPUごとにマシンコード生成用ファイルがある) … https://github.com/php/php-src/blob/master/ext/opcache/jit/zend_jit_ir.c#L2780 IRでどう中間表現が実現されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 40
ir_emit_codeでマシンコードを生成する( CPUごとにマシンコード生成用ファイルがある) https://github.com/php/php-src/blob/master/ext/opcache/jit/ir/ir_x86.dasc#L10461 https://github.com/php/php-src/blob/master/ext/opcache/jit/ir/ir_aarch64.dasc#L5851 IRでどう中間表現が実現されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 41
ir_emit_codeでマシンコードを生成する( CPUごとにマシンコード生成用ファイルがある) https://github.com/php/php-src/blob/master/ext/opcache/jit/ir/ir_x86.dasc#L10461 https://github.com/php/php-src/blob/master/ext/opcache/jit/ir/ir_aarch64.dasc#L5851 IRでどう中間表現が実現されているか マシンコードの生成には、 PHP8.0の JITでも使用している DynASM を使っ ている
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める ©
2012-2025 BASE, Inc. 42 完全理解した! 42
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める ©
2012-2025 BASE, Inc. 43 完全理解した ...? 43
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 44
何か忘れている気がする
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 45
中間コードが 1つ増える =変換の工程が 1つ増えるから、遅くなるのでは? Before After PHP Script オペコード マシン コード PHP Script オペコード マシン コード JIT FW IR用 中間コード 何か忘れている気がする
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 46
もしかして中間コードって 増やせば増やすほど早くなる 魔法のコードか!!???? 何か忘れている気がする
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 47
もしかして中間コードって 増やせば増やすほど早くなる 魔法のコードか!!???? ✖ 何か忘れている気がする
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 48
https://wiki.php.net/rfc/jit-ir 現在の新しい PHP JIT は、古いものとまったく同じ PHP 関連の機能と最適化のセットを実装して います。 IR フレームワークは より多くの最適化を提供 し、よりスマートなレジスタ アロケータを備えている ため、JIT はより高速 (5 ~ 10%) でより小さなコードを生成します。 何か忘れている気がする
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める ©
2012-2025 BASE, Inc. 49 IRでどう中間表現が 最適化されているか 49
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 50
遅くならないよう、色々な工程で最適化がされています https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP IRでどう中間表現が最適化されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 51
詳細を話すと時間内で終わらないので、 PHPコード例で簡単に最適化の内容を話します https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP 中間コード 作成 マシン コード生成 マシンコード生成前に必要な準備 最適化 最適化 最適化 IRでどう中間表現が最適化されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 52
定数畳み込み / 定数伝播による、式の単純化 &デッドコード削除 (FOLDING) (SCCP) https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP IRでどう中間表現が最適化されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 53
// PHPでのコード例 $a = 30; $b = 9 - $a / 5; $c = $b * 4; if ($c > 10) { $c = $c - 10; } return $c * 2; IRでどう中間表現が最適化されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 54
// $a の値を代入して、定数値に置き換える(定数伝搬) $a = 30; $b = 9 - 30 / 5; $c = $b * 4; if ($c > 10) { $c = $c - 10; } return $c * 2; IRでどう中間表現が最適化されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 55
// 定数伝播を続けて、式を計算して単純な定数にする(定数畳み込み) $a = 30; $b = 3; $c = 12; if (12 > 10) { $c = $c - 10; } return $c * 2; IRでどう中間表現が最適化されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 56
// if文が必ずtrueになるので消す(疎な条件分岐を考慮した定数伝播(SCCP)) $a = 30; $b = 3; $c = 12; $c = 12 - 10; // 2 return $c * 2; IRでどう中間表現が最適化されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 57
// 最終的に定数になるまで単純化される return 4; IRでどう中間表現が最適化されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 58
// もしif文がfalseだった場合は、if文には到達しない(デッドコードになる) $a = 30; $b = 3; $c = 9; if (9 > 10) { $c = $c - 10; } return $c * 2; IRでどう中間表現が最適化されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 59
// デッドコードを削除して、 // 単純化する(疎な条件分岐を考慮した定数伝播(SCCP)) return 18; IRでどう中間表現が最適化されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 60
同じ式の出現を探し出して、計算結果を格納する一つの変数に置き換える (CSE) https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP IRでどう中間表現が最適化されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 61
// PHPでのコード例 $a1 = $b * $c + $g; $a2 = $b * $c * $d; $tmp = $b * $c; $a1 = $tmp + $g; $d2 = $tmp * $d; IRでどう中間表現が最適化されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 62
// 全く同じ式が大量にでてきたとする(極端ではあるが) $a1 = $b * $c + $g; $a2 = $b * $c * $d; … $a5000000000 = $b * $c * $d; IRでどう中間表現が最適化されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 63
// 一番最初に計算すると、計算コストが下がる(共通部分式除去(CSE)) $tmp = $b * $c; $a1 = $tmp + $g; $a2 = $tmp * $d; … $a5000000000 = $tmp * $d; IRでどう中間表現が最適化されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 64
計算タイミングを前後することで、よりループの内側へ / デッドコードを削除 (GCM) https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP IRでどう中間表現が最適化されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 65
function foo ($a): int { // PHPのコード例 $i = 0; do { $b = $a + 1; $i = $i + $b; $c = $i * 2; } while ($i < 10) { return $c; } } IRでどう中間表現が最適化されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 66
function foo ($a): int { // $aは定数なので、$bも定数伝播により定数になるのでループ外へ移動 $i = 0; $b = $a + 1; do { $i = $i + $b; $c = $i * 2; } while ($i < 10) { return $c; } } IRでどう中間表現が最適化されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 67
function foo ($a): int { // $iも20になり(ループ10回回るため)定数になるので、ループ外へ移動 $i = 0; $b = $a + 1; do { $i = $i + $b; } while ($i < 10) { $c = $i * 2; return $c; } } IRでどう中間表現が最適化されているか
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 68
IRでどう中間表現が最適化されているか 内部のアルゴリズムについて知りたい人は、 Sea of Nodesの理解が必要なので、興味あればぜ ひ!下記の記事がわかりやすかったです! https://darksi.de/d.sea-of-nodes/
#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 69
最後に 正直に話すと、ちょっと理解が正しいか自信がない部分もあります 🙇 もし知見があったりなにか気づいたことがあれば、 Q&AでもAsk the SpeakerでもXのポストでも カンファレンスの廊下でも、 FBいただけると助かります 🙏🙏🙏🙏🙏🙏 今回の話は範囲を絞っても、それだけで 20,40分トークで話せるぐらい奥深い分野なので、是非 みなさんもインプット &アウトプットしてみてはいかがでしょうか!