जावा "वर्चुअल मशीन" बनाम पायथन "दुभाषिया" समानता?


207

ऐसा लगता है कि पायथन "वर्चुअल मशीन" को पढ़ना दुर्लभ है, जबकि जावा में "वर्चुअल मशीन" का उपयोग हर समय किया जाता है।

दोनों बाइट कोड की व्याख्या करते हैं; क्यों एक आभासी मशीन और दूसरे एक दुभाषिया कहते हैं?

जवाबों:


137

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

दूसरी तरफ एक दुभाषिया अधिक परिष्कृत है कि यह कुछ वाक्यविन्यास की एक धारा को पार्स करने के लिए है जो एक विशिष्ट भाषा का है और एक विशिष्ट ग्रामर का है जिसे आसपास के टोकन के संदर्भ में डिकोड किया जाना चाहिए। आप प्रत्येक बाइट या यहां तक ​​कि प्रत्येक पंक्ति को अलगाव में नहीं देख सकते हैं और जानते हैं कि आगे क्या करना है। भाषा में टोकन को अलगाव में नहीं लिया जा सकता है जैसे वे एक वीएम के निर्देशों (बाइट कोड) के सापेक्ष हो सकते हैं।

जावा कंपाइलर जावा भाषा को बाइट-कोड स्ट्रीम में परिवर्तित करता है, सी कंपाइलर से अलग कोई नहीं, सी लैंग्वेज प्रोग्राम को असेंबली कोड में कनवर्ट करता है। दूसरी ओर एक दुभाषिया वास्तव में कार्यक्रम को किसी अच्छी तरह से परिभाषित मध्यवर्ती रूप में परिवर्तित नहीं करता है, यह सिर्फ कार्यक्रम की कार्रवाई को स्रोत की व्याख्या करने की प्रक्रिया के रूप में लेता है।

एक वीएम और एक दुभाषिया के बीच अंतर का एक और परीक्षण यह है कि क्या आप इसे भाषा स्वतंत्र मानते हैं। जिसे हम जावा वीएम के रूप में जानते हैं, वह वास्तव में जावा विशिष्ट नहीं है। आप अन्य भाषाओं से एक कंपाइलर बना सकते हैं जो कि बाइट कोड के परिणामस्वरूप होता है जो कि JVM पर चलाया जा सकता है। दूसरी ओर, मुझे नहीं लगता कि हम पायथन दुभाषिया द्वारा व्याख्या के लिए अजगर के अलावा कुछ अन्य भाषा "संकलन" के बारे में सोचेंगे।

व्याख्या प्रक्रिया के परिष्कार के कारण, यह एक अपेक्षाकृत धीमी प्रक्रिया हो सकती है .... विशेष रूप से भाषा टोकन आदि की पार्सिंग और पहचान करना और स्रोत के संदर्भ को समझना, दुभाषिया के भीतर निष्पादन प्रक्रिया को करने में सक्षम होना। ऐसी व्याख्या की गई भाषाओं में तेजी लाने में मदद करने के लिए, यह वह जगह है जहां हम पूर्व-पार्स, पूर्व-टोकन स्रोत कोड के मध्यवर्ती रूपों को परिभाषित कर सकते हैं जो अधिक आसानी से सीधे व्याख्या की जाती है। इस तरह के बाइनरी फॉर्म को अभी भी निष्पादन समय पर व्याख्या की जाती है, यह प्रदर्शन को बेहतर बनाने के लिए बहुत कम मानव पठनीय रूप से शुरू हो रहा है। हालाँकि, उस फ़ॉर्म को निष्पादित करने वाला तर्क एक आभासी मशीन नहीं है, क्योंकि उन कोड को अभी भी अलगाव में नहीं लिया जा सकता है - आसपास के टोकन का संदर्भ अभी भी मायने रखता है, वे अभी एक अलग कंप्यूटर कुशल रूप में हैं।


7
मैं इस धारणा के तहत था कि अजगर ने बाइट कोड, pyc उत्पन्न किया है, या यह है कि आप किसका उल्लेख कर रहे हैं "ऐसी व्याख्या की गई भाषाओं में तेजी लाने में मदद करें, यह वह जगह है जहां हम पूर्व-पार्स, पूर्व-टोकन स्रोत कोड के मध्यवर्ती रूपों को परिभाषित कर सकते हैं जो अधिक है आसानी से सीधे व्याख्या की। "
जेम्स मैकमोहन

32
@InSciTek जेफ: आपके जवाब से यह स्पष्ट नहीं है कि क्या आप जानते हैं कि पायथन एक आभासी मशीन का भी उपयोग करता है।
tzot

3
@ टीजेड - लोकप्रिय पायथन कार्यान्वयन एक पायथन संकलक है जिसमें पीछे की तरफ वीएम है। इंटरेक्टिव मोड में, यह एक दुभाषिया फ्रंट एंड और कम्पाइलर बैक एंड दोनों के साथ हाइब्रिड का एक सा है। हालांकि वे कार्यान्वयन विकल्प हैं। मैंने वीएम और इंटरप्रेटर की अवधारणा के बीच अंतर का वर्णन करने का प्रयास किया
टाल जेफ

8
On the other hand, I don't think we would really think of "compiling" some other language other than Python into Python for interpretation by the Python interpreter.एक भाषा लिखना संभव है जिसे पाइथन बाइटेकोड में संकलित किया जा सकता है, जैसे स्कैला को जावा बाइटकोड में संकलित किया जाता है। इंटरैक्टिव मोड में, पायथन का इंटरेक्टिव शेल आपके टाइप किए गए कमांड को बायटेकोड में संकलित करता है और उस बायोटेक को निष्पादित करता है। आप eval और exec का उपयोग करके अपना स्वयं का शेल लिख सकते हैं, और आप एक स्ट्रिंग को बायटेकोड में बदलने के लिए संकलन () अंतर्निहित फ़ंक्शन का उपयोग कर सकते हैं।
रेयान

4
@ ली रयान हाँ, लेकिन यह आधिकारिक तौर पर समर्थित नहीं है जैसे कि यह जेवीएम के साथ है। पायथन में, बायटेकोड एक अनैजेंटेड इम्प्लीमेंटेशन डिटेल है।
एंटिमोनी

159

इस पोस्ट में, "वर्चुअल मशीन" वर्चुअल मशीनों को प्रोसेस करने के लिए संदर्भित करता है, न कि वर्चुअल मशीनों जैसे किमू या वर्चुअलबॉक्स को सिस्टम करने के लिए। एक प्रक्रिया वर्चुअल मशीन केवल एक प्रोग्राम है जो एक सामान्य प्रोग्रामिंग वातावरण प्रदान करता है - एक प्रोग्राम जिसे प्रोग्राम किया जा सकता है।

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

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

पोर्टेबल की व्याख्या सांख्यिकीय रूप से टाइप की गई भाषा में की जाती है

अगली निकटतम चीज़ एलएलवीएम है, लेकिन एलएलवीएम एक अलग स्तर पर संचालित होता है:

पोर्टेबल व्याख्या की गई विधानसभा भाषा

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

  • llvm: सीपीयू रजिस्टर
  • जावा: आदिम डेटा प्रकार
  • पायथन: उपयोगकर्ता-परिभाषित प्रकार

एक वास्तविक दुनिया सादृश्य बनाने के लिए: एलएलवीएम परमाणुओं के साथ काम करता है, जावा वर्चुअल मशीन अणुओं के साथ काम करती है, और पायथन वर्चुअल मशीन सामग्री के साथ काम करती है। चूँकि सब कुछ अंततः सूक्ष्म कणों (वास्तविक मशीन संचालन) में विघटित होना चाहिए, पाइथन वर्चुअल मशीन का सबसे जटिल कार्य है।

सांख्यिकीय रूप से टाइप की जाने वाली भाषाओं के इंटेपेटर्स / कंपाइलर के पास वैसा ही सामान नहीं होता है जो डायनामिक-टाइप की गई भाषाओं के दुभाषियों / कंपाइलरों के पास होता है। सांख्यिकीय रूप से टाइप की जाने वाली भाषाओं के प्रोग्रामर को सुस्त होना पड़ता है, जिसके लिए भुगतान प्रदर्शन है। हालाँकि, जिस तरह सभी nondeterministic फ़ंक्शंस गुप्त रूप से नियतात्मक होते हैं, उसी तरह सभी गतिशील रूप से टाइप की जाने वाली भाषाएँ गुप्त रूप से टाइप की जाती हैं। दो भाषा परिवारों के बीच प्रदर्शन का अंतर इसलिए होना चाहिए कि जब पायथन ने अपना नाम बदलकर एचएएल 9000 कर लिया था।

पायथन जैसी गतिशील भाषाओं की आभासी मशीनें कुछ आदर्शित तार्किक मशीन को कार्यान्वित करती हैं, और जरूरी नहीं कि यह किसी वास्तविक भौतिक हार्डवेयर के बहुत निकट हो। जावा वर्चुअल मशीन, इसके विपरीत, शास्त्रीय सी कंपाइलर की कार्यक्षमता में अधिक समान है, सिवाय इसके कि मशीन निर्देशों का उत्सर्जन करने के बजाय, यह अंतर्निहित दिनचर्या को निष्पादित करता है। पायथन में, पूर्णांक एक पायथन ऑब्जेक्ट होता है, जिसमें विशेषताओं और विधियों का एक गुच्छा संलग्न होता है। जावा में, एक इंट बिट्स की एक निर्दिष्ट संख्या है, आमतौर पर 32. यह वास्तव में उचित तुलना नहीं है। पायथन पूर्णांकों की वास्तव में जावा इंटेगर वर्ग से तुलना की जानी चाहिए। जावा के "int" आदिम डेटा प्रकार की तुलना पायथन भाषा में किसी भी चीज से नहीं की जा सकती है, क्योंकि पायथन भाषा में केवल प्राथमिकताओं की इस परत का अभाव है, और इसलिए पायथन बायटेकोड करता है।

क्योंकि जावा चर स्पष्ट रूप से लिखे जाते हैं, एक यथोचित की तरह कुछ उम्मीद कर सकते हैं Jython प्रदर्शन के रूप में ही बॉलपार्क में होने की CPython । दूसरी ओर, पायथन में कार्यान्वित एक जावा वर्चुअल मशीन कीचड़ की तुलना में धीमी होने की गारंटी है। और रूबी, पर्ल, इत्यादि से किसी भी बेहतर किराया की उम्मीद न करें। वे ऐसा करने के लिए डिज़ाइन नहीं किए गए थे। उन्हें "स्क्रिप्टिंग" के लिए डिज़ाइन किया गया था, जिसे एक गतिशील भाषा में प्रोग्रामिंग कहा जाता है।

वर्चुअल मशीन में होने वाले हर ऑपरेशन को अंततः वास्तविक हार्डवेयर को हिट करना पड़ता है। आभासी मशीनों में पूर्व-संकलित दिनचर्या होती है जो तार्किक संचालन के किसी भी संयोजन को निष्पादित करने के लिए सामान्य रूप से पर्याप्त हैं। एक वर्चुअल मशीन नए मशीन निर्देशों को उत्सर्जित नहीं कर सकती है, लेकिन यह निश्चित रूप से शानदार तरीके से जटिल दृश्यों में अपनी खुद की दिनचर्या को निष्पादित कर रही है। जावा वर्चुअल मशीन, पायथन वर्चुअल मशीन, और अन्य सभी सामान्य प्रयोजन वाली वर्चुअल मशीनें इस मायने में बराबर हैं कि उन्हें किसी भी तर्क को पूरा करने के लिए मनाना जा सकता है जिसे आप सपना देख सकते हैं, लेकिन वे किन कार्यों के संदर्भ में अलग हैं प्रोग्रामर पर जाने के लिए वे कौन से कार्य करते हैं और क्या करते हैं।

पायथन के लिए साइको पूरी तरह से पाइथन वर्चुअल मशीन नहीं है, लेकिन एक बस-इन-टाइम कंपाइलर जो नियमित पायथन वर्चुअल मशीन को पॉइंट पर हाईजैक करता है, वह सोचता है कि यह कोड की कुछ पंक्तियों को संकलित कर सकता है - मुख्य रूप से लूप जहां सोचता है कि कुछ का आदिम प्रकार यदि चर प्रत्येक पुनरावृत्ति के साथ बदल रहा है तो भी चर स्थिर रहेगा। उस मामले में, यह नियमित वर्चुअल मशीन के निरंतर प्रकार के निर्धारण में से कुछ को पीछे छोड़ सकता है। आपको थोड़ा सावधान रहना होगा, हालांकि, ऐसा न हो कि आप Psyco के पैरों के नीचे से टाइप को खींच लें। Pysco, हालांकि, आमतौर पर नियमित वर्चुअल मशीन पर वापस गिरना जानता है यदि यह पूरी तरह से आश्वस्त नहीं है कि प्रकार नहीं बदलेगा।

कहानी का नैतिक यह है कि आदिम डेटा प्रकार की जानकारी वास्तव में एक कंपाइलर / वर्चुअल मशीन के लिए सहायक है।

अंत में, इसे सभी परिप्रेक्ष्य में रखने के लिए इस पर विचार करें: जावा में कार्यान्वित जावा इंटरप्रेटर / वर्चुअल मशीन पर चलने वाले जावा में कार्यान्वित पायथन इंटरप्रेटर / वर्चुअल मशीन द्वारा निष्पादित पायथन प्रोग्राम, एक आईफ़ोन पर चलने वाली एक क्यूमू वर्चुअल मशीन में चल रहा है।

स्थायी लिंक


1
trying to write any statically-typed code interactively would be tedious। आप OCaml और हास्केल पता है आपको लगता है कि सच नहीं है, क्योंकि वे हैं कि देखेंगे बहुत संक्षिप्त स्थिर टाइप भाषाओं।
मथायस ब्रौन

@MatthiasBraun मैं सहमत हो सकता हूं कि वे कार्यात्मक भाषा संक्षिप्त कोड का उत्पादन करती हैं लेकिन इसका मतलब यह नहीं है कि वे इंटरैक्टिव मोड के लिए अच्छी तरह से अनुकूल हैं। यदि OCaml और Haskell को लिस्प की तरह गतिशील रूप से टाइप किया गया था, तो वे इंटरेक्टिव मोड के लिए बेहतर काम करेंगे।
बम

58

संभवतः विभिन्न शब्दावली का एक कारण यह है कि आमतौर पर अजगर इंटरप्रेटर कच्चे मानव-पठनीय स्रोत कोड को खिलाने के बारे में सोचता है और बाइटकोड और उस सब के बारे में चिंता नहीं करता है।

Java में, आपको स्पष्ट रूप से bytecode को संकलित करना होगा और फिर VM पर स्रोत कोड नहीं, बल्कि केवल bytecode को चलाना होगा।

हालांकि पाइथन कवर के तहत एक आभासी मशीन का उपयोग करता है, उपयोगकर्ता के दृष्टिकोण से, अधिकांश समय इस विवरण को अनदेखा कर सकता है।


1
मैं सहमत हूँ। शब्दावली में यह अंतर वास्तव में एंड-यूज़र (डेवलपर, जो कि) का अनुभव है। इसका वास्तविक तकनीकी अंतर से कोई लेना-देना नहीं है, क्योंकि तकनीकी लाइन इतनी अविश्वसनीय रूप से धुंधली है कि लानत-पास कोई भी नहीं है।
कोड़ी ब्रोचेस

1
+1: और - अधिक महत्वपूर्ण बात - क्या बात है? इस भेद के कारण आप क्या कार्यक्रम नहीं लिख सकते हैं? क्या स्टैक ट्रेसबैक आपको भ्रमित कर रहा है? क्या पुस्तकालय सही ढंग से काम नहीं करता है?
एस.लॉट

@ S.Lott क्योंकि सहयोगियों के साथ तर्क जीतना हमेशा अच्छा होता है। ;)
Qix - मोनासा ने

16

दुभाषिया , स्रोत कोड को कुछ कुशल मध्यवर्ती प्रतिनिधित्व (कोड) में तब्दील करता है और तुरंत इस पर अमल करता है।

वर्चुअल मशीन , एक संकलक द्वारा निर्मित संग्रहीत पूर्व-संकलित कोड को स्पष्ट रूप से निष्पादित करता है जो दुभाषिया प्रणाली का हिस्सा है।

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

अजगर के मामले में, अगर हम इस पोस्ट की टिप्पणी में उल्लिखित pyc फाइलें रख रहे हैं , तो तंत्र एक VM की तरह अधिक हो जाएगा, और यह bytecode तेजी से निष्पादित करता है - यह अभी भी व्याख्या किया जाएगा लेकिन एक बहुत कंप्यूटर मित्र के रूप में । अगर हम इसे समग्र रूप से देखें, तो PVM पायथन इंटरप्रेटर का एक अंतिम चरण है।

लब्बोलुआब यह है कि, जब पायथन इंटरप्रेटर का संदर्भ होता है, तो इसका मतलब है कि हम इसे संपूर्ण रूप में संदर्भित कर रहे हैं, और जब हम पीवीएम कहते हैं, तो इसका मतलब है कि हम सिर्फ पायथन इंटरप्रेटर के एक भाग के बारे में बात कर रहे हैं, एक रनटाइम-पर्यावरण। जावा के समान, हम विभिन्न भागों को अलग-अलग, JRE, JVM, JDK, इत्यादि से संदर्भित करते हैं।

अधिक के लिए, विकिपीडिया प्रविष्टि: दुभाषिया , और आभासी मशीन । फिर भी एक और यहाँ । यहां आप एप्लिकेशन वर्चुअल मशीनों की तुलना पा सकते हैं । यह कम्पाइलर, इंटरप्रिटेटर और वीएम के बीच अंतर को समझने में मदद करता है।


12

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

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


1
जावा के गोले हैं जो अलग (उपयोगकर्ता दृश्यमान) संकलन चरणों के बिना जावा कोड चला सकते हैं।
रेयान

1
गिम्मे नाम: डी
मैकीज नोकी

11

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

कार्यक्रम संकलन की विशिष्ट प्रक्रिया में अगले चरण शामिल हैं:

  1. लेक्सिकल विश्लेषण । स्प्लिट्स प्रोग्राम को सार्थक "शब्दों" में टोकन कहते हैं (प्रक्रिया के भाग के रूप में सभी टिप्पणियों, रिक्त स्थान, नई-लाइनें आदि को हटा दिया जाता है, क्योंकि वे प्रोग्राम व्यवहार को प्रभावित नहीं करते हैं)। परिणाम टोकन की एक सुव्यवस्थित धारा है।
  2. सिंटेक्स विश्लेषण । टोकन की धारा से तथाकथित सार सिंटैक्स ट्री (एएसटी) बनाता है । एएसटी टोकन के बीच संबंध स्थापित करता है और, परिणामस्वरूप, कार्यक्रम के मूल्यांकन के एक आदेश को परिभाषित करता है।
  3. शब्दार्थ विश्लेषण । प्रकारों के बारे में जानकारी और प्रोग्रामिंग भाषा के शब्दार्थ नियमों का एक सेट का उपयोग करके एएसटी की शब्दार्थ शुद्धता को सत्यापित करता है। (उदाहरण के लिए, a = b + cवाक्यविन्यास बिंदु से एक सही कथन है, लेकिन शब्दार्थ बिंदु से पूरी तरह से गलत है यदि aएक स्थिर वस्तु के रूप में घोषित किया गया था)
  4. इंटरमीडिएट कोड पीढ़ी । एएसटी को मशीन के स्वतंत्र "आदिम" संचालन के रैखिक रूप से आदेशित धारा में सीरियल करता है। वास्तव में, कोड जनरेटर एएसटी का पता लगाता है और मूल्यांकन चरणों का क्रम लॉग करता है। नतीजतन, कार्यक्रम के वृक्ष-समान प्रतिनिधित्व से, हम बहुत अधिक सरल सूची-जैसे प्रतिनिधित्व प्राप्त करते हैं जिसमें कार्यक्रम मूल्यांकन का क्रम संरक्षित है।
  5. मशीन कोड पीढ़ी । मशीन स्वतंत्र "आदिम" बायटेकोड के रूप में कार्यक्रम का अनुवाद विशेष प्रोसेसर वास्तुकला के मशीन कोड में किया जाता है।

ठीक। अब शर्तों को परिभाषित करें।

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

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

अंत में, यदि हम bytecode संकलक में मशीन कोड जनरेशन को जोड़ते हैं, तो हम परिणाम प्राप्त करते हैं जिसे हम एक शास्त्रीय संकलक कहते हैं । एक शास्त्रीय संकलक प्रोग्राम स्रोत कोड को एक विशेष प्रोसेसर के मशीन कोड में परिवर्तित करता है । उस मशीन कोड को फिर बिना किसी अतिरिक्त मध्यस्थता (बिना किसी तरह के दुभाषिया के न तो पाठ दुभाषिया और न ही बाइनरी दुभाषिया) के बिना सीधे लक्षित प्रोसेसर पर निष्पादित किया जा सकता है ।

अब मूल प्रश्न पर वापस जाएं और जावा बनाम पायथन पर विचार करें।

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

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

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

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

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

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

परिणामस्वरूप, हम अगले निष्कर्ष निकाल सकते हैं। जावा वर्चुअल मशीन लेकिन पायथन दुभाषिया है क्योंकि:

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

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


2
इसे आधिकारिक उत्तर IMHO के रूप में चुना जाना चाहिए।
रविकांत अंधवरापू २

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

10

उनके बीच कोई वास्तविक अंतर नहीं है, लोग उन रचनाओं का अनुसरण करते हैं जिन्हें रचनाकारों ने चुना है।


3
मैं आपको यहाँ एक हड्डी फेंक दूंगा क्योंकि मुझे लगता है कि यह शायद असली जवाब है और आप बिट्स की कमी के कारण मतदान कर चुके हैं।
वाइकिंगबेन

3

यह मत भूलो कि पायथन के पास जेआईटी कंपाइलर हैं जो x86 के लिए उपलब्ध हैं, इस मुद्दे को और भ्रामक बनाते हैं। (मानस देखें)।

एक 'व्याख्या की गई भाषा' की अधिक सख्त व्याख्या केवल तब उपयोगी हो जाती है जब वीएम के प्रदर्शन के मुद्दों पर चर्चा की जाती है, उदाहरण के लिए, पायथन की तुलना में, रूबी (थी?) को धीमा माना जाता है क्योंकि यह पायथन के विपरीत एक व्याख्या की गई भाषा है - अन्य में शब्द, संदर्भ सब कुछ है।


1
यह गलत है। पहला, "व्याख्या की गई भाषा" जैसी कोई चीज नहीं है। एक कार्यान्वयन एक संकलक का उपयोग करता है या एक दुभाषिया भाषा का गुण नहीं है, लेकिन कार्यान्वयन का है। दूसरा, 13 या तो रूबी कार्यान्वयन, ठीक 1 एक दुभाषिया है, अन्य सभी में कंपाइलर हैं।
डब्ल्यू पर Jörg W Mittag

2
तीसरा, रूबी धीमी नहीं है। कोई भी भाषा धीमी नहीं है, क्योंकि गति भाषा का लक्षण नहीं है, बल्कि भाषा का कार्यान्वयन है। 13 या तो रूबी कार्यान्वयन में से कुछ 7 पायथन कार्यान्वयन में से कुछ धीमी हैं, कुछ तेज हैं।
डब्ल्यू पर Jörg W Mittag

मुझे लगता है कि वह Jörg के मानक कार्यान्वयन की तुलना कर रहे हैं। CPython और Ruby (मुझे लगता है कि आधिकारिक कार्यान्वयन को केवल रूबी नाम दिया गया है)।
जेम्स मैकमोहन

हालांकि अराफंगियन "मानक" कार्यान्वयन का उल्लेख कर रहे हैं, उन्हें ऐसा कहना चाहिए था। मैं एक पाइथोनिस्टा हूं लेकिन मुझे "भाषा X की गति धीमी है" के किसी भी कथन से नफरत है , क्योंकि मैं कार्यान्वयन के मामले पर जर्ग से सहमत हूं।
tzot

1
यही कारण है कि मैंने कहा "था (है?)", और विशेष रूप से शब्द "धीमा"। कहीं नहीं मैंने कहा कि रूबी अपने आप में धीमी है।
अरफांगियन

2

पायथन कोड को बायटेकोड पर संकलित किए बिना व्याख्या कर सकता है। जावा नहीं कर सकते हैं

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

(प्रलेखन से)।

जावा में, हर एक फाइल को एक फाइल में संकलित करना होता है .class, जो तब JVM पर चलती है। इसके विपरीत, अजगर उन फ़ाइलों के बाद के उपयोग को गति देने में मदद करने के लिए आपकी मुख्य स्क्रिप्ट द्वारा आयात किया जाता है।

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

हालाँकि, इस गड़बड़ी की असली वजह यह है कि शुरुआत से ही, java ने खुद को "पोर्टेबल, एक्ज़ीक्यूटेबल बायटेकोड" के रूप में ब्रांडेड किया और अजगर ने खुद को डायनामिक, इंटरप्रिटेड भाषा में REPL के रूप में ब्रांडेड किया। नाम छड़ी!


0

सबसे पहले आपको यह समझना चाहिए कि सामान्य रूप से प्रोग्रामिंग या कंप्यूटर विज्ञान गणित नहीं है और हम अक्सर उपयोग किए जाने वाले अधिकांश शब्दों के लिए कठोर परिभाषा नहीं रखते हैं।

अब आपके प्रश्न के लिए:

इंटरप्रेटर क्या है (कंप्यूटर विज्ञान में)

यह सबसे छोटी निष्पादन योग्य इकाई द्वारा स्रोत कोड का अनुवाद करता है और फिर उस इकाई को निष्पादित करता है।

वर्चुअल मशीन क्या है

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

जैसा कि आप देख सकते हैं दुभाषिया एक हिस्सा है या JVM और पूरे JVM को दुभाषिया नहीं कहा जा सकता है क्योंकि इसमें कई घटक होते हैं।

क्यों अजगर के बारे में बात करते समय शब्द "दुभाषिया" का उपयोग करें

जावा के साथ संकलन भाग स्पष्ट है। दूसरी ओर अजगर अपने संकलन और व्याख्या प्रक्रिया के बारे में जावा के रूप में स्पष्ट नहीं है, अंत उपयोगकर्ता की परिप्रेक्ष्य व्याख्या से अजगर तंत्र को निष्पादित करने के लिए इस्तेमाल किया जाने वाला एकमात्र तंत्र है


0

नहीं, वे दोनों बाइट कोड की व्याख्या नहीं करते हैं।

यदि आप पिपी के साथ चल रहे हैं तो पायथन केवल बाइटकोड की व्याख्या करता है। अन्यथा इसे C में संकलित किया जाता है और उस स्तर पर व्याख्या की जाती है।

जावा बाइटकोड को संकलित करता है।


क्या आप अपने जवाब के लिए कोई संसाधन दे सकते हैं?
ईसरु दिलशान


स्टैक ओवरफ्लो में यह गलत है। किसी के पास एक पेशाब फिट है क्योंकि उन्हें बाहर बुलाया जाता है और इसे डाउनवोट्स के साथ व्यक्त करता है।
माइकल टैमिलो

0

मुझे लगता है कि दोनों के बीच की रेखाएं धुंधली हैं, लोग ज्यादातर "इंटरप्रेटर" शब्द के अर्थ के आसपास बहस करते हैं और भाषा "इंटरप्रेटर ... कंपाइलर" स्पेक्ट्रम के प्रत्येक पक्ष के करीब है। हालांकि कोई भी 100% नहीं बनाता है। मुझे लगता है कि जावा या पायथन कार्यान्वयन को लिखना आसान है जो स्पेक्ट्रम के किसी भी मूल्य का हो।

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

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

प्रदर्शन केवल ठोस कार्यान्वयन के बारे में है। हमें इसके साथ काम करने में सक्षम होने के लिए वस्तु का आकार जानने की आवश्यकता नहीं है, और अंत में, ज्यादातर मामलों में, हम संरचनाओं के साथ काम करते हैं, बुनियादी प्रकार नहीं। पायथन वीएम को इस तरह से अनुकूलित करना संभव है कि यह मौजूदा गणना के द्वारा अभिव्यक्ति गणना के दौरान हर बार नई वस्तु बनाने की आवश्यकता को समाप्त कर देगा। एक बार यह हो जाने के बाद, दो पूर्णांकों की गणना के बीच कोई वैश्विक प्रदर्शन अंतर नहीं है, जो कि जावा चमकता है।

दोनों के बीच कोई हत्यारा अंतर नहीं है, केवल कुछ कार्यान्वयन बारीकियों और अनुकूलन की कमी है जो अंत उपयोगकर्ता के लिए अप्रासंगिक हैं, शायद उस बिंदु पर जहां वह प्रदर्शन लैग्स को नोटिस करना शुरू करता है, लेकिन फिर से यह कार्यान्वयन है और वास्तुकला मुद्दा नहीं है।


0

उन पोस्टों के लिए जो उल्लेख करते हैं कि अजगर को बाइट कोड उत्पन्न करने की आवश्यकता नहीं है, मुझे यकीन नहीं है कि यह सच है। ऐसा लगता है कि पायथन में सभी कॉलबल्स में एक .__code__.co_codeविशेषता होनी चाहिए जिसमें बाइट कोड होता है। मुझे अजगर को "संकलित नहीं" कहने का एक सार्थक कारण नहीं दिखता है क्योंकि संकलित कलाकृतियों को बचाया नहीं जा सकता है; और अक्सर पायथन में डिज़ाइन द्वारा सहेजा नहीं जाता है, उदाहरण के लिए यह इनपुट के लिए सभी बोध संकलन नया बायटेकोड संकलित करता है, यही कारण है कि समझ चर चर के बीच संगत नहीं है compile(mode='exec, ...)और संकलन है compile(mode='single', ...)जैसे कि पायथन स्क्रिप्ट चलाने और pbb का उपयोग करने के बीच

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