ホームページ >php教程 >php手册 >PHP 原則のオペコード (オペレーション コード) を理解する

PHP 原則のオペコード (オペレーション コード) を理解する

WBOY
WBOYオリジナル
2016-06-13 12:13:311508ブラウズ

Opcondes は、Java のバイト コードや .NET の MSL と同様に、PHP スクリプトからコンパイルされた中間言語です。 (理解できませんでした~)

記事の例をあげてください

コードをコピーしてください コードは次のとおりです:


echo "Hello World";
$a = 1 1;


PHP はこのコードを実行します 次の 4 つの手順を経た後 (正確には PHP の言語エンジン Zend のはずです)



コードをコピー コードは次のとおりです。

1.スキャン (字句解析) (スキャン)、PHP コードを言語フラグメント (トークン) に変換します

2. 解析 (文法分析)、トークンを単純で意味のある表現に変換します
3 .Compilation (コンパイル)、式を Opocdes
にコンパイルします。 4.Execution (コンパイル結果を実行)、Opcode を 1 つずつ順番に実行することで、PHP スクリプトの機能を実現します。


その中で、彼は次のようにも述べています:「APC などの一部のキャッシュでは、PHP がオペコードをキャッシュできるようになりました。この方法では、リクエストが来るたびに、以前のキャッシュを繰り返す必要がなくなります。これは、PHP の実行速度を大幅に向上させることができます。これが、PHP の実行速度が速くなる理由の 1 つかもしれません ~


それでは、Lexing とは何ですか? コンパイルの原理を勉強したことのある学生ならよく知っているはずです。コンパイルの原理でレキシコンを使用して分析手順をある程度理解していれば、Lex は字句解析の基礎テーブルになります。 Zend/zend_ language_scanner.c は、Zend/zend_ language_scanner.l (Lex ファイル) に基づいて入力された PHP コードを字句解析し、「単語」を 1 つずつ取得します。PHP4.2 では、token_get_all と呼ばれる関数について説明します。 PHP コードの一部をスキャンしてトークンに変換します。
この関数を使用して最初に説明した PHP コードを処理すると、次の結果が得られます:


コードをコピー コードは次のとおりです:

配列

(
[0] => 配列
(
[0] => 367
[1] => 配列
(
[0] => 316
[1] => echo
)
[2] => 配列
( <🎜; >[0] = > 370
[1] =>
)
[3] => 配列
(
[0] => 315
[1] = > " Hello World"
)
[4] =>
[5] => 配列
(
[0] => ; =>
)
[6] => =
[7] => 配列
(
[0] => 370
[1] => )
[8] => 配列
(
[0] => 305
[1] => 1
)
[9] => 配列
(
[0] => 370
[1] =>
)
[10] => 🎜>[0] => 370
[1] => 1] => ; 1
)
[13] => ;
[14] => 配列
(
[0] => 370
[1] =>
)
[15] => ] => 配列
(
[0] => 370
[1] =>
)
[17] => ;
)


この戻り結果を分析すると、ソース コード内の文字列、文字、スペースが変更されずに返されることがわかります。各ソース コード内の文字は、対応する順序で表示されます。ただし、タグ、演算子、ステートメントなどの他の項目は、トークン ID (つまり、T_ECHO、T_STRING など、Zend 内のトークンを変更するための対応するコード) と元のコードの 2 つの部分を含む配列に変換されます。ソースコード。
次に、解析段階になります。解析では、まずトークン配列内の余分なスペースが破棄され、次に残りのトークンが 1 つずつ単純な式に変換されます。



コードをコピーします。 🎜>
コードは次のとおりです。


1. 定数文字列をエコーし​​ます
2. 2 つの数値を加算します
3. 前の式の結果を変数に保存します
4.変数


次に、トークンを 1 つずつ op_array にコンパイルします。



コードをコピー

コードは次のとおりです: 1. オペコード番号の識別は、add、echo 2. 結果にはオペコードの結果が格納されます 3. オペコード

のオペランド 1 オペランド 2

5. オーバーロードされた演算子を区別するために使用される拡張値 1 の整数

たとえば、PHP コードは次のように解析されます:


コードをコピー

コードは次のとおりです:

* ZEND_ECHO 'Hello World ' * ZEND_ADD ~0 1 1 * ZEND_ASSIGN !0 ~0

* ZEND_ECHO !0



ははは、私たちの $a はどこに行ったのかと疑問に思うかもしれません。

これはオペランドについてです。各オペランドは次の 2 つの部分で構成されます。

a)op_type: IS_CONST、IS_TMP_VAR、IS_VAR、IS_UNUSED、または IS_CVb) u、共用体、 op_type に応じて、オペランドの値 (const) または lvalue (var) を異なる型で格納します。var の場合、各 var は異なります。

IS_TMP_VAR は、名前が示すように、一部の値を保存する一時変数です。次の op_array で使用する op_array の結果。このタイプのオペランドの u には、変数テーブルを指すハンドル (整数) が格納されます。~0 などの先頭は、不明な一時変数を表します。変数テーブル

IS_VAR の 0 番。これらは一般的な意味での変数であり、$ で始まり、

IS_CV は PHP5 以降のコンパイラーで使用される ZE2.1 キャッシュ メカニズムを表します。 .1. この変数には、変数が初めて参照されるとき、その変数は CVd され、アクティブなシンボル テーブルを再度参照する必要がなくなります。 、CV変数に!始まりはそれを示しています。

$a は !0 に最適化されているようです。
概要:


1.php の実行順序は次のとおりです: -> php プログラム
--> スキャン (スキャンとトークン (言語フラグメント) への変換)
-> 解析 (文法解析、トークンを単純で意味のある式に変換)
-> コンパイル (コンパイル、式を Opocdes (オペレーション コード) にコンパイル)
-> 実行 (逐次実行) 2. APC (Alternative PHP Cache) のキャッシュ メカニズムにより、次回リクエストが来たときに、前の 3 つの手順を繰り返す必要がなく、PHP の実行速度が大幅に向上します。 。 これが、PHP の実行速度が速くなる理由の 1 つである可能性があります


補足:
apc、zend 最適化は、オペコードをキャッシュできるため、PHP
を高速化できます
は、zend エンジン自体の組み込み関数ではありません
zend エンジンは、転生のすべてのアイテムにデフォルトで設定されます。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。