पायथन को एक संकलक और एक दुभाषिया दोनों की आवश्यकता क्यों है?


9

मैं इस तथ्य को समझ सकता हूं कि जावा को एक संकलक और एक दुभाषिया दोनों की आवश्यकता है। यह स्रोत कोड को बायटेकोड और फिर एक वर्चुअल मशीन (विंडोज पर, लिनक्स पर, एंड्रॉइड आदि पर) संकलित करता है, जो वर्तमान वास्तुकला के लिए मशीन कोड के लिए उस बाईटेकोड का अनुवाद करता है।

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


आप गलत हो सकते हैं। यदि पायथन के बजाय लुआ का उपयोग कर रहे हैं, तो आप गलत होंगे।
बेसिल स्टारीनेवविच

जवाबों:


13

जहाँ तक मुझे पता है, आप हर मशीन पर, जैसे कि खिड़कियों पर, या बिना किसी संशोधन के लिनक्स पर पायथन प्रोग्राम (बायटेकोड पर संकलित) को निष्पादित नहीं कर सकते।

आप गलत हैं। अजगर बाइटकोड क्रॉस प्लेटफॉर्म है। देखें अजगर बाईटकोड संस्करण पर निर्भर है? क्या यह प्लेटफॉर्म पर निर्भर है? स्टैक ओवरफ्लो पर। हालाँकि, यह संस्करणों में संगत नहीं है। पायथन 2.6 पायथन 2.5 फ़ाइलों को निष्पादित नहीं कर सकता है। इसलिए क्रॉस-प्लेटफ़ॉर्म करते समय, यह आम तौर पर वितरण प्रारूप के रूप में उपयोगी नहीं होता है।

लेकिन पायथन को एक संकलक और एक दुभाषिया दोनों की आवश्यकता क्यों है?

स्पीड। सख्त व्याख्या धीमी है। वस्तुतः प्रत्येक "व्याख्या की गई" भाषा वास्तव में स्रोत कोड को किसी प्रकार के आंतरिक प्रतिनिधित्व में संकलित करती है ताकि उसे बार-बार कोड को पार्स न करना पड़े। अजगर के मामले में यह इस आंतरिक प्रतिनिधित्व को डिस्क पर सहेजता है ताकि अगली बार कोड की आवश्यकता होने पर यह पार्सिंग / संकलन प्रक्रिया को छोड़ सके।


7

मैं इस तथ्य को समझ सकता हूं कि जावा को एक संकलक और एक दुभाषिया दोनों की आवश्यकता है।

यह नहीं है जावा लैंग्वेज स्पेसिफिकेशन में ऐसा कुछ नहीं है जो कहता हो कि जावा को कंपाइलर की जरूरत है। जावा लैंग्वेज स्पेसिफिकेशन में कुछ भी नहीं है जो कहता है कि जावा को एक दुभाषिया होना चाहिए।

चाहे दुभाषिया, एक संकलक, या दो के संयोजन का उपयोग करना है, पूरी तरह से कार्यान्वयनकर्ता के विवेक पर छोड़ दिया गया है।

वास्तव में, जावा के कार्यान्वयन हैं जो सीधे मशीन कोड के लिए संकलित करते हैं, उदाहरण के लिए जावा के लिए जीएनयू कंपाइलर gcj। तकनीकी रूप से, ओरेकल ओपनजेडके जावा कंपाइलर भी मशीन कोड, विशेष रूप से, जेवीएम बाइट कोड को संकलित करता है। अब, आप कह सकते हैं, एक मिनट रुको, यह मशीन कोड नहीं है! लेकिन, x86 मशीन कोड के लिए सॉफ्टवेयर दुभाषिए हैं, और हार्डवेयर सीपीयू हैं जो जेवीएम बाइट कोड को निष्पादित कर सकते हैं, इसलिए एक "देशी" बनाता है और दूसरा नहीं?

ध्यान दें कि जेवीएम बाइट कोड जावा लैंग्वेज स्पेसिफिकेशन के बाहर बैठता है, ठीक वैसे ही जैसे कि x86 मशीन कोड करता है।

और फिर एक वर्चुअल मशीन (विंडोज पर, लिनक्स पर, एंड्रॉइड पर, आदि) अनुवाद करता है कि वर्तमान वास्तुकला के लिए मशीन कोड को बाईटेकोड।

फिर, यह पूरी तरह से कार्यान्वयनकर्ता तक है।

मूल सूर्य JVM का अनुवाद कभी नहीं हुआ, इसकी हमेशा व्याख्या हुई। वर्तमान ओरेकल OpenJDK JVM व्याख्या करता है, और केवल उन हिस्सों को जो अक्सर निष्पादित होते हैं, संकलित किए जाते हैं। मैक्सिन रिसर्च वीएम हमेशा जेआईटी का संकलन करता है। एक्सेलसियर। जेट कार्यान्वयन समय से पहले एक बार संकलित करता है। IKVM.NET JVM CIL बाइट कोड के लिए संकलित है। एंड्रॉइड रनटाइम, इंस्टॉलेशन के दौरान, एक बार, समय-समय पर संकलित करता है। (इसके अलावा, एंड्रॉइड रनटाइम JVM बाइट कोड को नहीं समझता है, यह Dalvik बाइट कोड का उपयोग करता है, जो पूरी तरह से अलग भाषा है।)

लेकिन पायथन को एक संकलक और एक दुभाषिया दोनों की आवश्यकता क्यों है?

फिर, यह नहीं है। पायथन लैंग्वेज स्पेसिफिकेशन में ऐसा कुछ नहीं है जो कहता हो कि पायथन को एक कंपाइलर की जरूरत है। पायथन लैंग्वेज स्पेसिफिकेशन में भी ऐसा कुछ नहीं है जो कहता हो कि पायथन को एक दुभाषिया को बंद करने की आवश्यकता है।

ध्यान दें कि वास्तव में, पायथन की व्याख्या कभी नहीं की गई है। सभी मौजूदा पायथन कार्यान्वयन हमेशा पायथन को एक अलग भाषा में संकलित करते हैं। यह भाषा बदले में हो या न हो, व्याख्या हो सकती है, लेकिन वह भाषा अजगर से अलग भाषा है। अजगर की व्याख्या नहीं मिलती है।

सिर्फ व्याख्या का उपयोग क्यों नहीं?

क्योंकि पायथन को मशीनों द्वारा आसानी से व्याख्या करने के लिए डिज़ाइन नहीं किया गया है। यह मनुष्यों द्वारा आसानी से व्याख्या करने के लिए डिज़ाइन किया गया है। OTOH, CPython बाइट कोड, को मशीनों द्वारा आसानी से व्याख्या करने के लिए डिज़ाइन किया गया है। तो, यह मनुष्यों के लिए डिज़ाइन की गई भाषा में कोड लिखने और मशीनों के लिए डिज़ाइन की गई भाषा में व्याख्या करने के लिए समझ में आता है , और क्रम में एक से दूसरे को प्राप्त करने के लिए, आपको संकलन करना होगा।

जहाँ तक मुझे पता है, आप बिना किसी संशोधन के किसी भी विंडोज या लिनक्स मशीन पर पायथन प्रोग्राम (बायटेकोड पर संकलित) को निष्पादित नहीं कर सकते।

हाँ तुम कर सकते हो। CPython VM, Windows और Linux दोनों के लिए उपलब्ध है, जैसा कि PyPy, Jython और IronPython है।


भाषाओं को संकलित या व्याख्या करने की आवश्यकता नहीं है। भाषाएं सिर्फ हैं । वास्तव में, एक भाषा पूरी तरह से किसी भी दुभाषिया या संकलक के बिना मौजूद हो सकती है ! उदाहरण के लिए, कोनराड ज़ूस का प्लैंकल्कल जिसे उन्होंने 1930 के दशक में डिज़ाइन किया था, अपने जीवनकाल के दौरान कभी लागू नहीं किया गया था। आप अभी भी इसमें प्रोग्राम लिख सकते हैं, आप उन कार्यक्रमों का विश्लेषण कर सकते हैं, उनके बारे में कारण, उनके बारे में गुण साबित कर सकते हैं ... आप उन्हें निष्पादित नहीं कर सकते। (ठीक है, वास्तव में, यहां तक ​​कि गलत है: आप निश्चित रूप से उन्हें अपने सिर में या कलम और कागज के साथ चला सकते हैं।)

अब, किसी भाषा का कोई विशेष कार्यान्वयन एक संकलक (या यहां तक ​​कि कई संकलक), एक दुभाषिया, या किसी भी संयोजन का उपयोग कर सकता है। लेकिन यह कार्यान्वयन का एक गुण है , भाषा का नहीं। हर भाषा को एक संकलक के साथ लागू किया जा सकता है, और हर भाषा को दुभाषिए के साथ लागू किया जा सकता है।

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

आप मेरे इस उत्तर के बारे में भी रुचि ले सकते हैं , जो व्याख्याकारों, जेआईटी संकलक और एओटी संकलक के संयोजन के अंतर और विभिन्न साधनों के बारे में बताता है और यह उत्तर एक AOT संकलक और एक JIT संकलक के बीच के मतभेदों से निपटता है


3
उन सवालों के जवाब देने के बजाय अपना ज्यादातर समय पांडित्य में बिताने वाले जवाब मुझे दुखी करते हैं।
विंस्टन इर्वर्ट

3

यह सही है कि बाइटकोड एक वितरण प्रारूप के रूप में उपयुक्त नहीं है, लेकिन इसका मतलब यह नहीं है कि यह बेकार है। एक दिए गए मशीन पर स्टार्टअप समय में सुधार करने के अलावा, पहले रन के बाद, एक AST या, भगवान न करे, लाइन-बाय-लाइन की व्याख्या करने की तुलना में बायटेकोड की व्याख्या करना भी अधिक सरल है।

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

ये और अन्य कारक बायटेकोड दुभाषियों को अन्य दुभाषियों की तुलना में काफी तेज बनाने के लिए मानते हैं।

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