質問するログイン新規登録

質問編集履歴

9

訂正

2016/11/10 04:36

投稿

7968
7968

スコア253

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

追記

2016/11/10 04:36

投稿

7968
7968

スコア253

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

調査メモの追記

2016/11/10 04:24

投稿

7968
7968

スコア253

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

調査メモの追記

2016/11/10 04:11

投稿

7968
7968

スコア253

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

調査メモの追記

2016/11/09 12:39

投稿

7968
7968

スコア253

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

訂正

2016/11/09 12:22

投稿

7968
7968

スコア253

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

訂正

2016/11/08 04:03

投稿

7968
7968

スコア253

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 029DCEDCの意味は?
85
+ #質問2029DCEDCの意味は?
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 * と ext の意味は?
92
+ #質問3* と ext の意味は?
93
93
 
94
94
  vldでオペコードダンプすると、番号の左側に * が表示されます。
95
95
  この * はどのような意味でしょうか?
96
96
 
97
97
  ダンプした列に ext という項目がありますが、これはどのような意味でしょうか?
98
98
 
99
- #質問4 two-pass compiler
99
+ #質問4two-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 two-pass compiler
114
+ ###【質問4-1two-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 PHP5とPHP7での違いは?
122
+ ###【質問4-2PHP5とPHP7での違いは?
123
123
 
124
124
  図示した通り、PHP5とPHP7ではオペコードの作成方法が異なるかと存じます。
125
125
  PHP5はパーサーが two-pass で、PHP7からはオペコードコンパイラが two-pass なのでしょうか?

2

訂正

2016/11/08 04:01

投稿

7968
7968

スコア253

title CHANGED
File without changes
body CHANGED
@@ -111,7 +111,7 @@
111
111
  図示した通り、PHP5とPHP7ではオペコードの作成方法が異なるかと存じます。
112
112
  ここから質問です。
113
113
 
114
- ##質問3-1 two-pass compiler
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
- ##質問3-2 PHP5とPHP7での違いは?
122
+ ##質問4-2 PHP5とPHP7での違いは?
123
123
 
124
124
  図示した通り、PHP5とPHP7ではオペコードの作成方法が異なるかと存じます。
125
125
  PHP5はパーサーが two-pass で、PHP7からはオペコードコンパイラが two-pass なのでしょうか?

1

訂正

2016/11/08 03:57

投稿

7968
7968

スコア253

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` とあります。