मैं इस तथ्य को समझ सकता हूं कि जावा को एक संकलक और एक दुभाषिया दोनों की आवश्यकता है।
यह नहीं है जावा लैंग्वेज स्पेसिफिकेशन में ऐसा कुछ नहीं है जो कहता हो कि जावा को कंपाइलर की जरूरत है। जावा लैंग्वेज स्पेसिफिकेशन में कुछ भी नहीं है जो कहता है कि जावा को एक दुभाषिया होना चाहिए।
चाहे दुभाषिया, एक संकलक, या दो के संयोजन का उपयोग करना है, पूरी तरह से कार्यान्वयनकर्ता के विवेक पर छोड़ दिया गया है।
वास्तव में, जावा के कार्यान्वयन हैं जो सीधे मशीन कोड के लिए संकलित करते हैं, उदाहरण के लिए जावा के लिए जीएनयू कंपाइलर gcj
। तकनीकी रूप से, ओरेकल ओपनजेडके जावा कंपाइलर भी मशीन कोड, विशेष रूप से, जेवीएम बाइट कोड को संकलित करता है। अब, आप कह सकते हैं, एक मिनट रुको, यह मशीन कोड नहीं है! लेकिन, x86 मशीन कोड के लिए सॉफ्टवेयर दुभाषिए हैं, और हार्डवेयर सीपीयू हैं जो जेवीएम बाइट कोड को निष्पादित कर सकते हैं, इसलिए एक "देशी" बनाता है और दूसरा नहीं?
ध्यान दें कि जेवीएम बाइट कोड जावा लैंग्वेज स्पेसिफिकेशन के बाहर बैठता है, ठीक वैसे ही जैसे कि x86 मशीन कोड करता है।
और फिर एक वर्चुअल मशीन (विंडोज पर, लिनक्स पर, एंड्रॉइड पर, आदि) अनुवाद करता है कि वर्तमान वास्तुकला के लिए मशीन कोड को बाईटेकोड।
फिर, यह पूरी तरह से कार्यान्वयनकर्ता तक है।
मूल सूर्य JVM का अनुवाद कभी नहीं हुआ, इसकी हमेशा व्याख्या हुई। वर्तमान ओरेकल OpenJDK JVM व्याख्या करता है, और केवल उन हिस्सों को जो अक्सर निष्पादित होते हैं, संकलित किए जाते हैं। मैक्सिन रिसर्च वीएम हमेशा जेआईटी का संकलन करता है। एक्सेलसियर। जेट कार्यान्वयन समय से पहले एक बार संकलित करता है। IKVM.NET JVM CIL बाइट कोड के लिए संकलित है। एंड्रॉइड रनटाइम, इंस्टॉलेशन के दौरान, एक बार, समय-समय पर संकलित करता है। (इसके अलावा, एंड्रॉइड रनटाइम JVM बाइट कोड को नहीं समझता है, यह Dalvik बाइट कोड का उपयोग करता है, जो पूरी तरह से अलग भाषा है।)
लेकिन पायथन को एक संकलक और एक दुभाषिया दोनों की आवश्यकता क्यों है?
फिर, यह नहीं है। पायथन लैंग्वेज स्पेसिफिकेशन में ऐसा कुछ नहीं है जो कहता हो कि पायथन को एक कंपाइलर की जरूरत है। पायथन लैंग्वेज स्पेसिफिकेशन में भी ऐसा कुछ नहीं है जो कहता हो कि पायथन को एक दुभाषिया को बंद करने की आवश्यकता है।
ध्यान दें कि वास्तव में, पायथन की व्याख्या कभी नहीं की गई है। सभी मौजूदा पायथन कार्यान्वयन हमेशा पायथन को एक अलग भाषा में संकलित करते हैं। यह भाषा बदले में हो या न हो, व्याख्या हो सकती है, लेकिन वह भाषा अजगर से अलग भाषा है। अजगर की व्याख्या नहीं मिलती है।
सिर्फ व्याख्या का उपयोग क्यों नहीं?
क्योंकि पायथन को मशीनों द्वारा आसानी से व्याख्या करने के लिए डिज़ाइन नहीं किया गया है। यह मनुष्यों द्वारा आसानी से व्याख्या करने के लिए डिज़ाइन किया गया है। OTOH, CPython बाइट कोड, को मशीनों द्वारा आसानी से व्याख्या करने के लिए डिज़ाइन किया गया है। तो, यह मनुष्यों के लिए डिज़ाइन की गई भाषा में कोड लिखने और मशीनों के लिए डिज़ाइन की गई भाषा में व्याख्या करने के लिए समझ में आता है , और क्रम में एक से दूसरे को प्राप्त करने के लिए, आपको संकलन करना होगा।
जहाँ तक मुझे पता है, आप बिना किसी संशोधन के किसी भी विंडोज या लिनक्स मशीन पर पायथन प्रोग्राम (बायटेकोड पर संकलित) को निष्पादित नहीं कर सकते।
हाँ तुम कर सकते हो। CPython VM, Windows और Linux दोनों के लिए उपलब्ध है, जैसा कि PyPy, Jython और IronPython है।
भाषाओं को संकलित या व्याख्या करने की आवश्यकता नहीं है। भाषाएं सिर्फ हैं । वास्तव में, एक भाषा पूरी तरह से किसी भी दुभाषिया या संकलक के बिना मौजूद हो सकती है ! उदाहरण के लिए, कोनराड ज़ूस का प्लैंकल्कल जिसे उन्होंने 1930 के दशक में डिज़ाइन किया था, अपने जीवनकाल के दौरान कभी लागू नहीं किया गया था। आप अभी भी इसमें प्रोग्राम लिख सकते हैं, आप उन कार्यक्रमों का विश्लेषण कर सकते हैं, उनके बारे में कारण, उनके बारे में गुण साबित कर सकते हैं ... आप उन्हें निष्पादित नहीं कर सकते। (ठीक है, वास्तव में, यहां तक कि गलत है: आप निश्चित रूप से उन्हें अपने सिर में या कलम और कागज के साथ चला सकते हैं।)
अब, किसी भाषा का कोई विशेष कार्यान्वयन एक संकलक (या यहां तक कि कई संकलक), एक दुभाषिया, या किसी भी संयोजन का उपयोग कर सकता है। लेकिन यह कार्यान्वयन का एक गुण है , भाषा का नहीं। हर भाषा को एक संकलक के साथ लागू किया जा सकता है, और हर भाषा को दुभाषिए के साथ लागू किया जा सकता है।
हालाँकि, ध्यान दें, कि आप एक दुभाषिया के बिना कोई कार्यक्रम नहीं चला सकते। एक कंपाइलर एक प्रोग्राम को एक भाषा से दूसरी भाषा में ट्रांसलेट करता है। लेकिन इतना ही। अब आपके पास एक ही कार्यक्रम है, बस एक अलग भाषा में। वास्तव में कार्यक्रम का परिणाम प्राप्त करने का एकमात्र तरीका इसकी व्याख्या करना है। कभी-कभी, भाषा एक अत्यंत सरल बाइनरी मशीन भाषा है, और दुभाषिया वास्तव में सिलिकॉन में हार्डकोड किया गया है (और हम इसे "सीपीयू" कहते हैं), लेकिन यह अभी भी व्याख्या है।
आप मेरे इस उत्तर के बारे में भी रुचि ले सकते हैं , जो व्याख्याकारों, जेआईटी संकलक और एओटी संकलक के संयोजन के अंतर और विभिन्न साधनों के बारे में बताता है और यह उत्तर एक AOT संकलक और एक JIT संकलक के बीच के मतभेदों से निपटता है ।