जावा वर्चुअल मशीन अन्य भाषाओं में लिखे गए कोड को कैसे निष्पादित करता है?


12

जावा 1.6 के बाद से JVM सिर्फ जावा के बजाय प्रोग्रामिंग भाषाओं के असंख्य चला सकता है। मैं अवधारणात्मक रूप से समझता हूं कि जावा वीएम पर जावा कैसे चलाया जाता है, लेकिन यह नहीं कि अन्य भाषाएं इस पर कैसे चल सकती हैं। मेरे लिए, यह सब काला जादू जैसा दिखता है। क्या आपके पास मुझे इंगित करने के लिए कोई लेख है तो मैं बेहतर तरीके से समझ सकता हूं कि यह सब एक साथ कैसे फिट बैठता है?


2
आपके इंटेल / एएमडी / सोलारिस (??) प्रोसेसर के समान तरीका "किसी भी भाषा" को निष्पादित कर सकता है (हालांकि आप वास्तव में भाषा नहीं चलाते हैं, लेकिन यहां प्रवाह के साथ जा रहे हैं) जिसे इसके मूल विधानसभा कोड में संकलित किया जा सकता है।
अपूर्व खुरसिया

13
बात यह है कि, JVM जावा नहीं चलाता है। यह एक निम्न (हालांकि संबंधित, और जानबूझकर आसान जावा कंपाइलर बनाने के लिए), अधिक निम्न-स्तरीय भाषा चलाता है।

यह सच है। लेकिन जेवीएम ने संस्करण 6 से अन्य भाषाओं को चलाना शुरू कर दिया; आप 1.4.2 संस्करण में उस पर अजगर या ग्रूवी नहीं चला सकते (या किसी ने भी नहीं किया)। ऐसा क्यों हैं? क्या बदल गया?
पोमेरियो

@delnan या "निष्पादन के अधिक निम्न-स्तरीय मॉडल, कि javac प्रोग्राम जानता है कि जावा कोड का निर्माण कैसे करें"।
अपूर्व खुरसिया

9
@Pomario Jython को अभी कुछ समय हुआ है। और इस पेज से लगता है कि ज्योनथ स्क्रिप्ट 1.4.2 पर चल सकता है।
अपूर्व खुरसिया

जवाबों:


23

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

आप इसके बारे में अधिक जानकारी निम्नलिखित लेख / सूत्र में पा सकते हैं:

मुझे जावा 5 या 6 जेवीएम में किसी भी मूलभूत परिवर्तन के बारे में पता नहीं है, जिसने इसे चलाने के लिए (अन्य भाषाओं से संकलित) कोड के लिए संभव या आसान बना दिया होगा। मेरी समझ में, JVM 1.4 JVM 6 के रूप में उस संबंध में अधिक या कम सक्षम था (हालांकि मतभेद हो सकते हैं; मैं JVM विशेषज्ञ नहीं हूं)। यह सिर्फ इतना था कि लोगों ने अन्य भाषाओं और / या बायोटेक कंपाइलर्स को दशक के पहले भाग में विकसित करना शुरू कर दिया था, और जब जावा 6 प्रकाशित हुआ, तो परिणाम 2006 के आसपास (और व्यापक रूप से ज्ञात हो गए) दिखाई देने लगे।

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


8
यह बिल्कुल सच नहीं है कि जेवीएम ने गतिशील भाषाओं का "समर्थन" नहीं किया। उन्हें बस ऐसे वर्कअराउंड्स का उपयोग करना था जिनमें गंभीर कमियां थीं।
माइकल बोर्गवर्ड

3
@MichaelBorgwardt, क्या हम इस बात पर सहमत हो सकते हैं कि JVM पूर्व v7 ने गतिशील भाषाओं (कुछ हद तक) को सहन किया है ? :-)
पेर्ट टॉर्क

1
इसे लगाने का एक अच्छा तरीका है :)
माइकल बोर्गवर्ड

3

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

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

तो चलो उदाहरण के लिए एक भाषा लेते हैं। इसे MyLanguage कहें। चूंकि यह एक प्रोग्रामिंग भाषा है, इसलिए यह अंततः कुछ सीपीयू आर्किटेक्चर निर्देशों के एक सेट तक संकलित करता है। तो इसका मतलब है कि, एक सुसंगत, लचीली वर्चुअल मशीन निर्देश सेट को देखते हुए, यह वीएम के निर्देशों के एक सेट के लिए MyLanguage को संकलित करना भी संभव है।

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


3

एक जेवीएम एक ट्यूरिंग-कम्प्लीट कंप्यूट मशीन (सीमित मेमोरी को छोड़कर) है, और कोई भी ट्यूरिंग-पूर्ण मशीन (भौतिक या आभासी) किसी भी प्रोग्रामिंग भाषा (मेमोरी, प्रदर्शन और भौतिक आईओ सीमाओं को छोड़कर) को निष्पादित कर सकती है।


एर्म .... हमें कंपाइलर की आवश्यकता क्यों है? ;-)
पेर्ट टॉर्क

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

1
मेरा कहना था कि आपका कथन "कोई भी ट्यूरिंग-पूर्ण मशीन (भौतिक या आभासी) किसी भी प्रोग्रामिंग भाषा को निष्पादित कर सकता है" का शाब्दिक अर्थ है कि मेरे लैपटॉप का x86 सीपीयू सीधे इस अच्छे जावा स्रोत फ़ाइल को निष्पादित कर सकता है जो मैं अभी काम कर रहा हूं। या पावरपीसी प्रोसेसर के लिए मशीन कोड। कंपाइलर के बिना - सीपीयू में कंपाइलर सही नहीं होते हैं? :-)
पेर्ट टॉर्क

आपकी "मशीन" सिर्फ सीपीयू से अधिक है।
हॉटपावर 2

1
@ PéterTörök मैं आपकी बात देख रहा हूं। वह वीएम पर विस्तृत नहीं था जैसे हमने किया। लेकिन मुझे लगता है कि उनका जवाब अभी भी ओपी के सवाल का संक्षिप्त जवाब है। JVM अन्य प्रोग्रामिंग भाषाओं को "रन" कर सकता है क्योंकि यह किसी भी प्रोग्रामिंग भाषा को "रन" कर सकता है, क्योंकि यह ट्यूरिंग पूर्ण है। शायद विस्तृत नहीं, लेकिन फिर भी एक संक्षिप्त और मान्य बिंदु। :)
यम मार्कोविच

2

बस एक पल के लिए जेवीएम को अपने निर्देश के साथ एक प्रोसेसर के रूप में सोचें जैसे कि शायद x86। प्रोसेसर सी कोड को निष्पादित कर सकता है जिसे उसकी मशीन भाषा में संकलित किया गया है। जेवीएम के समान सादृश्य को लागू करते हुए, अन्य भाषाओं को जेवीएम पर अन्य प्रोसेसर की तरह ही निष्पादित किया जा सकता है यदि उन भाषाओं को जेवीएम के मशीन निर्देशों के लिए संकलित किया जाता है। तब JVM भाषा X के लिए ये निर्देश चला सकता है।


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