ホームページ  >  記事  >  バックエンド開発  >  PHP の OpCode 原理の深い理解、opcode_PHP チュートリアルの深い理解

PHP の OpCode 原理の深い理解、opcode_PHP チュートリアルの深い理解

WBOY
WBOYオリジナル
2016-07-12 08:50:561029ブラウズ

PHPのOpCodeの原理を深く理解する、オペコードを深く理解する

この記事では、PHPのOpCodeの原理を例を挙げて説明します。参考のために皆さんと共有してください。詳細は次のとおりです:

OpCode は、Java の ByteCode や .NET の MSL と同様、PHP スクリプトからコンパイルされた中間言語です。 この記事は主に「OPcode の理解」とインターネットに基づいており、個人的な理解と修正に基づいて特別に記録されています。

PHPコード:

リーリー

PHP はこのコードを実行するときに次の 4 つのステップを実行します:

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

2. トークンを解析し、シンプルで意味のある表現に変換します
3. コンパイル、式を Opocdes にコンパイルします
4. 実行。オペコードを一度に 1 つずつ順番に実行し、PHP スクリプトの機能を実現します。

注: APC などの一部の現在のキャッシュでは、PHP がオペコードをキャッシュできるため、リクエストが届くたびに最初の 3 つの手順を繰り返す必要がなく、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 つの部分が含まれます。

1. オペコード番号の識別は、add、echo などの各 op_array の操作タイプを示します

2. 結果にはオペコードの結果が保存されます

3. Operand 1 は Opcode のオペランドです

4. オペランド 2
5. 拡張値はオーバーロードされた演算子を区別するための整数です

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

各オペランドは次の 2 つの部分で構成されます:

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

www.bkjia.com本当http://www.bkjia.com/PHPjc/1133037.html技術記事 PHP の OpCode の原理を詳しく説明し、オペコードを深く理解する この記事では、PHP の OpCode の原理を例を挙げて説明します。参考のために皆さんと共有してください。詳細は次のとおりです: OpCode は PHP スクリプトのコンパイルです...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。