पायथन रनटाइम वास्तव में कैसे काम करता है?


26

मुझे कुछ समस्याओं को समझने की समस्या है runtime library, विशेष रूप से अजगर एक। इसलिए मैंने कुछ हैलो वर्ल्ड पायथन प्रोग्राम लिखा है और इसे निष्पादित करने का इरादा है, इसलिए मैं लिखता हूं python ./hello_world.py

एंटर बटन पर क्लिक करने और मेरे अजगर कोड से उत्पन्न मशीन कोड मेरे सीपीयू पर निष्पादित होने के बीच क्या कदम उठाता है? और यह पायथन रनटाइम सिस्टम और / या लाइब्रेरी से कैसे संबंधित है?


ये दो सूत्र पायथन रनटाइम पर एक महान अंतर्दृष्टि देते हैं - क्या पायथन की व्याख्या की गई है, या संकलित की गई है, या दोनों? और Is अजगर (जावास्क्रिप्ट या PHP) की तरह व्याख्या की? । रनटाइम और रनटाइम लाइब्रेरी समान नहीं हैं । इसे .NET दुनिया को मैप करना मुझे पता है - कॉमन लैंग्वेज रनटाइम (CLR) और फ्रेमवर्क / बेस क्लास लाइब्रेरी (FCL / BCL) समान नहीं हैं
RBT

जवाबों:


33

जितने विविधतापूर्ण हैं, उतने ही सामान्य अवधारणाएं हैं, जो सभी गंभीर, आधुनिक प्रोग्रामिंग भाषाएं साझा करती हैं। उनमें से दो आपके सवालों के जवाब के मूल हैं।

एंटर बटन पर क्लिक करने और मेरे अजगर कोड से उत्पन्न मशीन कोड मेरे सीपीयू पर निष्पादित होने के बीच क्या कदम उठाता है?

कोड पार्स किया जाता है, विश्लेषण किया जाता है, और दुभाषिया में खिलाया जाता है। यह सब कंप्यूटर विज्ञान के एक बहुत ही महत्वपूर्ण क्षेत्र के बारे में है जिसे संकलक सिद्धांत के रूप में जाना जाता है । एक कंपाइलर एक प्रोग्राम है जो एक भाषा (आपके स्रोत कोड) से दूसरी भाषा में कोड का अनुवाद करता है (आमतौर पर मशीन कोड, हालांकि "ट्रांसपाइलर" जो एक उच्च-स्तरीय भाषा से दूसरे में मौजूद होता है)। यह एक बहुत बड़ा विषय है जिस पर आप वर्षों तक शोध कर सकते हैं, लेकिन यहाँ इसका मूल संस्करण है:

कंपाइलर एक पार्सर के साथ शुरू होता है , एक दिनचर्या जो आपके स्रोत कोड को पढ़ती है और भाषा के वाक्यविन्यास नियमों को लागू करती है यह पता लगाने के लिए कि क्या यह वैध पायथन (आपके मामले में) कोड के रूप में समझ में आता है। यदि ऐसा नहीं होता है, तो पार्सर एक त्रुटि को फेंक देगा और संकलक बाहर हो जाता है, लेकिन अगर ऐसा होता है, तो पार्सर आउटपुट सार संक्षेप ट्री या एएसटी के रूप में जाना जाता है। एएसटी एक पेड़ डेटा संरचना है, जिसके प्रत्येक नोड में सिंटैक्स का एक तत्व होता है। उदाहरण के लिए, यदि आप कहते हैं, तो आप एक मान के साथ , एक मान और के मान के x = 5साथ समाप्त कर सकते हैं । आपके पूरे कार्यक्रम को इस तरह से एक बड़े पेड़ द्वारा दर्शाया जा सकता है।BinaryExpressionoperator=LeftReferenceExpression(x)RightIntegerLiteralExpression(5)

एक बार पार्सर एक एएसटी का उत्पादन करता है, दूसरा चरण सिमेंटिक विश्लेषण है । सादे अंग्रेजी में, इसका अर्थ है "यह पता लगाना कि यह एएसटी का अर्थ क्या है।" यह एएसटी को यह निर्धारित करने के लिए जांचता है कि क्या आपने ऐसा कुछ भी किया है जो एक वैध पार्स होने के बावजूद अवैध है, (उदाहरण के लिए, 3 तर्कों के साथ 1-तर्क फ़ंक्शन को कॉल करने की कोशिश कर रहा है), और यदि आप करते हैं तो त्रुटियों को उठाता है। अन्यथा, यह एएसटी का विश्लेषण करता है और एक मशीन को समझने के लिए इसे सरल बनाने के लिए इसे संपादित करता है।

तीसरा चरण कोड जनरेशन है। एक बार जब आपके पास पूरी तरह से विश्लेषण, सरलीकृत, वैध एएसटी होता है, तो आप इसे जनरेटर में खिलाते हैं, जो एएसटी चलता है और आउटपुट भाषा में कोड का उत्पादन करता है। यह आपका तैयार उत्पाद है।

पायथन के साथ, यह संकलक के बजाय एक दुभाषिया का उपयोग करता है। एक दुभाषिया एक कंपाइलर के समान काम करता है, एक अंतर के साथ: कोड पीढ़ी के बजाय, यह आउटपुट को इन-मेमोरी में लोड करता है और इसे सीधे आपके सिस्टम पर निष्पादित करता है। (यह कैसे होता है, इसके सटीक विवरण अलग-अलग भाषाओं और अलग-अलग व्याख्याकारों के बीच बेतहाशा भिन्न हो सकते हैं।)

और यह पायथन रनटाइम सिस्टम और / या लाइब्रेरी से कैसे संबंधित है?

सभी लेकिन बहुत सरल भाषाएं पूर्वनिर्धारित कार्यों के एक सेट के साथ आती हैं जो उपयोगकर्ताओं के एक बड़े प्रतिशत के लिए महत्वपूर्ण हैं और उपयोगकर्ताओं के लिए एक या किसी अन्य के लिए अपने दम पर लागू करना मुश्किल होगा। उनके कोड को किसी भी तीसरे पक्ष के पुस्तकालयों की आवश्यकता के बिना इन कार्यों में कॉल कर सकते हैं। (उदाहरण के लिए, आपके पास पायथन में print, जो आउटपुट भेजता है stdout। सौभाग्य को लागू करने के लिए अपने दम पर!) कार्यों का यह सेट आम तौर पर एक साझा पुस्तकालय में एकत्र किया जाता है जिसे कोड रन-टाइम में कॉल कर सकता है, यही कारण है कि यह ज्ञात है भाषा रनटाइम लाइब्रेरी के रूप में, या संक्षेप में "रनटाइम" के रूप में।


तो मेरा कोड किसी अन्य प्रोग्राम (पायथन रनटाइम सिस्टम) को खिलाया जाता है जो मेरे कोड के समाप्त होने पर (और क्लीनअप के बाद) बिल्कुल समाप्त हो जाता है?
hgiesel

@ हेजल का मानना ​​है कि पायथन के मामले में, दुभाषिया रनटाइम का हिस्सा है। यह हर भाषा का मामला नहीं है। बेशक, लेकिन यह व्याख्या की गई भाषाओं में काफी आम है।
मेसन व्हीलर

5

मानक पायथन कार्यान्वयन बाइट कोड वर्चुअल मशीन है। इसका मतलब यह है कि मशीन कोड (आपके प्रोसेसर के ओपकोड सेट से ऑपकोड) आपके प्रोग्राम से उत्पन्न नहीं होता है। Opcodes को केवल उन opcodes से चुना जाता है जो पहले से ही वर्चुअल मशीन में संकलित हैं जबकि VM बाइट कोड की व्याख्या करता है।

आपके कार्यक्रम को पहली जगह में बाइट कोड में कैसे बदल दिया जाता है, यह थोड़ा अलग सवाल है, लेकिन संक्षिप्त जवाब "संकलन के माध्यम से, किसी भी अन्य नीचे की भाषा के अनुवाद की तरह" है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.