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

回答編集履歴

8

修正

2016/11/22 04:08

投稿

7968
7968

スコア253

answer CHANGED
@@ -1,5 +1,4 @@
1
- **【調査メモ】**
2
- **teratailの質問は、上限が10000文字で追記できないので、他の調査メモは回答追記します。 **
1
+ **調査メモの続き:teratailの質問は、上限が10000文字で質問には追記できないので回答追記します。**
3
2
 
4
3
  #【追記1】
5
4
 

7

修正

2016/11/22 04:08

投稿

7968
7968

スコア253

answer CHANGED
@@ -3,8 +3,6 @@
3
3
 
4
4
  #【追記1】
5
5
 
6
- #### 「ローカル変数」「一時的な変数」「一時的ではない変数」の違いは?
7
-
8
6
  様々な変数をダンプしてみました。
9
7
 
10
8
  ```

6

読みにくいので少し修正

2016/11/22 04:04

投稿

7968
7968

スコア253

answer CHANGED
@@ -1,8 +1,8 @@
1
- #追記】調査メモ
1
+ **【調査メモ】**
2
+ **※teratailの質問は、上限が10000文字で追記できないので、他の調査メモは回答へ追記します。 **
2
3
 
3
- ** ※teratailの質問は、上限が10000文字で追記できないので、他の調査メモは回答へ追記します。 **
4
+ #【追記1】
4
5
 
5
-
6
6
  #### 「ローカル変数」「一時的な変数」「一時的ではない変数」の違いは?
7
7
 
8
8
  様々な変数をダンプしてみました。
@@ -87,7 +87,7 @@
87
87
  次に `new Gamma` を処理しているようですが、先ほどの `:7` の返り値を指定することで、`$8`というローカル変数的な何かが返ってくるようです。
88
88
  何と形容すればよいのかわかりませんが、`:` はクラスを取得するときに返ってくる"何か"のようです。
89
89
 
90
- ## さらに追記
90
+ #追記2】
91
91
 
92
92
  `! $ ~` について参考になるものを見つけたので、追記します。
93
93
 
@@ -117,7 +117,7 @@
117
117
  |`~`|Temporary variable|ZendEngine内で利用される変数|
118
118
  |`$`|Variable|通常の変数|
119
119
 
120
- ### 少し追記
120
+ #追記3】
121
121
 
122
122
  [別の質問](https://teratail.com/questions/55152)で変数値や即値に対応するzvalやHashTableはオペコード作成時またはオペコード実行時に作成されると教えて頂きました。
123
123
 

5

少し追記

2016/11/22 04:03

投稿

7968
7968

スコア253

answer CHANGED
@@ -115,4 +115,10 @@
115
115
  |:--|:--|:--|
116
116
  |`!`|Compiled variable|ハッシュ化された変数|
117
117
  |`~`|Temporary variable|ZendEngine内で利用される変数|
118
- |`$`|Variable|通常の変数|
118
+ |`$`|Variable|通常の変数|
119
+
120
+ ### 少し追記
121
+
122
+ [別の質問](https://teratail.com/questions/55152)で変数値や即値に対応するzvalやHashTableはオペコード作成時またはオペコード実行時に作成されると教えて頂きました。
123
+
124
+ 何の根拠もありませんが、オペコード作成時に確定できる変数が `ハッシュ化された変数` ではないかと考えております。例えば、`$a = 1`というのはオペコード作成時に確定できるため、`!0`となっているのかと思います。オペコード実行時にしか確定できないのは、計算結果などです。`$a + $b`のような計算結果は`~2`となっています。オペコード実行時に計算され、そのときに確定するので、このような変数が `ZendEngine内で利用される変数` ではないかと思います。他に `普通の変数` というのがありますが、いまいちわかっておりません。以上、憶測というか妄想です。

4

変更

2016/11/18 07:34

投稿

7968
7968

スコア253

answer CHANGED
@@ -87,10 +87,8 @@
87
87
  次に `new Gamma` を処理しているようですが、先ほどの `:7` の返り値を指定することで、`$8`というローカル変数的な何かが返ってくるようです。
88
88
  何と形容すればよいのかわかりませんが、`:` はクラスを取得するときに返ってくる"何か"のようです。
89
89
 
90
- ---
90
+ ## さらに追記
91
91
 
92
- ### さらに追記
93
-
94
92
  `! $ ~` について参考になるものを見つけたので、追記します。
95
93
 
96
94
  OpenOfficeのファイルですが、[phpopcodes_aug2008](https://wiki.php.net/_media/phpopcodes_aug2008.odp) にVLDに関しての記述があります。下記が引用です。

3

追記

2016/11/10 08:34

投稿

7968
7968

スコア253

answer CHANGED
@@ -89,7 +89,7 @@
89
89
 
90
90
  ---
91
91
 
92
- ### 追記
92
+ ### さらに追記
93
93
 
94
94
  `! $ ~` について参考になるものを見つけたので、追記します。
95
95
 
@@ -111,7 +111,7 @@
111
111
  > これなんなのかというと、通常のPHPの変数と同じものなんですが、$hogeみたいなPHPの変数はZendEngineのハッシュテーブルの中で管理されているのですが、ハッシュテーブルなので当然格納するときは変数名がハッシュ化されます。Compiled Variableとは、実行時に変数名をハッシュ化してオーバーヘッドにならないようにコンパイル時に予めハッシュ化されるPHPの変数ということがコードを読んでわかりました。
112
112
  > 確かにPHPの変数名は実行時にならないとわからない場合もありますが、$hogeみたいなコードの場合はコンパイル時に変数名もわかっているわけなので予め変数名をハッシュ化しておいたほうがオーバーヘッドが少ないということなんでしょう。
113
113
 
114
- まとめると下記のような感じかなと思います。(自信なし)
114
+ まとめると下記のような感じかなと思います。(自信なし^^;
115
115
 
116
116
  |記号|用語|意味|
117
117
  |:--|:--|:--|

2

追記

2016/11/10 08:27

投稿

7968
7968

スコア253

answer CHANGED
@@ -85,4 +85,36 @@
85
85
  オペコード上ではインスタンスを作成するのにいくつか手順を踏むみたいです。
86
86
  まず、`11 FETCH_CLASS` で `Gamma` というクラスを取得し、 `:7` を返しています。
87
87
  次に `new Gamma` を処理しているようですが、先ほどの `:7` の返り値を指定することで、`$8`というローカル変数的な何かが返ってくるようです。
88
- 何と形容すればよいのかわかりませんが、`:` はクラスを取得するときに返ってくる"何か"のようです。
88
+ 何と形容すればよいのかわかりませんが、`:` はクラスを取得するときに返ってくる"何か"のようです。
89
+
90
+ ---
91
+
92
+ ### 追記
93
+
94
+ `! $ ~` について参考になるものを見つけたので、追記します。
95
+
96
+ OpenOfficeのファイルですが、[phpopcodes_aug2008](https://wiki.php.net/_media/phpopcodes_aug2008.odp) にVLDに関しての記述があります。下記が引用です。
97
+
98
+ > ! == compiler variable
99
+ $ == variable
100
+ ~ == temporary
101
+
102
+ この3つについて [第三回闇PHP勉強会開催した&PHPカンファレンスとPHPMatsuriで喋った](http://blog.anatoo.jp/entry/20121124/1353692635) に説明がありました。下記が引用です。
103
+
104
+ > ZendEngine内部で使われる変数の種類には以下の3つがあります。
105
+ >
106
+ > Variable 通常のPHPの変数
107
+ > Temporary variable ZendEngineないで利用される変数
108
+ > Compiled variable ?
109
+ >
110
+ > このうち、最初のVariableはPHPの$hogeみたいな通常の変数のことで、その次のTemporary VariableはZendEngine内部でのみ利用されるレジスタのような変数ということがわかっていたのですが、三番目のCompiled Variableというのが何のことがよくわかっていませんでした。
111
+ > これなんなのかというと、通常のPHPの変数と同じものなんですが、$hogeみたいなPHPの変数はZendEngineのハッシュテーブルの中で管理されているのですが、ハッシュテーブルなので当然格納するときは変数名がハッシュ化されます。Compiled Variableとは、実行時に変数名をハッシュ化してオーバーヘッドにならないようにコンパイル時に予めハッシュ化されるPHPの変数ということがコードを読んでわかりました。
112
+ > 確かにPHPの変数名は実行時にならないとわからない場合もありますが、$hogeみたいなコードの場合はコンパイル時に変数名もわかっているわけなので予め変数名をハッシュ化しておいたほうがオーバーヘッドが少ないということなんでしょう。
113
+
114
+ まとめると下記のような感じかなと思います。(自信なし)
115
+
116
+ |記号|用語|意味|
117
+ |:--|:--|:--|
118
+ |`!`|Compiled variable|ハッシュ化された変数|
119
+ |`~`|Temporary variable|ZendEngine内で利用される変数|
120
+ |`$`|Variable|通常の変数|

1

訂正

2016/11/10 08:26

投稿

7968
7968

スコア253

answer CHANGED
@@ -77,9 +77,9 @@
77
77
 
78
78
  |記号|意味|
79
79
  |:--|:--|
80
- |`!`|グローバル変数|
80
+ |`!`|グローバル変数|
81
- |`~`|計算結果(一時的な変数と呼んでいいのかな?)|
81
+ |`~`|計算結果(一時的な変数と呼んでいいのかな?)|
82
- |`$`|ローカル変数|
82
+ |`$`|ローカル変数|
83
83
 
84
84
  様々な変数をダンプしたら、新たに `:` という記号が出てきました
85
85
  オペコード上ではインスタンスを作成するのにいくつか手順を踏むみたいです。