PHPの変数や関数、クラス等を書籍等を見ながら勉強してる入門者です。
PHPがはじめての言語なので、PHPの内部構造(C言語)は読めません(・ω・`;)
変数や関数など記述したコードがPHPの内部でどのような流れで処理されているのか理解したく、調べております。
PHP7で内部構造が変わっていることは承知しております。
PHP7については情報少ないので、PHP5の内部構造を調べております。
コンパイラやzval構造体、ハッシュテーブルなど一部にフォーカスして説明した記事は結構ありましたが、全体を示す図がなかなか見つからず、2日ぐらいググって下記の図を見つけました。
引用:Quick tour of PHP from inside
LexerやParser、OPcode、zval、HashTablesなど単体を説明した記事はありましたので、それぞれがどのような役割をしているのかは何となく理解しております。
ただ、上図で言うところの「Zend Virtual Machine」と「Zend Engine Core」の結びつきがわからず一連の処理が理解できておりません。
直接的な回答ではなくても、参考になるサイトや書籍など何でもいいので情報を頂けると嬉しいです。
#【質問1】Zval や HashTables などはどの段階で作成されるのですか?
PHP5ならLexerで字句解析をし、Parserで構文解析をして、OPcodeを作成して実行しているかと存じます。
この一連の流れの中で、Zval や HashTables などが作成されると思うのですが、Parserで構文解析したときに作成されるのでしょうか?
それとも別の段階で作成されるのでしょうか。
#【質問2】シンボルテーブルはスコープごとに作成されるのですか?
シンボルテーブルを表した下図だとglobalとfunctionとシンボルテーブルが別々です。
シンボルテーブルはスコープごとに作成されるということでしょうか?
#【質問2がYesだった場合】属するシンボルテーブル名を確認する方法はありますか?
仮にスコープごとにシンボルテーブルが作られる場合、複数のシンボルテーブルがあるかと存じます。
シンボルテーブルを区別するために名前のようなものが付与されるかと存じます。
そのシンボルテーブルの名前を確認する方法はありますでしょうか?
xdebug_debug_zval()
だとzvalの中身はわかりますが、属しているシンボルテーブルの名前は表示されません。
シンボルテーブルの名前をダンプする方法があれば、教えてください。
#【質問3】function stack とはなんですか?
シンボルテーブルを表した図にはfunction stackとあります。
これは何を表してるのでしょうか?
ご存知の方いれば、何卒ご教示くださいm(__)m
参考・閲読
下記には目を通しましたが、難して理解できていないところも多々あります^^;
蛇足
質問の中にある書いてある通り、全体図を探すのに結構な時間を費やしました。
php, zval, zend, lexer, parser, vm, opcode, hashtable, symboltable
あたりのワードでひたすらググってましたが英語や中国語のヒットします。
日本語しか読めないので、進化したGoogle翻訳をフル活用して調べてましたが、なかなか全体図を説明・記載したものを探せませんでした。
最終的にグーグルの画像検索で見つけました。
私のようにググり力が乏しい方はいないかもしれませんが、同じように困ってる方がいれば画像検索も試してみてください。
以上、蛇足です。

回答1件
あなたの回答
tips
プレビュー