मैं कुछ संकलित स्क्रिप्ट (.pyc) को फिर से लिखने के लिए 'dis' मॉड्यूल का उपयोग कर रहा हूं। मैं JUMP_FORWARD और JUMP_ABSOLUTE के बीच अंतर को समझता हूं। मेरी जानकारी के लिए एक अगर बयान एक JUMP_FORWARD द्वारा बंद कर दिया जाएगा:JUMP_FORWARD या JUMP_ABSOLUTE? पाइथन 2.5
>>> def f():
if a:
print ''
>>> from dis import dis
>>> dis(f)
2 0 LOAD_GLOBAL 0 (a)
3 JUMP_IF_FALSE 9 (to 15)
6 POP_TOP
3 7 LOAD_CONST 1 ('')
10 PRINT_ITEM
11 PRINT_NEWLINE
12 JUMP_FORWARD 1 (to 16)
>> 15 POP_TOP
>> 16 LOAD_CONST 0 (None)
19 RETURN_VALUE
और अगर अगर बयान एक और पाश के अंत में है JUMP_ABSOLUTE दिखाई देगा। उदाहरण के लिए:
if a<100 and b>10:
ok=1
:
121 228 LOAD_FAST 11 (a)
231 LOAD_CONST 9 (100)
234 COMPARE_OP 0 (<)
237 JUMP_IF_FALSE 23 (to 263)
240 POP_TOP
241 LOAD_FAST 11 (b)
244 LOAD_CONST 11 (10)
247 COMPARE_OP 4 (>)
250 JUMP_IF_FALSE 10 (to 263)
253 POP_TOP
122 254 LOAD_CONST 3 (1)
257 STORE_FAST 4 (ok)
260 JUMP_ABSOLUTE 27
>> 263 POP_TOP
मैं कोड लगता होगा निम्नलिखित है:
>>> def f1():
if a:
if b:
print ''
>>> dis(f1)
2 0 LOAD_GLOBAL 0 (a)
3 JUMP_IF_FALSE 20 (to 26)
6 POP_TOP
3 7 LOAD_GLOBAL 1 (b)
10 JUMP_IF_FALSE 9 (to 22)
13 POP_TOP
4 14 LOAD_CONST 1 ('')
17 PRINT_ITEM
18 PRINT_NEWLINE
19 JUMP_ABSOLUTE 27
>> 22 POP_TOP
23 JUMP_FORWARD 1 (to 27)
>> 26 POP_TOP
>> 27 LOAD_CONST 0 (None)
30 RETURN_VALUE
Bytecode मैं वापस कोड लिखने के लिए पढ़ रहा हूँ से, वहाँ एक JUMP_ABSOLUTE है कि मुझे आश्चर्य है
लेकिन यह एक JUMP_FORWARD को उत्तेजित करता है, न कि JUMP_ABSOLUTE। मुझे पता है कि यह एक WHILE लूप नहीं है, न ही एक फोर स्टेटमेंट क्योंकि वे दोनों बाइटकोड में एक SETUP_LOOP लाइन बनाते हैं।
मेरा सवाल है: मुझे क्या याद आ रही है? मैं ABSOLUTE कूद के बजाय एक फॉरवर्ड क्यों प्राप्त करूं?
संपादित करें: एक (? जबकि) पाश की शुरुआत है, जिसमें इन दो पंक्तियों 121 और 122 से संबंधित 27 अंक सूचकांक करने के लिए पूर्ण कूद:
106 24 SETUP_LOOP 297 (to 324)
>> 27 LOAD_FAST 4 (ok)
30 LOAD_CONST 1 (0)
33 COMPARE_OP 2 (==)
36 JUMP_IF_FALSE 283 (to 322)
39 POP_TOP
वहाँ से पहले और एक अन्य एक अगर बयान है इन लाइनों के बाद एक। पहले कोड है, उसी JUMP_ABSOLUTE कथन को बंद कर रहा है।
115 170 LOAD_FAST 3 (q)
173 LOAD_CONST 10 (1)
176 COMPARE_OP 0 (<)
179 JUMP_IF_FALSE 45 (to 227)
182 POP_TOP
183 LOAD_FAST 11 (z)
186 LOAD_CONST 11 (10)
189 COMPARE_OP 4 (>)
192 JUMP_IF_FALSE 32 (to 227)
195 POP_TOP
116 196 LOAD_CONST 1 (0)
199 STORE_FAST 4 (ok)
117 202 LOAD_FAST 5 (u)
205 LOAD_CONST 3 (1)
208 BINARY_ADD
209 STORE_FAST 5 (u)
118 212 LOAD_CONST 1 (0)
215 STORE_FAST 3 (k)
119 218 LOAD_CONST 3 (10)
221 STORE_FAST 6 (dv)
224 JUMP_ABSOLUTE 27
>> 227 POP_TOP
JUMP_FORWARD कहते हैं और JUMP_ABSOLUTE "अगली पंक्ति में जाना" "जबकि पाश की शुरुआत में वापस जाने के" कहते हैं। समस्या यह है कि मुझे नहीं पता कि कोड को दोहराना कैसे है जो उपरोक्त के समान बाइटकोड देगा।
धन्यवाद!
था अपने ' .pyc' पाइथन के उसी संस्करण के साथ बनाया गया है जैसा कि आप अभी उपयोग कर रहे हैं? वह संस्करण कौन सा है? –
मुझे पूरा यकीन है कि इसे पायथन 2.5 के साथ बनाया गया था, वही मैं अभी उपयोग कर रहा हूं।मैंने जादू संख्या की जांच की। – Alex
आपने बताया कि आप जानते हैं कि यह एक लूप नहीं है। लेकिन JUMP_ABSOLUTE 27 इंगित करता है कि कूद आपको कोड में काफी लंबा रास्ता ले रहा है। क्या आपने यह सुनिश्चित करने के लिए कि वास्तव में यह लूप नहीं है, यह देखने के लिए इंडेक्स 27 के साथ ओपोड के रूप में आप वास्तव में वापस क्या देख रहे थे? पूरी तस्वीर देने के लिए अधिक डिस्सेम्बल कोड शामिल करना फायदेमंद हो सकता है, विशेष रूप से ताकि यह देखना संभव हो कि कूद कहाँ जाती है। –