4

実装に対してネイティブのphp関数を実行するだけで、より深くphpの内部を理解しようとしています。

しかし、すべてのオペコード ダンプで、次の 2 つのオペコードが表示されます。

EXT_NOP : http://php.net/manual/tr/internals2.opcodes.ext-nop.php

EXT_STMT: http://php.net/manual/tr/internals2.opcodes.ext-stmt.php

docs にあるように、詳細な説明はありません。

ドキュメントで指定された次の例でも、私のダンプはドキュメントの仕様とは異なります。なぜこれらの2つのスタンドがすべてのダンプにあるのか本当に知りたいですか? それらの機能は何ですか?

<?php
/*
 * no operation
 * opcode number: 0
 */
function A(){}; 
?>

環境仕様:

LXC
Linux web 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt11-1+deb8u5 (2015-10-09) x86_64 GNU/Linux  
PHP 5.6.15-1~dotdeb+7.1 (cli) (built: Nov  3 2015 16:29:58) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
    with Xdebug v2.3.3, Copyright (c) 2002-2015, by Derick Rethans

OpCode ダンプ:

➜  php -d vld.active=1 -d vld.execute=0 -f nop.php
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = -2
filename:       /root/web/www/optest/nop.php
function name:  (null)
number of ops:  5
compiled vars:  none
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   2     0  E >   EXT_STMT                                                 
         1        NOP                                                      
         2        NOP                                                      
   4     3        EXT_STMT                                                 
         4      > RETURN                                                   1

branch: #  0; line:     2-    4; sop:     0; eop:     4; out1:  -2
path #1: 0, 
Function a:
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = -2
filename:       /root/web/www/optest/nop.php
function name:  A
number of ops:  3
compiled vars:  none
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   2     0  E >   EXT_NOP                                                  
         1        EXT_STMT                                                 
         2      > RETURN                                                   null

branch: #  0; line:     2-    2; sop:     0; eop:     2; out1:  -2
path #1: 0, 
End of function a
4

1 に答える 1

6

EXT_NOPこれは、以前に行うべきことがあった (つまり、関数宣言) 場合に使用されますが、エンジンは既に内部的にこれを処理しており、元のオペコードを EXT_NOP に置き換えています。NOPは「ノーオペレーション」の略です。NOPは異なる時期に生成されるため、 とは少し異なりEXT_NOPますが、同じことを行います: 何もしません。

EXT_STMTステートメントの間に作成され、デバッガー (Xdebug など) が安全な場所で停止できるようにします。Xdebug は、「ステートメント ハンドラー」 ( https://github.com/derickr/xdebug/blob/master/xdebug.c#L2534 ) を使用して Zend Engine にフックします。Zend エンジンは、EXT_STMTオペコードに遭遇するたびにこのハンドラーを呼び出します。

于 2016-03-16T10:11:16.343 に答える