我正在尝试理解一个简单代码的操作码.
代码是:
<?PHP $a = TRUE; $b = FALSE; if($a && $b) { echo 'done'; }
上面代码的操作码是:
PHP -dvld.active=1 test.PHP Finding entry points Branch analysis from position: 0 Jump found. Position 1 = 3,Position 2 = 4 Branch analysis from position: 3 Jump found. Position 1 = 5,Position 2 = 7 Branch analysis from position: 5 Jump found. Position 1 = 7 Branch analysis from position: 7 Return found Branch analysis from position: 7 Branch analysis from position: 4 filename: /home/starlays/learning/test.PHP function name: (null) number of ops: 8 compiled vars: !0 = $a,!1 = $b line # * op fetch ext return operands --------------------------------------------------------------------------------- 3 0 > ASSIGN !0,true 5 1 ASSIGN !1,false 7 2 > JMPZ_EX ~2 !0,->4 3 > BOOL ~2 !1 4 > > JMPZ ~2,->7 8 5 > ECHO 'done' 9 6 > JMP ->7 10 7 > > RETURN 1 branch: # 0; line: 3- 7; sop: 0; eop: 2; out1: 3; out2: 4 branch: # 3; line: 7- 7; sop: 3; eop: 3; out1: 4 branch: # 4; line: 7- 7; sop: 4; eop: 4; out1: 5; out2: 7 branch: # 5; line: 8- 9; sop: 5; eop: 6; out1: 7 branch: # 7; line: 10- 10; sop: 7; eop: 7 path #1: 0,3,4,5,7,path #2: 0,path #3: 0,path #4: 0,
我试图了解第7行发生了什么,评估是如何完成的?它在if的表达式中输入了多少个值?它输入3个值,或者输入2个值为$a的值和$b的值,之后是否计算if括号中的表达式?
我已经阅读了JMPZ_EX的手册,我已经理解了操作代码中发生的事情,直到第2步之后有点混乱,我很难理解PHP正在做什么的确切步骤.
我需要理解的另一件事是操作码中的所有分支是什么,最后将使用哪些分支?
除非你精通
ASM,否则我认为理解正在发生的事情的最简单方法是通过在PHP中读取(几乎)1:1表示来查看相同的代码:
if(!$a) goto end; if(!$b) goto end; echo 'done'; end: return 0;
中间表示基于对实际子句的否定,以跳过if块中包含的代码.
如果你想真正理解PHP如何将其输入转换为这个操作码数组,你将不得不学习PHP内部,但在学习the dragon book之前,尤其是关于中间表示的部分,这是编译管道的一部分.
其余的操作码是“背景噪声”,中间值,或甚至一条没有意义的指令9 6>简单存在的JMP – > 7可能是因为没有必要努力使PHP解析器为ZendVM运行最优化的操作码数组.