ホームページ  >  記事  >  バックエンド開発  >  PHP カーネル学習チュートリアル: PHP オペコード カーネル実装、カーネル opcode_PHP チュートリアル

PHP カーネル学習チュートリアル: PHP オペコード カーネル実装、カーネル opcode_PHP チュートリアル

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

PHP カーネル学習チュートリアル: PHP オペコード カーネル実装、カーネル オペコード

オペコードはコンピューター命令の一部であり、実行される操作を指定するために使用されます。命令の形式と仕様はプロセッサーの命令仕様によって指定されます。 。 命令自体に加えて、通常は命令に必要なオペランドがあります。一部の命令は明示的なオペランドを必要としない場合があります。 これらのオペランドは、レジスタ内の値、スタック内の値、特定のメモリ内の値、または 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

オペランドフィールドは _zend_op 型の重要な部分であり、そのうち 3 つのオペランド op1、op2、および result は znode 型として定義されます


php-5.6.17Zendzend_compile.h
リーリー

0x5: オペコードコンパイル後の配列 op_array

zend_do_print 関数の最初の行で、次のコード行に注目してください


リーリー


PHPスクリプトコードのコンパイル後に生成されたオペコードはop_arrayに格納され、その内部格納構造は以下の通りです

php-5.6.17Zendzend_compile.h リーリー

PHP スクリプト コード全体のコンパイルされたオペコードはここに保存され、実行中に次の実行関数によって実行されます


リーリー

各オペコードには opcode_handler_t の関数ポインター フィールドがあり、これはオペコードを実行するために使用されます。PHP にはオペコードを処理する 3 つの方法があります

1. CALL: PHP はデフォルトで CALL を使用します。これは関数呼び出しのメソッドです

2. SWITCH: オペコードの実行はすべての PHP プログラムで頻繁に必要な操作であるため、SWITCH または GOTO を使用して分散できます
3. GOTO: 通常、GOTO の効率は比較的高いですが、効率が向上するかどうかは CPU によって異なります
実際、/zend/zend_ language_parser.c には Zend のオペコードの変換と解釈の実行プロセスがあり、これには 3 つのオペコード実行メソッド (call、switch、goto
) が含まれていることがわかります。

これが、PHP がインタプリタ型言語と呼ばれる理由の中心的な原則です。PHP が Lex 字句解析を完了した後、文法解析によって生成物が生成されると、即座に解釈して実行するために、call、switch、および goto を通じて zend API を直接呼び出します。


関連リンク:

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 

3. opcode翻译执行(即时解释执行)

Relevant Link:

http://www.php-internals.com/book/?p=chapt02/02-03-03-from-opcode-to-handler

以上所述本文给大家介绍的PHP内核学习教程之php opcode内核实现的相关知识,希望对大家有所帮助。

您可能感兴趣的文章:

  • PHP OPCode缓存 APC详细介绍
  • 理解php原理的opcodes(操作码)
  • 利用PHP扩展vld查看PHP opcode操作步骤
  • 为PHP5.4开启Zend OPCode缓存
  • 如何使用PHP Embed SAPI实现Opcodes查看器

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1096143.htmlTechArticlePHP内核学习教程之php opcode内核实现,内核opcode opcode是计算机指令中的一部分,用于指定要执行的操作, 指令的格式和规范由处理器的指令...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。