जावा की वर्चुअल मशीन और सीएलआर


140

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

इसके अलावा, है ।शुद्ध रूपरेखा CLR एक "वर्चुअल मशीन" है या इसमें वर्चुअल मशीन के गुण नहीं हैं?


ठीक है, यदि आप पसंद और पसंद कर रहे हैं, तो आपको वीएम और सीएलआर (कॉमन लैंग्वेज रनटाइम) के बीच अंतर के रूप में प्रश्न को पुन: प्रस्तुत करना चाहिए, जो वीएम के लिए सीधा एनालॉग है।
cletus

जवाबों:


278

दोनों कार्यान्वयन (और मेरी राय में: हाँ, वे दोनों "वर्चुअल मशीन") में बहुत समानताएँ हैं।

एक बात के लिए, वे दोनों स्टैम्प-आधारित वीएम हैं, "रजिस्टरों" की कोई धारणा नहीं है जैसे कि हम एक आधुनिक सीपीयू जैसे x86 या पावरपीसी में देखने के आदी हैं। सभी अभिव्यक्तियों का मूल्यांकन ((1 + 1) / 2) "स्टैक" पर ऑपरेंड को धक्का देकर किया जाता है और फिर जब भी कोई निर्देश (ऐड, डिवाइड, आदि) उन ऑपरेंड को खपाने की आवश्यकता होती है, तो उन ऑपरेंड को पॉपप करके उन ऑपरेंड का उपभोग करने की आवश्यकता होती है। प्रत्येक निर्देश इसके परिणामों को स्टैक पर वापस धकेलता है।

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

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

बेशक, असली मशीनें इस तरह से काम नहीं करती हैं। तो JIT संकलक, बायटेकोड संचालन के "एनरगेटिंग" को करने के लिए ज़िम्मेदार है, अनिवार्य रूप से जब भी संभव हो ऑपरेशंस और परिणाम शामिल करने के लिए वास्तविक सीपीयू रजिस्टरों का निर्धारण करता है।

इसलिए, मुझे लगता है कि सीएलआर और जेवीएम के बीच सबसे बड़ी समानता है।

अंतर के रूप में ...

दो कार्यान्वयन के बीच एक दिलचस्प अंतर यह है कि सीएलआर में सामान्य प्रकार बनाने के लिए निर्देश शामिल हैं, और फिर उन प्रकारों के लिए पैरामीट्रिक विशेषज्ञताओं को लागू करने के लिए। इसलिए, क्रम में, CLR एक सूची <int> को सूची <स्ट्रिंग> से पूरी तरह से अलग प्रकार मानता है।

कवर के तहत, यह सभी संदर्भ-प्रकार की विशेषज्ञता के लिए एक ही एमएसआईएल का उपयोग करता है (इसलिए एक सूची <स्ट्रिंग> एक ही कार्यान्वयन का उपयोग सूची <ऑब्जेक्ट>, एपीआई सीमाओं पर विभिन्न प्रकार के कलाकारों के साथ करता है), लेकिन प्रत्येक मूल्य-प्रकार का उपयोग करता है इसका अपना अनूठा कार्यान्वयन (सूची <int> सूची <डबल> से पूरी तरह से अलग कोड उत्पन्न करता है)।

जावा में, जेनेरिक प्रकार एक शुद्ध संकलक चाल है। जेवीएम की कोई धारणा नहीं है कि किस वर्ग के पास तर्क-वितर्क हैं, और यह रनटाइम में पैरामीट्रिक विशेषज्ञता का प्रदर्शन करने में असमर्थ है।

व्यावहारिक दृष्टिकोण से, इसका मतलब है कि आप जेनेरिक प्रकारों पर जावा विधियों को अधिभार नहीं दे सकते। आपके पास दो अलग-अलग विधियाँ नहीं हो सकती हैं, एक ही नाम के साथ, केवल इस बात पर भिन्न है कि वे एक सूची <स्ट्रिंग> या सूची <दिनांक> स्वीकार करते हैं। बेशक, चूंकि सीएलआर पैरामीट्रिक प्रकारों के बारे में जानता है, इसलिए इसे जेनेरिक प्रकार की विशेषज्ञता पर ओवरलोडेड तरीकों को संभालने में कोई समस्या नहीं है।

दिन-प्रतिदिन के आधार पर, यही वह अंतर है जो मैं सीएलआर और जेवीएम के बीच सबसे अधिक नोटिस करता हूं।

अन्य महत्वपूर्ण अंतरों में शामिल हैं:

  • CLR में क्लोजर (C # डेलीगेट्स के रूप में लागू) है। JVM केवल जावा 8 के बाद से बंद होने का समर्थन करता है।

  • सीएलआर में कॉरआउट (सी # 'उपज' कीवर्ड के साथ लागू किया गया है)। जेवीएम नहीं करता है।

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

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

  • जेवीएम में कोड की सबसे बड़ी इकाई या तो एक 'पैकेज' है जिसे 'संरक्षित' कीवर्ड द्वारा प्रमाणिक रूप से दर्शाया गया है या यकीनन एक JAR (यानी जावा आर्काइव) के रूप में व्यक्त किया गया है, जो वर्गपथ में जार निर्दिष्ट करने में सक्षम है और इसे एक फ़ोल्डर की तरह माना जाता है कोड का। सीएलआर में, कक्षाओं को 'असेंबली' में एकत्रित किया जाता है, और एसएलआर असेंबलियों के बारे में तर्क और हेरफेर करने के लिए तर्क प्रदान करता है (जो "AppDomains" में लोड होता है, मेमोरी आवंटन और कोड निष्पादन के लिए उप-एप्लिकेशन-स्तर सैंडबॉक्स प्रदान करता है)।

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

मैं अब लगभग दस वर्षों से जावा (और जेवीएम को निहार रहा हूं) का उपयोग कर रहा हूं।

लेकिन, मेरी राय में, CLR अब लगभग हर तरह से बेहतर कार्यान्वयन है।


73
क्लोज़र और जनरेटर भाषा स्तर पर लागू किए जाते हैं और इन्हें सीएलआर स्तर पर केवल कक्षाओं के रूप में दर्शाया जाता है।
हेगनलोचर

2
कैसे वे ढेर को संभालने में अंतर के बारे में? CLR OS / host proc पर अधिक निर्भर है जबकि JVM अधिक या कम मेमोरी को पूरी तरह से प्रबंधित करता है।
केली एस। फ्रेंच

6
एक महत्वपूर्ण अंतर सिर्फ-इन-टाइम संकलन (सीएलआर) और अनुकूली अनुकूलन (ओरेकल / सन) जेवीएम के बीच विपरीत है।
एडविन डेलोरजो

1
जावा के स्थानीय चर स्लॉट रजिस्टर की तरह काम करते हैं। लेकिन जेआईटी स्थानीय स्लॉट और स्टैक को वास्तविक रजिस्टरों में बदल देता है, लेकिन यह वैसे भी सभी लूट है।
एंटीमनी

1
@kuhajeyan ऐसा इसलिए है क्योंकि जब CLR पेश किया गया था, JVM 10 साल का था। आईटी में एक लंबा समय है। जब 1993 में जेवीएम आया, सीएलआर (2003) के लिए कोई गंभीर दावेदार नहीं था, उद्योग में मजबूत पैर जमाने के साथ परिपक्व और ठोस जेवीएम था।
सिंपल फेलो

25

आपका पहला प्रश्न JVM की .NET फ्रेमवर्क के साथ तुलना कर रहा है - मुझे लगता है कि आप वास्तव में सीएलआर के साथ तुलना करने के लिए थे। यदि हां, तो मुझे लगता है कि आप इस पर एक छोटी सी किताब लिख सकते हैं ( EDIT: ऐसा लगता है कि बेन्जी पहले से ही है :-)

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

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

आपके दूसरे प्रश्न का उत्तर देने के लिए, "वर्चुअल मशीन" शब्द हार्डवेयर की दुनिया से एक पुराना शब्द है (उदाहरण के लिए 1960 के दशक में आईबीएम के 360 के वर्चुअलाइजेशन) का मतलब उसी तरह के काम को पूरा करने के लिए अंतर्निहित मशीन के एक सॉफ्टवेयर / हार्डवेयर का उपयोग करना था। सामान जो VMWare करता है।

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

तो आपके दूसरे प्रश्न का पांडित्यपूर्ण उत्तर "नहीं" है। लेकिन यह वास्तव में नीचे आता है कि आप इन दो शब्दों को कैसे परिभाषित करते हैं।

संपादित करें: जेवीएम और सीएलआर के बीच एक और अंतर यह है कि जेवीएम (संस्करण 6) आवंटित मेमोरी को ऑपरेटिंग सिस्टम में वापस करने के लिए बहुत अनिच्छुक है, यहां तक ​​कि जहां यह हो सकता है।

उदाहरण के लिए, मान लें कि जेवीएम प्रक्रिया शुरू होती है और शुरू में ऑपरेटिंग सिस्टम से 25 एमबी मेमोरी आवंटित करती है। ऐप कोड फिर आवंटन का प्रयास करता है जिसके लिए अतिरिक्त 50 एमबी की आवश्यकता होती है। JVM ऑपरेटिंग सिस्टम से अतिरिक्त 50 MB आवंटित करेगा। एक बार एप्लिकेशन कोड को उस मेमोरी का उपयोग करना बंद कर देने के बाद, यह कचरा-एकत्र हो जाता है और जेवीएम हीप का आकार घट जाएगा। हालांकि, जेवीएम केवल कुछ विशेष परिस्थितियों में आवंटित ऑपरेटिंग सिस्टम मेमोरी को मुक्त करेगा । अन्यथा, शेष प्रक्रिया जीवन भर के लिए कि स्मृति आवंटित की जाएगी।

दूसरी ओर, CLR, आबंटित मेमोरी को ऑपरेटिंग सिस्टम में वापस भेज देता है यदि इसकी आवश्यकता नहीं है। ऊपर के उदाहरण में, CLR ने मेमोरी को एक बार हीप में कमी होने के बाद जारी किया होगा।


2
यह निरपेक्ष नहीं है कि JVM आवंटित स्मृति को मुक्त नहीं करेगा। सबूत के लिए इस सवाल का मेरा जवाब देखें: stackoverflow.com/questions/366658/…
माइकल बोर्गवर्ड

मैंने JVM रिटर्न मेमोरी को विंडोज पर वापस देखा है।
स्टीव कू

मैंने अपने जवाब को यह कहने के लिए बदल दिया है कि जेवीएम 6 रैन और माइकल के उत्तरों के लिंक के साथ, मेमोरी जारी करने के लिए बहुत अनिच्छुक है। मैंने जेवीएम 5 के साथ इस व्यवहार को कभी नहीं देखा, इसलिए शायद वह संस्करण और भी अधिक अनिच्छुक था।
HTTP 410

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

@ सेते कुओ, हां मैंने भी देखा है। आमतौर पर शाम 5 बजे से 6 बजे के बीच।
सिंपल फेलो

11

सीएलआर और जेवीएम दोनों वर्चुअल मशीन हैं।

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


11

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

कुछ विशिष्ट उदाहरणों में शामिल हैं:

  • कुछ निम्न-स्तर के ओपेरेंड टाइप किए जाते हैं जैसे कि "टू टू इनट्स" जहां सीएलआर एक पॉलीमॉर्फिक ऑपरेंड का उपयोग करता है। (यानी fadd / iadd / ladd vs just add)
  • वर्तमान में, JVM अधिक एग्रेसिव रनटाइम प्रोफाइलिंग और ऑप्टिमाइज़ेशन (यानी हॉटस्पॉट) करता है। CLR वर्तमान में JIT ऑप्टिमाइज़ेशन करता है, लेकिन रनटाइम ऑप्टिमाइज़ेशन नहीं (यानी जब आप दौड़ रहे हों तो कोड बदलें)।
  • CLR वर्चुअल तरीके इनलाइन नहीं करता, JVM करता है ...
  • सीएलआर में मूल्य प्रकार के लिए समर्थन सिर्फ "आदिम" से परे है।

-11

यह एक वर्चुअल मशीन नहीं है, .नेट फ्रेमवर्क असेंबली को पहले रन के समय देशी बाइनरी में संकलित करता है:

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

कई आधुनिक रनटाइम वातावरण, जैसे कि Microsoft का .NET फ्रेमवर्क, जावा के अधिकांश कार्यान्वयन और हाल ही में Actionscript 3, उच्च गति कोड निष्पादन के लिए JIT संकलन पर भरोसा करते हैं।

स्रोत: http://en.wikipedia.org/wiki/Just-in-time_compilation

.NET फ्रेमवर्क को जोड़ना जावा की तरह ही एक वर्चुअल मशीन है।


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