JVM इतनी सारी JVM भाषाओं का समर्थन करने के लिए कितना बहुमुखी है?


18

JVM जावा Groovy,Clojure,Scalaआदि के अलावा अन्य कई भाषाओं का समर्थन करता है जो जावा के विपरीत कार्यात्मक भाषाएं हैं (मैं संस्करण 8 से पहले जावा का उल्लेख कर रहा हूं जहां Lambda'sसमर्थित नहीं हैं) जो कार्यात्मक क्षमताओं का समर्थन नहीं करता है। एक उच्च स्तर जो जेवीएम को इतना बहुमुखी बनाता है कि वह दोनों ऑब्जेक्ट ओरिएंटेड और साथ ही कार्यात्मक भाषाओं का समर्थन कर सकते हैं?


"Groovy, Clojure, Scala आदि जो कार्यात्मक हैं"। उनमें से कुछ दूसरों की तुलना में अधिक कार्यात्मक हैं। मैं ग्रोवी के साथ एक पैमाने का उपयोग करूंगा जिसमें सबसे कम मजेदार और क्लोजुर सबसे बीच में स्काला के साथ होगा।
Vorg van Geir

जवाबों:


37

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

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

और फिर भी, गतिशील भाषाओं का एक गुच्छा (ग्रूवी, ज्यथॉन, जेरीबी अन्य के बीच) जेवीएम पर इससे पहले लागू किया गया था।

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

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


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

4

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

विकिपीडिया पर बाइटकोड की एक सूची है:

http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings

साथ ही JVM बाइट कोड को कैसे लोड करता है, इसका स्पष्टीकरण:

http://en.wikipedia.org/wiki/Java_virtual_machine

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


1
यही बात हर एक दूसरे वीएम के लिए सही है: यारवी रूबी वीएम, रूबिनस रूबी वीएम, सीपीथॉन वीएम (जो कि आखिरकार जेवीएम से पहले होता है), तोता, विभिन्न स्मॉलटॉक और एलएफटी वीएम, और निश्चित रूप से पास्कल पी- कोड सिस्टम, जिसके बाद JVM को मॉडल किया जाता है।
जोर्ग डब्ल्यू मित्तग

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

2

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

अंतिम लेकिन कम से कम जेवीएम का कचरा संग्रह उप-प्रणाली नहीं है (जो सही ट्यूनिंग के साथ) शीर्ष पर भाषा की परवाह किए बिना आपके लिए स्मृति का प्रबंधन करता है।


JMM जावा के बारे में मेरी सबसे कम पसंदीदा चीजों में से एक है। मैं प्रभावी रूप से अपरिवर्तनीय डेटा का प्रशंसक हूं (उदाहरण के लिए सरणियाँ जिनकी सामग्री अन्य थ्रेड्स में दिखाई देने के बाद कभी भी नहीं बदलेगी), लेकिन यह someField = new int[]{42};सुनिश्चित करने के एकमात्र तरीके की तरह दिया गया है कि कोई भी धागा जो नए सरणी को देखता है, वह मान देखेगा 42 या तो क्षेत्र बनाने के लिए कर रहे हैं finalया volatile। यदि क्षेत्र आलसी उत्पन्न होता है, लेकिन बार-बार एक्सेस किया जाता है, तो यह finalकाम नहीं करेगा, और इसे volatileहर बार एक्सेस करने पर एक अनावश्यक सिंक्रनाइज़ेशन जुर्माना लगाया जा सकता है। यहां तक ​​कि सबसे ढीले .NET मॉडल में ...
21

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

1

इसमें प्रमुख तत्व निष्पादन चरण से संकलन का पृथक्करण है। इसके द्वारा अन्य संकलक को अन्य भाषाओं को लिखने के लिए संभव है जो बाइटकोड को संकलित करता है।

बाइटकोड एक सीपीयू के मशीन कोड के समान कार्य करता है - आपके पास प्रोग्राम चलाने के लिए आवश्यक सभी छोटे ऑपरेशन हैं - आप एक चर प्राप्त कर सकते हैं, इस पर गणित कर सकते हैं, सशर्त संचालन कर सकते हैं आदि।

जावा भी विशेष नहीं है। जावा में अन्य वीएम के विपरीत कई भाषाओं की मौजूदगी एक डिजाइन लक्ष्य भी नहीं थी। के लिए माइक्रोसॉफ्ट के नेट सीआईएल कई भाषाओं को चलाने की क्षमता (VB.Net सी #,, ...) एक प्रमुख डिजाइन तत्व, यह भी था ParrotVM एक सामान्य वीएम होने के लिए उद्देश्य से Perl6 परियोजना से।

इसके मज़े के लिए मैंने एक बार एक प्रमाण बनाया कि PHP का Zend Engine भी इसकी अनुमति देगा।

और स्पष्ट रूप से यह कुछ भी नया नहीं है - असली हार्डवेयर पर भी आप कई भाषाएं चला सकते हैं - यानी सी या फोरट्रान।

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


1

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

  • कुछ कोड का एक संदर्भ एक अपरिवर्तनीय कार्यान्वयन होना जानता है List<String>

  • एक परिवर्तनशील सूची प्रकार के उदाहरण का संदर्भ जो कभी भी उस चीज़ के संपर्क में नहीं आएगा जो उसे उत्परिवर्तित कर सकती है।

  • एक उत्परिवर्तित सूची का संदर्भ, जिसमें MyThings's विधियों के निष्पादन के अलावा , कोई अन्य संदर्भ संभवतः ब्रह्मांड में कहीं भी मौजूद नहीं हो सकता है।

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

  • एक उत्परिवर्तित सूची का संदर्भ जो कि उसके MyThingपास है, लेकिन जिसे उसने कुछ अन्य वस्तुओं के लिए भी उजागर किया है ताकि वे उसके साथ कुछ कर सकें।

हालांकि उन सभी क्षेत्रों में प्रकार हो सकते हैं List<String>, वे बहुत अलग चीजें रखते हैं। एक अभिव्यंजक भाषा उन अर्थों के बीच अंतर की अनुमति दे सकती है, लेकिन जावा नहीं करता है। चूंकि एक भाषा ऐसी चीजों (कम से कम जेनेरिक संदर्भों से बाहर) के लिए अर्थ को संलग्न कर सकती है और जेवीएम पर चल सकती है, जो उन अवधारणाओं को व्यक्त करने के लिए जेवीएम-लक्षित भाषाओं के लिए बहुत सारे कमरे छोड़ देती है जो जावा नहीं कर सकता।

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