質問編集履歴
9
訂正
title
CHANGED
File without changes
|
body
CHANGED
@@ -187,7 +187,7 @@
|
|
187
187
|
> 番号の後に*(5 *のように)があるすべてのオペコードは、到達できないコードであり、オプティマイザのoparraysから削除される可能性があります。
|
188
188
|
|
189
189
|
|
190
|
-
一般的なソフトも未保存のファイルに * が付くのでGoogle先生の解釈で概ね間違
|
190
|
+
一般的なソフトも未保存のファイルに * が付くのでGoogle先生の解釈で概ね間違いない気がします。
|
191
191
|
|
192
192
|
op_arrayに関しては [PHP による hello world 入門](http://tech.respect-pal.jp/php-helloworld/) に下記の説明があります。
|
193
193
|
|
8
追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -195,4 +195,5 @@
|
|
195
195
|
|
196
196
|
基本的に op_array に格納されるようですが、英語読めないのでどのタイミングでいつ削除されるのかなど肝心なところが全くわかりません^^;
|
197
197
|
|
198
|
-
** ※teratailの質問は、上限が10000文字で追記できないので、他の調査メモは回答へ追記します。 **
|
198
|
+
** ※teratailの質問は、上限が10000文字で追記できないので、他の調査メモは回答へ追記します。 **
|
199
|
+
** ※この質問をクリップしている方もいるため、調査メモを追記してきましたが、文字数制限で回答等にも記載し、読みにくいため、理解できたら記事をまとめてQiitaに投稿します。**
|
7
調査メモの追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -193,4 +193,6 @@
|
|
193
193
|
|
194
194
|
> PHP ソースコードのバイトコードへのコンパイル結果は、関数ごと別々の配列へ格納されます。コンパイル結果の命令列を保持する配列は op_array と呼ばれています。phpdbg の print 命令はこの op_array の内容をダンプするものです。
|
195
195
|
|
196
|
-
基本的に op_array に格納されるようですが、英語読めないのでどのタイミングでいつ削除されるのかなど肝心なところが全くわかりません^^;
|
196
|
+
基本的に op_array に格納されるようですが、英語読めないのでどのタイミングでいつ削除されるのかなど肝心なところが全くわかりません^^;
|
197
|
+
|
198
|
+
** ※teratailの質問は、上限が10000文字で追記できないので、他の調査メモは回答へ追記します。 **
|
6
調査メモの追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -174,4 +174,23 @@
|
|
174
174
|
|
175
175
|
zend_opに関して [Phpをいじり倒す10の方法](http://sssslide.com/www.slideshare.net/moriyoshi/php10#21) に説明がありました。
|
176
176
|
ただ、extended_value が現時点で何なのかよくわかってません^^;
|
177
|
-
参考になるものを見つけたら追記します。
|
177
|
+
参考になるものを見つけたら追記します。
|
178
|
+
|
179
|
+
#### ダンプした * について
|
180
|
+
|
181
|
+
[More source analysis with VLD](https://derickrethans.nl/more-source-analysis-with-vld.html) に下記の記述があります。
|
182
|
+
|
183
|
+
> Every opcode that has a * after the number (like in 5*) is code that can not be reached, and can possibly be eliminated from the oparrays in an optimiser.
|
184
|
+
|
185
|
+
英語読めないので、Google先生に頼ると到達できていないコードのようです。
|
186
|
+
|
187
|
+
> 番号の後に*(5 *のように)があるすべてのオペコードは、到達できないコードであり、オプティマイザのoparraysから削除される可能性があります。
|
188
|
+
|
189
|
+
|
190
|
+
一般的なソフトも未保存のファイルに * が付くのでGoogle先生の解釈で概ね間違えない気がします。
|
191
|
+
|
192
|
+
op_arrayに関しては [PHP による hello world 入門](http://tech.respect-pal.jp/php-helloworld/) に下記の説明があります。
|
193
|
+
|
194
|
+
> PHP ソースコードのバイトコードへのコンパイル結果は、関数ごと別々の配列へ格納されます。コンパイル結果の命令列を保持する配列は op_array と呼ばれています。phpdbg の print 命令はこの op_array の内容をダンプするものです。
|
195
|
+
|
196
|
+
基本的に op_array に格納されるようですが、英語読めないのでどのタイミングでいつ削除されるのかなど肝心なところが全くわかりません^^;
|
5
調査メモの追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -140,4 +140,38 @@
|
|
140
140
|
- [オレオレPHPのつくり方](http://sssslide.com/www.slideshare.net/rsk/php-17106150)
|
141
141
|
- [PHP による hello world 入門](http://tech.respect-pal.jp/php-helloworld/)
|
142
142
|
- [PHP 5.5ネーティブキャッシュの話](http://www.slideshare.net/hirokawa/php-55-26227359)
|
143
|
-
- [Zend OPcacheの速さの秘密を探る](http://www.slideshare.net/hnw/zend-opcache)
|
143
|
+
- [Zend OPcacheの速さの秘密を探る](http://www.slideshare.net/hnw/zend-opcache)
|
144
|
+
|
145
|
+
#【追記】調査メモ
|
146
|
+
|
147
|
+
質問後に調査した結果をここにフィードバックします。
|
148
|
+
C言語も英語も読めない未熟者ですので、私の調査結果は信憑性に欠けると思います。
|
149
|
+
そのときは、ご指摘くださいm(__)m
|
150
|
+
|
151
|
+
#### ダンプした ext について
|
152
|
+
|
153
|
+
vld の表示は [zend_compile.h](https://github.com/php/php-src/blob/c71ab7260a05f3f167f51444060406b9e23ede5b/Zend/zend_compile.h) の下記の箇所をダンプしているはずです。
|
154
|
+
|
155
|
+
```
|
156
|
+
struct _zend_op {
|
157
|
+
const void *handler;
|
158
|
+
znode_op op1;
|
159
|
+
znode_op op2;
|
160
|
+
znode_op result;
|
161
|
+
uint32_t extended_value;
|
162
|
+
uint32_t lineno;
|
163
|
+
zend_uchar opcode;
|
164
|
+
zend_uchar op1_type;
|
165
|
+
zend_uchar op2_type;
|
166
|
+
zend_uchar result_type;
|
167
|
+
};
|
168
|
+
```
|
169
|
+
|
170
|
+
ext という項目は `uint32_t extended_value;` に該当するかと思います。
|
171
|
+
`extended_value` というワードで調べたら [PHP による hello world 入門](http://tech.respect-pal.jp/php-helloworld/) に下記の説明がありました。
|
172
|
+
|
173
|
+
> ZEND_INCLUDE_OR_EVAL 命令は名前の通り include / require の他に eval にも対応しているのですが、命令列のダンプ結果にはこれらを区別する情報がないのを不思議に思うかもしれません。これは phpdbg の問題です。実際には一部の命令は、2 つのオペランドの他に extended_value というデータをとる場合があり、PHP 5.6 の phpdbg は ZEND_INCLUDE_OR_EVAL 命令の extended_value の表示に対応していないようです。vld だと extended_value での違いもちゃんと表示してくれます。
|
174
|
+
|
175
|
+
zend_opに関して [Phpをいじり倒す10の方法](http://sssslide.com/www.slideshare.net/moriyoshi/php10#21) に説明がありました。
|
176
|
+
ただ、extended_value が現時点で何なのかよくわかってません^^;
|
177
|
+
参考になるものを見つけたら追記します。
|
4
訂正
title
CHANGED
File without changes
|
body
CHANGED
@@ -84,7 +84,7 @@
|
|
84
84
|
|
85
85
|
#【質問2】029DCEDCの意味は?
|
86
86
|
|
87
|
-
オペコードのoperandsに `%00%7Bclosure%7DC%3A%5Cxampp%5Chtdocs%5Cfunc1.php029DCEDC` とあります。
|
87
|
+
ダンプしたオペコードのoperandsに `%00%7Bclosure%7DC%3A%5Cxampp%5Chtdocs%5Cfunc1.php029DCEDC` とあります。
|
88
88
|
パーセントエンコーディングのため一つ一つ変換すると `NULL{closure}C:\xampp\htdocs\unc1.php029DCEDC`になるかと存じます。
|
89
89
|
最後の `029DCEDC` だけ何の記述で何を示しているのかわかりません。
|
90
90
|
これは何の記述でしょうか?
|
3
訂正
title
CHANGED
File without changes
|
body
CHANGED
@@ -69,7 +69,7 @@
|
|
69
69
|
8 3* > RETURN null
|
70
70
|
```
|
71
71
|
|
72
|
-
#質問1
|
72
|
+
#【質問1】「ローカル変数」「一時的な変数」「一時的ではない変数」の違いは?
|
73
73
|
|
74
74
|
「[PHPはどのように動くのか ~PHPコアから読み解く仕組みと定石](http://gihyo.jp/book/2015/978-4-7741-7642-0)」には`! ~ $` に関して下記のように解説しています。
|
75
75
|
|
@@ -82,21 +82,21 @@
|
|
82
82
|
|
83
83
|
推測ですが、「ローカル変数」は、関数内に記述した変数のことで、「一時的な変数」は静的変数のことなのかなという感じですが、「一時的ではない変数」については皆目検討もつきません。
|
84
84
|
|
85
|
-
#質問2
|
85
|
+
#【質問2】029DCEDCの意味は?
|
86
86
|
|
87
87
|
オペコードのoperandsに `%00%7Bclosure%7DC%3A%5Cxampp%5Chtdocs%5Cfunc1.php029DCEDC` とあります。
|
88
88
|
パーセントエンコーディングのため一つ一つ変換すると `NULL{closure}C:\xampp\htdocs\unc1.php029DCEDC`になるかと存じます。
|
89
89
|
最後の `029DCEDC` だけ何の記述で何を示しているのかわかりません。
|
90
90
|
これは何の記述でしょうか?
|
91
91
|
|
92
|
-
#質問3
|
92
|
+
#【質問3】* と ext の意味は?
|
93
93
|
|
94
94
|
vldでオペコードダンプすると、番号の左側に * が表示されます。
|
95
95
|
この * はどのような意味でしょうか?
|
96
96
|
|
97
97
|
ダンプした列に ext という項目がありますが、これはどのような意味でしょうか?
|
98
98
|
|
99
|
-
#質問4
|
99
|
+
#【質問4】two-pass compiler
|
100
100
|
|
101
101
|
下記サイトにphpは two-pass compiler との記述があります。
|
102
102
|
※まだ英語を習得できていないので英字サイトの内容を正しく理解できておりません。すいません><
|
@@ -111,7 +111,7 @@
|
|
111
111
|
図示した通り、PHP5とPHP7ではオペコードの作成方法が異なるかと存じます。
|
112
112
|
ここから質問です。
|
113
113
|
|
114
|
-
##質問4-1
|
114
|
+
###【質問4-1】two-pass compiler
|
115
115
|
|
116
116
|
two-pass compiler についてググってもあまり情報がないのですが、下記のような動作をしているということでよろしいのでしょうか?
|
117
117
|
|
@@ -119,7 +119,7 @@
|
|
119
119
|
|
120
120
|
引用:[PHPをハックしよう(第二回) | IT特殊案件ならBackflip180](http://backflip180.jp/tech/php-hack-2.html)
|
121
121
|
|
122
|
-
##質問4-2
|
122
|
+
###【質問4-2】PHP5とPHP7での違いは?
|
123
123
|
|
124
124
|
図示した通り、PHP5とPHP7ではオペコードの作成方法が異なるかと存じます。
|
125
125
|
PHP5はパーサーが two-pass で、PHP7からはオペコードコンパイラが two-pass なのでしょうか?
|
2
訂正
title
CHANGED
File without changes
|
body
CHANGED
@@ -111,7 +111,7 @@
|
|
111
111
|
図示した通り、PHP5とPHP7ではオペコードの作成方法が異なるかと存じます。
|
112
112
|
ここから質問です。
|
113
113
|
|
114
|
-
##質問
|
114
|
+
##質問4-1 two-pass compiler
|
115
115
|
|
116
116
|
two-pass compiler についてググってもあまり情報がないのですが、下記のような動作をしているということでよろしいのでしょうか?
|
117
117
|
|
@@ -119,7 +119,7 @@
|
|
119
119
|
|
120
120
|
引用:[PHPをハックしよう(第二回) | IT特殊案件ならBackflip180](http://backflip180.jp/tech/php-hack-2.html)
|
121
121
|
|
122
|
-
##質問
|
122
|
+
##質問4-2 PHP5とPHP7での違いは?
|
123
123
|
|
124
124
|
図示した通り、PHP5とPHP7ではオペコードの作成方法が異なるかと存じます。
|
125
125
|
PHP5はパーサーが two-pass で、PHP7からはオペコードコンパイラが two-pass なのでしょうか?
|
1
訂正
title
CHANGED
File without changes
|
body
CHANGED
@@ -78,8 +78,10 @@
|
|
78
78
|
> ~<数字> = 一時的な変数
|
79
79
|
> $<数字> = 一時的ではない変数
|
80
80
|
|
81
|
-
「ローカル変数」「一時的な変数」「一時的ではない変数」
|
81
|
+
「ローカル変数」「一時的な変数」「一時的ではない変数」はどのような変数のことなのでしょうか?
|
82
82
|
|
83
|
+
推測ですが、「ローカル変数」は、関数内に記述した変数のことで、「一時的な変数」は静的変数のことなのかなという感じですが、「一時的ではない変数」については皆目検討もつきません。
|
84
|
+
|
83
85
|
#質問2 029DCEDCの意味は?
|
84
86
|
|
85
87
|
オペコードのoperandsに `%00%7Bclosure%7DC%3A%5Cxampp%5Chtdocs%5Cfunc1.php029DCEDC` とあります。
|