2013-10-24 15 views
15

मुझे पाइथन के बाइटकोड और इसके dis मॉड्यूल को समझने में बहुत कठिनाई हो रही है।पायथन बाइटकोड कैसे पढ़ा जाए?

0 LOAD_CONST     1(1) 
    3 STORE_FAST     0(x) 
    6 LOAD_CONST     0(NONE) 
    9 RETURN_VALUE 

उदाहरण के लिए::

import dis 
def func(): 
    x = 1 
dis.dis(func) 

ऊपर कोड जब दुभाषिया में टाइप निम्नलिखित उत्पादन का उत्पादन

क्या LOAD_CONST, STORE_FAST का अर्थ और 0 की तरह नंबर, 3 है , 6 और 9?

एक विशिष्ट संसाधन, जहां मुझे यह जानकारी मिल सकती है, उसकी बहुत सराहना की जाएगी।

+0

मुझे यकीन नहीं है कि क्या आप यह जवाब पढ़ते हैं http://stackoverflow.com/a/12673195/973699 – DevC

+0

@DevC मैंने यह प्रश्न पढ़ा, लेकिन समस्या यह थी कि मैं बस एक बहुत ही सरल "फ़ंक्शन" के लिए स्पष्टीकरण चाहता था , जैसा कि मैंने अपने प्रश्न में उल्लेख किया है, ताकि मैं कम से कम बाइट कोड में क्या हो रहा है इसका थोड़ा सा विचार प्राप्त कर सकूं। –

उत्तर

29

bytecodes से पहले नंबर मूल द्विआधारी bytecodes में ऑफसेट हैं:

>>> func.__code__.co_code 
'd\x01\x00}\x00\x00d\x00\x00S' 

कुछ bytecodes में अतिरिक्त जानकारी (तर्क) के साथ आते है कि प्रभावित करती है कि किस प्रकार प्रत्येक बाईटकोड काम करता है, ऑफसेट bytestream में क्या स्थिति में आपको बताता है बाइटकोड मिला था।

LOAD_CONST बाइटकोड (ASCII d, हेक्स 64) इसके बाद बाइटकोड से जुड़े स्थिर के संदर्भ में दो अतिरिक्त बाइट एन्कोडिंग किया जाता है, उदाहरण के लिए। नतीजतन, STORE_FAST ऑपोड (ASCII }, हेक्स 7 डी) इंडेक्स 3.

dis module documentation सूचीबद्ध करता है जो प्रत्येक निर्देश का अर्थ है। LOAD_CONST के लिए, यह कहता है:

स्टैक पर co_consts[consti] धक्का देता है।

जो co_consts संरचना को संदर्भित करता है जो हमेशा कोड ऑब्जेक्ट के साथ मौजूद होता है; संकलक निर्माण करती है कि:

>>> func.__code__.co_consts 
(None, 1) 

कि संरचना (बाईटकोड एनकोड एक 1 में 01 00 बाइट्स), और dis से opcode भार सूचकांक 1 कि ऊपर देखा गया है आप के लिए; यह मान 1 है। स्थानीय co_varnames[var_num] में

स्टोर टीओएस:

अगले निर्देश, STORE_FAST रूप में वर्णित है।

यहां TOS स्टैक के शीर्ष को संदर्भित करता है; ध्यान दें कि LOAD_CONST बस स्टैक पर कुछ धक्का दिया, 1 मान। co_varnames एक और संरचना है; यह स्थानीय चर नाम का संदर्भ है, opcode संदर्भ सूचकांक 0:

>>> func.__code__.co_varnames 
('x',) 

dis भी है कि ऊपर देखा और नाम आप अपने कोड में इस्तेमाल किया x है।इस प्रकार, इस ओपोड ने 1 को x में संग्रहीत किया।

सूचकांक 0 से ढेर, RETURN_VALUE द्वारा पीछा किया पर

एक और LOAD_CONST भार None:

समारोह के फोन करने वाले को टीओएस के साथ रिटर्न।

इसलिए यह निर्देश स्टैक के शीर्ष (None स्थिरांक के साथ) लेता है और इस कोड ब्लॉक से वापस आता है। None स्पष्ट return कथन के बिना फ़ंक्शंस के लिए डिफ़ॉल्ट वापसी मान है।

आप dis उत्पादन, से कुछ लाइन नंबर छोड़े गए:

>>> dis.dis(func) 
    2   0 LOAD_CONST    1 (1) 
       3 STORE_FAST    0 (x) 
       6 LOAD_CONST    0 (None) 
       9 RETURN_VALUE   

नोट पहली पंक्ति पर 2; वह मूल स्रोत में पंक्ति संख्या है जिसमें पाइथन कोड शामिल है जिसका उपयोग इन निर्देशों के लिए किया गया था। पायथन कोड ऑब्जेक्ट्स में co_lnotab और co_firstlineno विशेषताएँ हैं जो आपको मूल स्रोत में लाइन नंबरों पर बाइटकोड को मानचित्रित करने देती हैं। dis एक डिस्सेप्लर प्रदर्शित करते समय यह आपके लिए करता है।

+0

व्यापक उत्तर और दस्तावेज़ों के संदर्भ के लिए धन्यवाद –

संबंधित मुद्दे