オペコードはコンピューター命令の一部であり、実行される操作を指定するために使用されます。命令の形式と仕様はプロセッサーの命令仕様によって指定されます。 。 命令自体に加えて、通常は命令に必要なオペランドがあります。一部の命令は明示的なオペランドを必要としない場合があります。 これらのオペランドは、レジスタ内の値、スタック内の値、特定のメモリ内の値、または IO ポート内の値などです。
通常、オペコードにはバイトコードという別の名前があります。 たとえば、Java Virtual Machine (JVM)、.NET の共通中間言語 (CIL: Common Intermediate Language) などです。
1. オペコードの紹介
オペコードは、実行される操作を指定するために使用されるコンピューター命令の一部であり、命令の形式と仕様はプロセッサーの命令仕様によって指定されます。 命令自体に加えて、通常は命令に必要なオペランドがあります。一部の命令は明示的なオペランドを必要としない場合があります。 これらのオペランドは、レジスタ内の値、スタック内の値、特定のメモリ内の値、または IO ポート内の値などです。
通常、オペコードにはバイトコードという別の名前があります。 例えば、Java仮想マシン(JVM)や.NETの共通中間言語(CIL:Common Intermediate Language)などです
PHP のオペコードは、前の紹介の後半に属します。PHP は Zend 仮想マシン (Zend VM) 上に構築されます。 PHP のオペコードは、Zend 仮想マシン内の命令です (Zend の中間コードに基づく)
関連リンク:
http://www.luocong.com/learningopcode/doc/1._%E4%BB%80%E4%B9%88%E6%98%AFOpCode%EF%BC%9F.htm
2. PHP のオペコード
0x1: データ構造
PHP実装内では、オペコードは次の構造で表されます
php-5.6.17Zendzend_compile.h
リーリー CPU 命令と同様に、命令を示すオペコード フィールドがあり、このオペコードによって操作されるオペランドはアセンブリほど低レベルではなく、スクリプトが実際に実行される場合には、extended_value が必要になる場合があります。フィールドはこの種の情報を取得し、結果フィールドは命令の実行後に結果を保存します
たとえば、次のコードは、コンパイラーが print ステートメントを検出したときにコンパイルされる関数です
php-5.6.17Zendzend_compile.c
リーリー0x2: オペコードタイプ: zend_op->zend_uchar オペコード
アセンブリ言語の概念と比較すると、各オペコードは opcpde の「操作命令」を示すタイプに対応しており、zend_uchar は実際には unsigned char の番号です。 op. は、さまざまな op タイプを区別するために使用され、opcode の可能な値はマクロとして定義されます
/Zend/zend_vm_opcodes.h
0x3: オペコード実行ハンドル: zend_op->handler
opの実行ハンドル、そのタイプはopcode_handler_tです
typedef int (ZEND_FASTCALL *opcode_handler_t) (ZEND_OPCODE_HANDLER_ARGS);
この関数ポインタは、op の実行メソッドを定義します。たとえば、$a = 1 の場合、そのコードによって生成される op はオペランド const と cv を持ち、最終的にハンドラーを決定できます。 ZEND_ASSIGN_SPEC_CV_CONST_HANDLER
になります。
/Zend/zend_vm_execute.h リーリー
0x4: opcpde オペランド znode
php-5.6.17Zendzend_compile.h
リーリー
0x5: オペコードコンパイル後の配列 op_array
リーリー
php-5.6.17Zendzend_compile.h リーリー
PHP スクリプト コード全体のコンパイルされたオペコードはここに保存され、実行中に次の実行関数によって実行されます
リーリー
。
1. CALL: PHP はデフォルトで CALL を使用します。これは関数呼び出しのメソッドです
2. SWITCH: オペコードの実行はすべての PHP プログラムで頻繁に必要な操作であるため、SWITCH または GOTO を使用して分散できます
3. GOTO: 通常、GOTO の効率は比較的高いですが、効率が向上するかどうかは CPU によって異なります
実際、/zend/zend_ language_parser.c には Zend のオペコードの変換と解釈の実行プロセスがあり、これには 3 つのオペコード実行メソッド (call、switch、goto
) が含まれていることがわかります。
3. opcode翻译执行(即时解释执行) Relevant Link: 以上所述本文给大家介绍的PHP内核学习教程之php opcode内核实现的相关知识,希望对大家有所帮助。
http://www.nowamagic.net/librarys/veda/detail/1325
http://php.net/manual/zh/internals2.opcodes.list.php
http://www.nowamagic.net/librarys/veda/detail/1543
http://www.nowamagic.net/librarys/veda/detail/1324
http://www.nowamagic.net/librarys/veda/detail/1543
http://www.laruence.com/2008/06/18/221.html
http://www.php-internals.com/book/?p=chapt02/02-03-02-opcode
http://www.php-internals.com/book/?p=chapt02/02-03-03-from-opcode-to-handler
您可能感兴趣的文章: