जेवीएम एक संकलक या एक दुभाषिया है?


85

मेरे पास जेवीएम के बारे में एक बहुत ही बुनियादी सवाल है: क्या यह एक संकलक है या एक दुभाषिया है?

यदि यह एक दुभाषिया है, तो JV संकलक के बारे में क्या है जो JVM के अंदर मौजूद है?
यदि नहीं, तो वास्तव में जेवीएम क्या है? (मैं मशीन कोड विशिष्ट कोड आदि के लिए परिवर्तित बाइट कोड के jVM की मूल परिभाषा नहीं करना चाहता)


16
JVM एक वर्चुअल मशीन है। बाइटकोड में जाता है, कार्यक्रम के अवलोकन प्रभाव होते हैं। बाकी सब कुछ एक कार्यान्वयन विवरण है।

1
हाँ, वहाँ कोई "" JVM नहीं है, वहाँ कल्पना के कई कार्यान्वयन हैं।
paxdiablo

@ डायलेन, कृपया इसे उत्तर के रूप में लिखें। मैं वास्तव में इस तरह के जवाब को बढ़ाना चाहता हूं।
एनियोबे

@aioobe: मैं नहीं करूँगा। मुझे नहीं लगता कि यह यहां पूछे गए प्रश्न का उत्तर देता है - यह एक बहुत ही उपयोगी परिप्रेक्ष्य है, लेकिन प्रश्न (शीर्षक में और पोस्ट में स्पष्ट रूप से स्पष्ट रूप से) इन कार्यान्वयन विवरणों का अनुरोध करता है।

काफी उचित। मैं कहेंगे यह है का जवाब "अगर न, तो वास्तव में क्या है JVM?" हालांकि हिस्सा। (जैसा कि जावा वर्चुअल मशीन एक कार्यान्वयन से अधिक विनिर्देशन है।)
aioobe

जवाबों:


172

पहले, आइए निम्नलिखित शर्तों के बारे में स्पष्ट विचार करें

JavacJava Compiler है - अपने Java कोड को Bytecode में संकलित करता है

JVMजावा वर्चुअल मशीन है - मूल मशीन कोड में रनटेक / इंटरप्रिट्स / ट्रांसलेट बाईटकोड

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

तो अब, चलिए आपके सवालों के जवाब ढूंढते हैं ..

1) JVM: is it a compiler or an interpreter? - उत्तर: दुभाषिया

2) what about JIT compiler that exist inside the JVM? - उत्तर: यदि आप इस उत्तर को पूरी तरह से पढ़ते हैं, तो आप शायद इसे अभी जानते हैं

3) what exactly is the JVM? - उत्तर:

  • JVM एक वर्चुअल प्लेटफॉर्म है जो आपकी रैम पर रहता है
  • इसका घटक, क्लास लोडर.class फ़ाइल को रैम में लोड करता है
  • बाइट कोड सत्यापनकर्ता JVM की जाँच में घटक अगर वहाँ अपने कोड में किसी भी उपयोग प्रतिबंध उल्लंघन कर रहे हैं। (यह सिद्धांत कारणों में से एक है कि जावा सुरक्षित क्यों है)
  • इसके बाद, एक्ज़ेक्यूशन इंजन कंपोनेंट बायटेकोड को एक्जीक्यूटेबल मशीन कोड में बदल देता है

आशा है कि इसने आपकी मदद की ..


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

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

2
क्या आप मुझे यह भी बता सकते हैं कि मूल कोड क्या है? क्या इसका मतलब मशीन कोड है? मैं संकलन और व्याख्या की इस पूरी प्रक्रिया को सीखने की कोशिश कर रहा हूं लेकिन ये मध्यवर्ती शब्द बहुत भ्रमित करने वाले हैं।
सदाबहार

7
तो JVM और JIT दोनों बाइट कोड को प्लेटफ़ॉर्म विशिष्ट मशीन कोड में परिवर्तित करते हैं, इसलिए उनके बीच क्या अंतर है? क्या आप इसे मोटे तौर पर समझा सकते हैं?
आदित्य

6
'रन / इंटरप्रिटेज / ट्रांसलेट बाईटेकोड इन द नेटिव मशीन कोड' बकवास है। यह या तो 'रन / इंटरप्रिट करता है' या 'बायटेकोड को नेटिव मशीन कोड में अनुवाद करता है'। एक ही समय में दोनों नहीं।
user207421

32

यह दोनों में से एक है, लेकिन न तो पारंपरिक अर्थों में।

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

JVM को जावा कंपाइलर के साथ भ्रमित नहीं होना चाहिए, जो स्रोत कोड को बायटेकोड में संकलित करता है। तो यह "एक संकलक" पर विचार करने के लिए उपयोगी नहीं है, बल्कि यह जानने के लिए कि पृष्ठभूमि में यह कुछ संकलन करता है।


8
@NaeemShah: मैं चापलूसी कर रहा हूं कि आपको यह जवाब काफी पसंद आया, क्योंकि यह लगभग शब्द-दर-शब्द कॉपी करने के लिए एक ब्लॉग पोस्ट में आपके ही नाम से है। और आपको ऐसा करने का अधिकार है, लेकिन StackOverflow की लाइसेंसिंग योजना के तहत, आपको कानूनी रूप से यहां पर रेकशन देने की आवश्यकता है, और आपको उसी लाइसेंस के तहत अपने ब्लॉग पोस्ट को लाइसेंस देना होगा। इस वेबसाइट के पाद लेख देखें, जो निम्नलिखित लाइसेंस से लिंक करता है: creativecommons.org/licenses/by-sa/3.0 । इस ब्लॉग पोस्ट को भी देखें: blog.stackoverflow.com/2009/06/attribution-required
मार्क पीटर्स

8

जैसे @delnan ने पहले ही टिप्पणी अनुभाग में कहा था, यह न तो है

JVM जावा बाईटेकोड पर चलने वाली एक अमूर्त मशीन है

JVM के कई कार्यान्वयन हैं:

... और कई अन्य

जब JVM के बारे में बात करते हैं, तो अधिकांश लोग जवाब देते हैं कि JVM को लागू करने के लिए या तो हॉटस्पॉट या उपर्युक्त दृष्टिकोण का कुछ मिश्रण।


1
ART एक दुभाषिया भी है: "Android वास्तव में .dexव्याख्या या जस्ट-इन-टाइम (JIT) संकलन के माध्यम से कोड चला सकता है ..." ( source.android.com/devices/tech/ota/ab/… )
इरफ़ान लतीफ़

5

यह दोनों है। यह बायटेकोड की व्याख्या करने से शुरू होता है और (यह तय करना चाहिए कि यह इसके लायक है) तो उस बायटेकोड को मूल मशीन कोड में संकलित करें।


आप शायद हॉटस्पॉट का उल्लेख कर रहे हैं
cubuspl42

5

यह दोनों है। यह बाइटकोड की व्याख्या कर सकता है, और इसे मूल कोड में संकलित कर सकता है।



0

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

JIT एक जावा कंपाइलर है, लेकिन एक दुभाषिया के रूप में भी काम करता है। एक विशिष्ट संकलक स्रोत कोड से मशीन स्तर की भाषा में एक बार में सभी कोड को बदल देगा। इसके बजाय, JIT लाइन से लाइन पर जाता है (लाइन द्वारा लाइन निष्पादन इंटरप्रिटर्स की एक विशेषता है) और JavaC द्वारा उत्पन्न बायटेकोड को मशीन स्तर की भाषा में परिवर्तित करता है और इसे निष्पादित करता है। जेवीएम जिसमें जेआईटी है उसमें कई कार्यान्वयन हैं। हॉटस्पॉट जावा प्रोग्रामिंग के लिए प्रमुख लोगों में से एक है। हॉटस्पॉट कार्यान्वयन जेआईटी को कोड के उन विखंडुओं को परिवर्तित करके निष्पादन का अनुकूलन करता है जो एक बार में मशीन स्तर की भाषा में दोहराए जाते हैं (जैसा कि ऊपर उल्लिखित एक कंपाइलर) ताकि वे कोड 1 की प्रत्येक पंक्ति को 1 से परिवर्तित करने के बजाय तेजी से निष्पादित कर सकें। कम्पाइलर और दुभाषिया की विशिष्ट परिभाषाओं के संबंध में उत्तर ब्लैक एंड व्हाइट नहीं है।

कई ऑनलाइन उत्तर, ब्लॉग आदि पढ़ने के बाद यह मेरी समझ है, अगर किसी के पास इस समझ को बेहतर बनाने के सुझाव हैं, तो कृपया सुझाव देने के लिए स्वतंत्र महसूस करें।


-5

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

उदाहरण: एक प्रोग्राम लिखें और संकलित करें और यह विंडोज पर चलता है। .Class फ़ाइल को दूसरे OS (Unix) पर ले जाएं और यह इंटरप्रेटर की वजह से चलेगा जो बाइटकोड को मशीन के समझने योग्य कोड में बदल देता है।


1
आप कैप्स को बंद करना भूल गए हैं :)
स्वीडिश वासिनोव

7
गलत, आप पहले स्रोत कोड को बायटेकोड (जेवीएम से कोई लेना देना नहीं है) के लिए संकलित करते हैं, फिर जेवीएम बाइटेकोड की व्याख्या करता है और इसे मूल कोड के लिए संकलित करता है (लेकिन शायद हर भाग नहीं)।
the_Fox
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.