Recommended
PPTX
PPTX
PPTX
PPTX
PHP と SAPI と ZendEngine3 と
PDF
PDF
PDF
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
PDF
PPTX
php and sapi and zendengine2 and...
PPTX
signal の話 或いは Zend Signals とは何か
PDF
PPTX
PDF
PPTX
PDF
PECL operator で演算子オーバーロード
PDF
PPT
How to debug a perl script using gdb
PDF
Good Parts of PHP and the UNIX Philosophy
PDF
PDF
PDF
PDF
PDF
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
KEY
PDF
PDF
PDF
PHPカンファレンス2014の懇親会飛び込みLT資料
PDF
Lisp Tutorial for Pythonista Day 6
PPTX
PPTX
More Related Content
PPTX
PPTX
PPTX
PPTX
PHP と SAPI と ZendEngine3 と
PDF
PDF
PDF
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
PDF
What's hot
PPTX
php and sapi and zendengine2 and...
PPTX
signal の話 或いは Zend Signals とは何か
PDF
PPTX
PDF
PPTX
PDF
PECL operator で演算子オーバーロード
PDF
PPT
How to debug a perl script using gdb
PDF
Good Parts of PHP and the UNIX Philosophy
PDF
PDF
PDF
PDF
PDF
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
KEY
PDF
PDF
PDF
PHPカンファレンス2014の懇親会飛び込みLT資料
PDF
Lisp Tutorial for Pythonista Day 6
Similar to PHP AST 徹底解説(補遺)
PPTX
PPTX
PDF
Modern PHP Programming @ PFI Seminar
PDF
Phpcon tokyo 20120_bigginer
PPTX
PHPCON_TOKYO_2022_Bigginer.pptx
PDF
PDF
PHP初心者セッション2023 〜ChatGPT時代の簡単な始め方〜
PDF
PDF
PHP で実行中のスクリプトの動作を下から覗き見る
PPT
CPANの依存モジュールをもう少し正しく検出したい
KEY
PDF
PDF
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PDF
PDF
最新PHP事情 (2000年7月22日,PHPカンファレンス)
PDF
CodeIgniter東京勉強会 2011.05.14
PDF
PDF
PHPの今とこれから2025 (PHP Conference Japan 2025)
PPT
Php unit extensions_selenium2_testcaseによる結合試験でらくらくテスト♪
PDF
More from do_aki
PPTX
Tritonn から Elasticsearch への移行話
PPTX
PPTX
Writing php extensions in golang
PPTX
N対1 レプリケーション + Optimizer Hint
PPTX
PPTX
MySQL Casual Talks 7 「N:1 レプリケーション ~進捗どうですか?~」
PPTX
PPTX
20141011 mastering mysqlnd
PPTX
PPTX
PHP から Groonga を使うにはこんなコードになるよ!
PPTX
N:1 Replication meets MHA
PDF
PPTX
セキュアそうでセキュアじゃない少しセキュアな気分になれるmysql_config_editor
PPTX
マスタN対スレーブ1レプリケーションの作り方 ~あれから~
PPTX
PPTX
PDF
A bridge between php and ruby
PDF
Ruby and comparison_and...php
PPTX
PPTX
Ruby enumerable source code reading
Recently uploaded
PDF
PCCC25(設立25年記念PCクラスタシンポジウム):東京大学情報基盤センター テーマ1/2/3「Society5.0の実現を目指す『計算・データ・学習...
PDF
visionOS TC「新しいマイホームで過ごすApple Vision Proとの新生活」
PDF
第25回FA設備技術勉強会_自宅で勉強するROS・フィジカルAIアイテム.pdf
PDF
安価な ロジック・アナライザを アナライズ(?),Analyze report of some cheap logic analyzers
PDF
基礎から学ぶ PostgreSQL の性能監視 (PostgreSQL Conference Japan 2025 発表資料)
PPTX
PHP AST 徹底解説(補遺) 1. 2. 3. 4. 5. PHP
Compiler in PHP
PHP Script
Opcode
Request
Output
Compiler
Lexing
Parsing
Compilation
VM
Execution
INCLUDE_OR_EVAL
6. php5 (1 pass / 151構文(5.6))
字句解析 + 構文解析 + Opcode生成
php7 (2 pass / 127構文(7.0))
字句解析+構文解析 Opcode生成
最適化の余地
7. 9. 10. 11. 7.0 からの変更
• 7.0 から第2引数に TOKEN_PARSE を指定で
きるようになった
– 指定なし: 字句解析のみ / 5.6 まで同様
– 指定あり: 構文解析もする / ast は破棄
• TOKEN_PARSE 指定でも Opcode 生成は省略
– zendparse を呼ぶが、
zend_compile_top_stmt は呼ばない
– Syntax Error (例外) は発生するがCompile
Error (Fatal) は発生しない
– const A = f(); のようなコードも受け入れる
12. 13. 14. 15. 16. Opcode (vld)
line #* E I O op fetch ext return operands
----------------------------------------------------------------
2 0 E > EXT_NOP
1 RECV !0
3 2 EXT_STMT
3 NOP
4 FAST_CONCAT ~1 'Hello+', !0
5 ECHO ~1
4 6 EXT_STMT
7 > RETURN null
line #* E I O op fetch ext return operands
----------------------------------------------------------------
2 0 E > EXT_STMT
1 NOP
6 2 EXT_STMT
3 INIT_FCALL 'hello'
4 EXT_FCALL_BEGIN
5 SEND_VAL 'php'
6 DO_FCALL 0
7 EXT_FCALL_END
8 > RETURN 1
function
hello()
call
hello()
17. Opcode (vld without xdebug)
line #* E I O op fetch ext return operands
----------------------------------------------------------------
2 0 E > RECV !0
3 1 NOP
2 FAST_CONCAT ~1 'HELLO+', !0
3 ECHO ~1
4 4 > RETURN null
line #* E I O op fetch ext return operands
----------------------------------------------------------------
2 0 E > NOP
6 1 INIT_FCALL 'hello'
2 SEND_VAL 'php'
3 DO_FCALL 0
4 > RETURN 1
function
hello()
call
hello()
18. FAST_CONCAT
• encaps_list (変数を含む文字列) において、
要素が2つの時(変数の前後どちらかに文字列を加える時)
に FAST_CONCAT になる
(at zend_compile_encaps_list)
• 5.6 までは ADD_VAR + ADD_STRING
• ちなみに 3要素以上ならば ROPE_INIT,
ROPE_ADD, [ROPE_ADD,] ROPE_END
19. "{$a} lines"
5.6
7.0
#* E I O op fetch ext return operands
------------------------------------------------------
0 E > ADD_VAR ~0 !0
1 ADD_STRING ~0 ~0, '+lines'
#* E I O op fetch ext return operands
------------------------------------------------------
0 E > NOP
1 FAST_CONCAT ~1 !0, '+lines'
20. "{$a} / {$b} lines"
5.6
7.0
#* E I O op fetch ext return operands
------------------------------------------------------
0 E > ADD_VAR ~0 !0
1 ADD_STRING ~0 ~0, '+%2F+'
2 ADD_VAR ~0 ~0, !1
3 ADD_STRING ~0 ~0, '+lines'
#* E I O op fetch ext return operands
------------------------------------------------------
0 E > ROPE_INIT 4 ~3 !0
1 ROPE_ADD 1 ~3 ~3, '+%2F+'
2 ROPE_ADD 2 ~3 ~3, !1
3 ROPE_END 3 ~2 ~3, '+lines'
21. 22. 23. 24. 25. 26. 27. 28. 定数の畳み込み
$sec_in_day = 60 * 60 * 24;
$sec_in_day = 86400;
※実は OpCache でも行われている
class A { const HOGE = ‘hoge‘; }
echo A::HOGE;
echo ‘hoge‘;
コンパイル時点で定義済みの定数に対してのみ有効
(autoload より pre include のほうが効きやすい)
29. コンパイルタイミングによって
Opcode が変化する例
class A { const X = 1; }
a.php
require_once 'a.php';
echo A::X;
echo.php
require_once 'a.php';
require_once 'echo.php';
require.php
> php echo.php
echo.php をコンパイルする時点
では a.php はコンパイルされて
いない
> php require.php
echo.php をコンパイルする時点
で a.php はコンパイル済み
30. line #* E I O op fetch ext return operands
-----------------------------------------------------------
2 0 E > INCLUDE_OR_EVAL 'a.php', REQUIRE_ONCE
3 1 FETCH_CONSTANT ~1 'A', 'X'
2 ECHO ~1
3 > RETURN 1
line #* E I O op fetch ext return operands
-----------------------------------------------------------
0 E > INCLUDE_OR_EVAL 'a.php', REQUIRE_ONCE
3 1 ECHO 1
2 > RETURN 1
> php echo.php
> php require.php (の時の echo.php)
31. 32. HHVM におけるコンパイル
• 2つのLexer (yylex)
Compiler5lex/Compiler7lex
• 2つのParser (yyparse)
HPHP::Compiler::Parser::parseImpl5
HPHP::Compiler::Parser::parseImpl7
• どちらも AST を生成する
33. HHVM における AST
• AST ノードの基底クラスである
HPHP::Construct があり、Statement
と Expression に分かれる
• HPHP::Compiler::Parser::parseImpl
が、parseImpl7 あるいは parseImpl5
を呼び出し、
HPHP::Compiler::Parser::m_tree に
StatementList が作られる
34. 35. 36. 37. 38. 39. astparse_code('<?php 1 + 2;')
全ノードをphp スクリプトで扱える構造に変換 (CG(ast) は破棄)
C言語 (CG(ast))
array
astnode
kind: 520
flags: 1
lineno: 1
left: 1
right: 2
astNode
kind: 133
flags:0
lineno: 0
children:
AST_ZVAL
1
AST_ZVAL
2
AST_BINA
RY_OP +
AST_STMT
_LIST
ast_to_zval
php スクリプト (zval)
40. 41. それぞれの特徴
• php-ast
– php スクリプトから扱いやすい
– 初期のコストが大きめ
– 異なるバージョンでの変換処理を拡張側で頑張っ
てる部分もある
• astkit
– C の ast そのままのメモリを操作
– 利用する箇所が部分的ならば低コストか
– ast 構造の変化によって php 側での操作が大き
く変わる
42. 43.