2012-07-23 8 views
8

मैं एक साधारण कोड के लिए ओप कोड को समझने की कोशिश कर रहा हूं।एक कथन में PHP ओपी कोड को समझना

कोड है:

<?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, 3, 4, 7, 
path #3: 0, 4, 5, 7, 
path #4: 0, 4, 7, 

मैं समझने के लिए लाइन 7 पर हो रहा है कोशिश कर रहा हूँ, कैसे मूल्यांकन किया जाता है? मूल्यांकन के लिए अभिव्यक्ति में कितने मूल्य दर्ज होते हैं? यह 3 मानों में प्रवेश करता है, या यह 2 मानों को $ ए के मूल्य और $ बी के मूल्य में प्रवेश करता है और बाद में मूल्यांकन किए जाने वाले कोष्ठक से अभिव्यक्ति का मूल्यांकन किया जाता है?

मैंने JMPZ_EX के लिए मैनुअल पढ़ा है, मुझे पता है कि ओप कोड में क्या हो रहा है, इसके बाद चरण 2 तक थोड़ा सा मिश्रित हो गया है और यह समझना मेरे लिए बहुत मुश्किल है कि PHP क्या है करते हुए।

एक और चीज जिसे मुझे समझने की आवश्यकता है, ओप कोड में सभी शाखाएं क्या हैं, जो कि सभी शाखाओं का अंत में उपयोग किया जाएगा?

+0

'&&' एक शॉर्ट-सर्किटिंग ऑपरेटर है। –

+0

@ karolyHorvath जो मुझे पता है, मुझे उन चरणों को समझने की आवश्यकता है जो उपरोक्त ओप कोड से php कर रहे हैं। – Starlays

+0

मैं बस इतना कह रहा हूं कि आपको पहले से ही पता होना चाहिए कि यह कैसे व्यवहार करना चाहिए, इसलिए ... –

उत्तर

2

जब तक आप ASM में कुशल होते हैं, मुझे लगता है कि समझने के लिए सबसे आसान तरीका क्या हो रहा है इसकी (लगभग) 1 पढ़कर एक ही कोड में दिख रही है:

if(!$a) goto end; 
if(!$b) goto end; 
echo 'done'; 
end: return 0; 

मध्यवर्ती प्रतिनिधित्व: PHP में 1 प्रतिनिधित्व if ब्लॉक में निहित कोड पर कूदने के लिए आपके वास्तविक खंडों की अस्वीकृति पर आधारित है।

आप वास्तव में समझने के लिए कैसे पीएचपी इस opcode सरणी के लिए अपने इनपुट बदल देती चाहते हैं, आप PHP internals के बारे में जानने के लिए होगा, लेकिन the dragon book अध्ययन, मध्यवर्ती प्रतिनिधित्व के बारे में विशेष रूप से भागों, जो संकलन पाइपलाइन का हिस्सा है से पहले नहीं ।

बाकी ऑपकोड "पृष्ठभूमि शोर", मध्यवर्ती मूल्य, या यहां तक ​​कि एक निर्देश भी है जो 9 6 > JMP ->7 का कोई अर्थ नहीं है, जो संभवत: अस्तित्व में है क्योंकि PHP पार्सर को थूकने में प्रयास करने के लिए यह समझ में नहीं आया ZendVM के लिए चलाने के लिए सबसे इष्टतम ऑपोडोड सरणी।

2
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 

लाइन नंबर से जा रहे हैं

0 assigns true to !0, !0 is just the internal representation of $A 
1 assigns true to !1, !1 is $B 

JMPZ कोड के लिए कूद करने के लिए यदि मूल्य 0. है इसका मतलब है # मुझे यकीन है कि JMPZ_EX के विशिष्ट अंतर यह लग रहा है यह अनुमति देता है की तरह नहीं कर रहा हूँ एक बुलियन परिणाम की वापसी।

तो:

2 JMPZ_EX, Jump to #4 (->4) if !0 ($A) is 0 (FALSE) and assign the result to ~2 

3 BOOL !1 return ~2. ~2 is now equal to the BOOLean value of !1 ($B) 
4 JMPZ ~2, Jump to #7 if ~2 is zero 

5 ECHO, our echo statement. If any of the JMPZ had jumped, this part would be skipped. 
6 JMP -7, jumps to #7 
7 RETURN, ends the function call 

कुछ नोट:

  • ऐसा लगता है कि JMPZ_EX इस मामले में अनावश्यक है, लेकिन अगर बयान जहां की जरूरत है मान का उपयोग करने और अधिक जटिल में उपयोगी होगा आगे के मूल्यों की गणना।
  • 6 जेएमपी -7 शायद किसी अन्य ब्लॉक की अनुमति देने के लिए वहां है। यदि यह ब्लॉक के मुख्य भाग का था, तो इसे समाप्त करने के बाद कोड के उस भाग पर कूद सकता था जो कि अन्य ब्लॉक था।
संबंधित मुद्दे