Slide 1

Slide 1 text

Opcodeを読んでいたら 何故かphp-srcを読んでいた話 むらおか @muraSHOTARO PHP Conference Japan 2024

Slide 2

Slide 2 text

intの型キャストとintval関数 ● (int) “1234” と intval(“1234”) ● 文字列を整数にする

Slide 3

Slide 3 text

intの型キャストとintval関数 ● (int) “1234” と intval(“1234”) ● 文字列を整数にする なにが違う?

Slide 4

Slide 4 text

php-srcを読んでみよう!

Slide 5

Slide 5 text

C言語わからない。。。

Slide 6

Slide 6 text

php-srcの前にOpcodeを読むと良いらしい ● OpcodeはPHPファイルを解析して生成される中間コード ● PHP実行時に内容を出力することができる

Slide 7

Slide 7 text

Opcodeを読んでみよう!

Slide 8

Slide 8 text

intval (int)

Slide 9

Slide 9 text

intval (int)

Slide 10

Slide 10 text

関数の呼び出しの場合 ● INIT_FCALL ● DO_ICALL

Slide 11

Slide 11 text

● いくつかの関数がOpcodeのコンパイル時に最適化されるようになった ○ intvalもそのうちの1つ (>=7.1.0) ● Opcodeのコンパイルは zend_compile_* 関数で行われる ○ https://wiki.php.net/rfc/abstract_syntax_tree#compiler_implementation AST導入とOpcodeの最適化

Slide 12

Slide 12 text

● いくつかの関数がOpcodeのコンパイル時に最適化されるようになった ○ intvalもそのうちの1つ (>=7.1.0) ● Opcodeのコンパイルは zend_compile_* 関数で行われる ○ https://wiki.php.net/rfc/abstract_syntax_tree#compiler_implementation AST導入とOpcodeの最適化 zend_compile_* を探そう!

Slide 13

Slide 13 text

php-srcを読んでみよう!

Slide 14

Slide 14 text

zend_compile.c を読む ● zend_try_compile_special_func ○ intvalは特別な関数 https://github.com/php/php-src/blob/php-7.1.0/Zend/zend_compile.c#L3664

Slide 15

Slide 15 text

zend_compile.c を読む ● zend_compile_func_cast ○ ZEND_CASTにコンパイルされる https://github.com/php/php-src/blob/php-7.1.0/Zend/zend_compile.c#L3395

Slide 16

Slide 16 text

intval (int) Opcodeが 最適化されてる

Slide 17

Slide 17 text

● Opcodeリーディングはphp-srcを読む糸口になる ● C言語を読むのに抵抗がある人でもOpcodeなら読みやすいかも? まとめ

Slide 18

Slide 18 text

● Opcodeリーディングはphp-srcを読む糸口になる ● C言語を読むのに抵抗がある人でもOpcodeなら読みやすいかも? まとめ Opcodeから始めよう!

Slide 19

Slide 19 text

ありがとうございました!

Slide 20

Slide 20 text

https://wiki.php.net/rfc/abstract_syntax_tree https://qiita.com/tadsan/items/d11229761504c8a1ca81 https://speakerdeck.com/yasuaki640/phpnoopcodewo-du-ndemiyou https://hakre.wordpress.com/2010/05/13/php-casting-vs-intval/ 参考資料