ホームページ >バックエンド開発 >PHPチュートリアル >PHP の原則のオペコードを理解する_PHP チュートリアル

PHP の原則のオペコードを理解する_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:34:051114ブラウズ

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

記事内で例を挙げてください

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

Echo "Hello World"
$a = 1 + 1;
Echo $ a;
?>

PHP は次の 4 つのステップを経てこのコードを実行します (正確には PHP の言語エンジン Zend のはずです)
コードは以下の通りです:
1.スキャン(Lexing)(スキャン)、PHPコードを言語フラグメント(トークン)に変換します
2.パース(文法解析)、トークンを単純で意味のある表現に変換します
3.コンパイル(コンパイル) )、式を Opocdes にコンパイルします
4.実行 (コンパイル結果の実行)、Opcode を 1 つずつ順番に実行することで、PHP スクリプトの機能を実現します。


その中で、彼は次のようにも述べました:「現在、APC などの一部のキャッシュは、PHP キャッシュのオペコードを作成できます。この方法では、リクエストが来るたびに、最初の 3 つの手順を繰り返す必要がなく、大幅に改善できます「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] => エコー
)
[2] => (
[0] => 370
[1] =>
)
[3] => 配列
(
[0] => 315
[1] => 「Hello World」
)
[4] =>
[5] => 配列
(
[0] => 370
[1] =>
)
[6] =>
; [0] => 370
[1] =>
)
[8] => 配列
(
[0] => 305
[1] => 1
)
[9 ] => ; 配列
(
[0] => 370
[1] =>
)
[10] => +
[11] => 配列
(
[0] => 370
[1 ] =>
)
[12] => 配列
[0] => 305
[1] => 1
)
[14] = >
(
[0] => 370
[1] =>
)
[15] => 配列
(
[0] => 316
[1] => エコー
)
[16 ] => 配列
(
[0] => 370
[1] =>
)
[17] => 各ソースコード内の文字は、対応する順序でそのまま返されます。ただし、タグ、演算子、ステートメントなどの他の項目は、トークン ID (つまり、T_ECHO、T_STRING など、Zend 内のトークンを変更するための対応するコード) と元のコードの 2 つの部分を含む配列に変換されます。ソースコード。
次のステップは解析段階です。解析では、まずトークン配列内の余分なスペースが破棄され、次に残りのトークンが 1 つずつ単純な式に変換されます



コードをコピーします

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

1. 定数文字列をエコーする
2. 2 つの数値を加算する
3. 前の式の結果を変数に保存する
4. 変数をエコーする
次に、トークンを個別の op_array にコンパイルするコンパイル ステージを変更します。各 op_arrayd には次の 5 つの部分が含まれます:
コードをコピー

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


1. オペコード番号の識別は、add、echo などの各 op_array の操作タイプを示します
2。ストレージ オペコードの結果
3. オペコードのオペランド 1
4. オペランド 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)。これは、変数テーブルの 0 の番号を表します。変数

IS_VAR は、$ で始まる変数です。

IS_CV は、ZE2.1/PHP5.1 以降のコンパイラによって使用されるキャッシュ メカニズムを表します。変数が初めて参照される場合、この変数に対するその後の参照では、アクティブなシンボル テーブルを再度検索する必要はありません。始まりはそれを示しています。

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


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

追加:
apc、zend optimize は、オペコードをキャッシュできるため、PHP を高速化できます
これは、zend エンジン自体に付属する機能ではありません
zend エンジンデフォルト 転生ではどのアイテムも経由する必要があります。

http://www.bkjia.com/PHPjc/322487.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/322487.html技術記事 Opcondes は、Java のバイト コードや .NET の MSL と同様に、PHP スクリプトからコンパイルされた中間言語です。 (全然理解できなかった〜) 記事の例を引用してコードをコピーしてみましょう。 コードは次のとおりです。 ?php echo "Hel...
"
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。