この記事では、PHPのOpCodeの原理を例を挙げて説明します。参考のために皆さんと共有してください。詳細は次のとおりです:
OpCode は、Java の ByteCode や .NET の MSL と同様、PHP スクリプトからコンパイルされた中間言語です。 この記事は主に「OPcode の理解」とインターネットに基づいており、個人的な理解と修正に基づいて特別に記録されています。
PHPコード:リーリー
PHP はこのコードを実行するときに次の 4 つのステップを実行します:1. スキャン (レクシング)、PHP コードを言語フラグメント (トークン) に変換します
2. トークンを解析し、シンプルで意味のある表現に変換します
3. コンパイル、式を Opocdes にコンパイルします
4. 実行。オペコードを一度に 1 つずつ順番に実行し、PHP スクリプトの機能を実現します。
まず、Zend/zend_ language_scanner.c は、Zend/zend_ language_scanner.l (Lex ファイル) に基づいて入力された PHP コードの字句解析を実行し、「単語」を 1 つずつ取得します。PHP4.2 以降では、 token_get_all と呼ばれる関数が提供されます。関数は PHP コードの一部をスキャンしてトークンに変換できます。 リーリー
次の結果が得られます:
リーリー返された結果、ソースコード内の文字列、文字、スペースは変更されずに返されます。各ソース コード内の文字は、対応する順序で表示されます。ただし、タグ、演算子、ステートメントなどの他の項目は、トークン ID (つまり、T_ECHO、T_STRING など、Zend 内のトークンを変更するための対応するコード) と元のコードの 2 つの部分を含む配列に変換されます。ソースコード。
次のステップは解析段階です。解析では、まずトークン配列内の余分なスペースが破棄され、次に残りのトークンが 1 つずつ単純な式に変換されます。
1. 定数文字列をエコーする2. 2 つの数字を足し合わせます
3. 前の式の結果を変数に保存します
4. 変数をエコーする
次に、トークンを 1 つずつ op_array にコンパイルするコンパイル ステージを変更します。
各 op_arrayd には次の 5 つの部分が含まれます。
2. 結果にはオペコードの結果が保存されます
3. Operand 1 は Opcode のオペランドです
4. オペランド 2
5. 拡張値はオーバーロードされた演算子を区別するための整数です
たとえば、PHP コードは次のように解析されます:
リーリー
a) op_type: IS_CONST、IS_TMP_VAR、IS_VAR、IS_UNUSED、または IS_CV
b) u、共用体は、このオペランドの値 (const) または左辺値 (var) を、op_type に応じて異なる型で格納します
var に関しては、それぞれの var が異なります。 IS_TMP_VAR は、名前が示すように、次の op_array で使用するために op_array の結果を保存する一時変数です。このタイプのオペランドの u は、通常、変数テーブルを指すハンドル (整数) を格納します。 used~ 先頭 (~0 など) は、変数テーブルの 0 番にある未知の一時変数 IS_VAR を表します。これは、ZE2.1 以降のコンパイラで使用される型を表す、IS_CV を表す $ で始まる変数です。 /PHP5.1 のキャッシュ メカニズムでは、この変数は、変数が初めて参照されるときに、アクティブなシンボル テーブルを参照する必要がありません。 CV 変数は ! で始まるものとして表されます。
$a 変数は !0 に最適化されます。
さらに PHP 関連のコンテンツに興味のある読者は、このサイトの特別トピックをチェックしてください: 「PHP 数学的演算スキルの概要」、「PHP 操作オフィス文書スキルの概要 (word、excel、access、ppt を含む)」、 『PHP配列(配列)』操作スキル完全集』、『PHPソートアルゴリズムまとめ』、『PHP共通トラバーサルアルゴリズムとテクニックまとめ』、『PHPデータ構造とアルゴリズムチュートリアル』、『PHPプログラミングアルゴリズムまとめ』、 「PHP 正規表現の使用法の概要」、「PHP の操作と演算子の使用法の概要」、「PHP 文字列の使用法の概要」、および「PHP の共通データベース操作スキルの概要」
この記事が PHP プログラミングのすべての人に役立つことを願っています。 http://www.bkjia.com/PHPjc/1133037.html