जावा वर्चुअल मशीन: Difference between revisions

From Vigyanwiki
(Created page with "{{short description|Java Virtual machine}} {{Infobox CPU architecture | name = Java virtual machine | designer = Sun Microsystems | bits = 32-bit computing...")
 
No edit summary
Line 18: Line 18:
| fpr        =  
| fpr        =  
}}
}}
[[File:JvmSpec7.png|thumb|जावा वर्चुअल मशीन विशिष्टता जावा एसई 7 संस्करण पर आधारित जावा वर्चुअल मशीन (जेवीएम) आर्किटेक्चर का अवलोकन]]जावा [[आभासी मशीन]] (जेवीएम) एक वर्चुअल मशीन है जो कंप्यूटर को [[जावा (सॉफ्टवेयर प्लेटफॉर्म)]] प्रोग्राम चलाने के साथ-साथ [[जेवीएम भाषाओं की सूची]] में लिखे प्रोग्राम को चलाने में सक्षम बनाती है जो कि [[जावा बाइटकोड]] में भी संकलित हैं। JVM एक विनिर्देश (तकनीकी मानक) द्वारा विस्तृत है जो औपचारिक रूप से वर्णन करता है कि JVM कार्यान्वयन में क्या आवश्यक है। एक विनिर्देश होने से विभिन्न कार्यान्वयनों में जावा प्रोग्रामों की अंतःक्रियाशीलता सुनिश्चित होती है ताकि [[जावा विकास किट]] (जेडीके) का उपयोग करने वाले प्रोग्राम लेखकों को अंतर्निहित हार्डवेयर प्लेटफॉर्म की विशिष्टताओं के बारे में चिंता करने की आवश्यकता न हो।
[[File:JvmSpec7.png|thumb|जावा आभासी मशीन विशिष्टता जावा एसई 7 संस्करण पर आधारित जावा आभासी मशीन (जेवीएम) आर्किटेक्चर का अवलोकन]]जावा [[आभासी मशीन]] (जेवीएम) एक आभासी मशीन है जो कंप्यूटर को [[जावा (सॉफ्टवेयर प्लेटफॉर्म)]] प्रोग्राम चलाने के साथ-साथ [[जेवीएम भाषाओं की सूची]] में लिखे प्रोग्राम को चलाने में सक्षम बनाती है, जो कि [[जावा बाइटकोड]] में भी संकलित हैं। जेवीएम एक विनिर्देश (तकनीकी मानक) द्वारा विस्तृत है जो औपचारिक रूप से वर्णन करता है, कि जेवीएम कार्यान्वयन में क्या आवश्यक है। एक विनिर्देश होने से विभिन्न कार्यान्वयनों में जावा प्रोग्रामों की अंतःक्रियाशीलता सुनिश्चित होती है जिससे [[जावा विकास किट]] (जेडीके) का उपयोग करने वाले प्रोग्राम लेखकों को अंतर्निहित हार्डवेयर प्लेटफॉर्म की विशिष्टताओं के बारे में चिंता करने की आवश्यकता न हो।


जेवीएम [[संदर्भ कार्यान्वयन]] [[ओपनजेडीके]] प्रोजेक्ट द्वारा [[खुला स्रोत सॉफ्टवेयर]] कोड के रूप में विकसित किया गया है और इसमें [[हॉटस्पॉट (वर्चुअल मशीन)]] नामक एक [[जेआईटी कंपाइलर]] शामिल है। [[Oracle Corporation]] से उपलब्ध व्यावसायिक रूप से समर्थित Java रिलीज़ OpenJDK रनटाइम पर आधारित हैं। ग्रहण [[OpenJ9]] OpenJDK के लिए एक अन्य खुला स्रोत JVM है।
जेवीएम [[संदर्भ कार्यान्वयन]] [[ओपनजेडीके|ओपन जेडीके]] प्रोजेक्ट द्वारा [[खुला स्रोत सॉफ्टवेयर]] कोड के रूप में विकसित किया गया है, और इसमें [[हॉटस्पॉट (वर्चुअल मशीन)|हॉटस्पॉट (आभासी मशीन)]] नामक एक [[जेआईटी कंपाइलर]] शामिल है। [[Oracle Corporation|ऑरेकल कारपोरेशन]] से उपलब्ध व्यावसायिक रूप से समर्थित जावा रिलीज़ ओपन जेडीके रनटाइम पर आधारित हैं। ग्रहण [[OpenJ9|ओपनJ9]] ओपन जेडीके के लिए एक अन्य खुला स्रोत जेवीएम है।


== जेवीएम विनिर्देश ==
== जेवीएम विनिर्देश ==
जावा वर्चुअल मशीन एक विनिर्देशन द्वारा परिभाषित एक अमूर्त (आभासी) कंप्यूटर है। यह जावा रनटाइम वातावरण का एक हिस्सा है।
जावा आभासी मशीन एक विनिर्देशन द्वारा परिभाषित एक अमूर्त (आभासी) कंप्यूटर है। यह जावा रनटाइम वातावरण का एक हिस्सा है।[[कचरा संग्रह (कंप्यूटर विज्ञान)]] | कचरा-संग्रह विधिकलन का उपयोग किया जाता है और जावा आभासी मशीन निर्देशों ([[मशीन कोड]] में उनका अनुवाद) के किसी भी आंतरिक अनुकूलन को निर्दिष्ट नहीं किया जाता है। इस चूक का मुख्य कारण कार्यान्वयनकर्ताओं को अनावश्यक रूप से विवश नहीं करना है। जावा आभासी मशीन के सार विनिर्देश के कुछ ठोस कार्यान्वयन के अंदर ही कोई जावा एप्लिकेशन चलाया जा सकता है।<ref>Bill Venners, ''[http://www.artima.com/insidejvm/ed2/index.html Inside the Java Virtual Machine]'' Chapter 5</ref>
[[कचरा संग्रह (कंप्यूटर विज्ञान)]] | कचरा-संग्रह एल्गोरिथ्म का उपयोग किया जाता है और जावा वर्चुअल मशीन निर्देशों ([[मशीन कोड]] में उनका अनुवाद) के किसी भी आंतरिक अनुकूलन को निर्दिष्ट नहीं किया जाता है। इस चूक का मुख्य कारण कार्यान्वयनकर्ताओं को अनावश्यक रूप से विवश नहीं करना है। जावा वर्चुअल मशीन के सार विनिर्देश के कुछ ठोस कार्यान्वयन के अंदर ही कोई जावा एप्लिकेशन चलाया जा सकता है।<ref>Bill Venners, ''[http://www.artima.com/insidejvm/ed2/index.html Inside the Java Virtual Machine]'' Chapter 5</ref>
जावा प्लेटफॉर्म, मानक संस्करण (J2SE) 5.0 के साथ शुरू करते हुए, जेवीएम विनिर्देशन में परिवर्तन जेएसआर 924 के रूप में जावा सामुदायिक प्रक्रिया के तहत विकसित किए गए हैं।<ref>{{cite web|url=http://www.jcp.org/en/jsr/detail?id=924 |title=जावा कम्युनिटी प्रोसेस (एसएम) प्रोग्राम - जेएसआर: जावा विशिष्टता अनुरोध - विवरण जेएसआर # 924|publisher=Jcp.org |access-date=2015-06-26}}</ref> {{As of|2006}}, वर्ग के लिए प्रस्तावित परिवर्तनों का समर्थन करने के लिए विनिर्देशन में परिवर्तन (फ़ाइल स्वरूप) (जेएसआर 202)<ref>{{cite web|url=http://www.jcp.org/en/jsr/detail?id=202 |title=जावा कम्युनिटी प्रोसेस (एसएम) प्रोग्राम - जेएसआर: जावा विशिष्टता अनुरोध - विवरण जेएसआर # 202|publisher=Jcp.org |access-date=2015-06-26}}</ref> जेएसआर 924 के रख-रखाव रिलीज़ के रूप में किया जा रहा है। जेवीएम के लिए विनिर्देश ब्लू बुक के रूप में प्रकाशित किया गया था,<ref>''[http://java.sun.com/docs/books/vmspec/ The Java Virtual Machine Specification]'' (the [http://java.sun.com/docs/books/vmspec/html/VMSpecTOC.doc.html first] and [http://java.sun.com/docs/books/vmspec/2nd-edition/html/VMSpecTOC.doc.html second] editions are also available online).</ref> प्रस्तावना में कहा गया है:
जावा प्लेटफॉर्म, मानक संस्करण (J2SE) 5.0 के साथ शुरू करते हुए, JVM विनिर्देशन में परिवर्तन JSR 924 के रूप में Java सामुदायिक प्रक्रिया के तहत विकसित किए गए हैं।<ref>{{cite web|url=http://www.jcp.org/en/jsr/detail?id=924 |title=जावा कम्युनिटी प्रोसेस (एसएम) प्रोग्राम - जेएसआर: जावा विशिष्टता अनुरोध - विवरण जेएसआर # 924|publisher=Jcp.org |access-date=2015-06-26}}</ref> {{As of|2006}}, वर्ग के लिए प्रस्तावित परिवर्तनों का समर्थन करने के लिए विनिर्देशन में परिवर्तन (फ़ाइल स्वरूप) (JSR 202)<ref>{{cite web|url=http://www.jcp.org/en/jsr/detail?id=202 |title=जावा कम्युनिटी प्रोसेस (एसएम) प्रोग्राम - जेएसआर: जावा विशिष्टता अनुरोध - विवरण जेएसआर # 202|publisher=Jcp.org |access-date=2015-06-26}}</ref> JSR 924 के रखरखाव रिलीज़ के रूप में किया जा रहा है। JVM के लिए विनिर्देश ब्लू बुक के रूप में प्रकाशित किया गया था,<ref>''[http://java.sun.com/docs/books/vmspec/ The Java Virtual Machine Specification]'' (the [http://java.sun.com/docs/books/vmspec/html/VMSpecTOC.doc.html first] and [http://java.sun.com/docs/books/vmspec/2nd-edition/html/VMSpecTOC.doc.html second] editions are also available online).</ref> प्रस्तावना में कहा गया है:
{{quote|[[Sun Microsystems|We]] intend that this specification should sufficiently document the Java Virtual Machine to make possible compatible clean-room implementations. Oracle provides tests that verify the proper operation of implementations of the Java Virtual Machine.}}
{{quote|[[Sun Microsystems|We]] intend that this specification should sufficiently document the Java Virtual Machine to make possible compatible clean-room implementations. Oracle provides tests that verify the proper operation of implementations of the Java Virtual Machine.}}
ओरेकल के जेवीएम में से एक का नाम हॉटस्पॉट है; दूसरा, BEA सिस्टम्स से विरासत में मिला है, [[JRockit]] है। ओरेकल जावा ट्रेडमार्क का मालिक है और ओरेकल के विनिर्देशों के साथ पूरी तरह से संगत के रूप में कार्यान्वयन सूट को प्रमाणित करने के लिए इसके उपयोग की अनुमति दे सकता है।
ओरेकल के जेवीएम में से एक का नाम हॉटस्पॉट है; दूसरा, BEA सिस्टम्स से विरासत में मिला है, [[JRockit]] है। ओरेकल जावा ट्रेडमार्क का मालिक है और ओरेकल के विनिर्देशों के साथ पूरी तरह से संगत के रूप में कार्यान्वयन सूट को प्रमाणित करने के लिए इसके उपयोग की अनुमति दे सकता है।
Line 44: Line 43:
सामान्य तौर पर, तीन प्रकार के क्लास लोडर होते हैं: बूटस्ट्रैप क्लास लोडर, एक्सटेंशन क्लास लोडर और सिस्टम / एप्लिकेशन क्लास लोडर।
सामान्य तौर पर, तीन प्रकार के क्लास लोडर होते हैं: बूटस्ट्रैप क्लास लोडर, एक्सटेंशन क्लास लोडर और सिस्टम / एप्लिकेशन क्लास लोडर।


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


=== वर्चुअल मशीन आर्किटेक्चर ===
=== आभासी मशीन आर्किटेक्चर ===
जेवीएम विशिष्ट प्रकार के डेटा पर काम करता है जैसा कि जावा वर्चुअल मशीन विनिर्देशों में निर्दिष्ट है। डेटा प्रकारों को विभाजित किया जा सकता है<ref>{{Cite web|url=https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.2|title = अध्याय 2. जावा वर्चुअल मशीन की संरचना}}</ref> आदिम प्रकारों में ([[पूर्णांक]], फ़्लोटिंग-पॉइंट, लंबा आदि) और संदर्भ प्रकार। पहले के जेवीएम केवल [[32-बिट कंप्यूटिंग]]|32-बिट मशीन थे। <code>long</code> और <code>double</code> प्रकार, जो [[64-बिट कंप्यूटिंग]] | 64-बिट्स हैं, मूल रूप से समर्थित हैं, लेकिन फ्रेम के स्थानीय चर या ऑपरेंड स्टैक में भंडारण की दो इकाइयों का उपभोग करते हैं, क्योंकि प्रत्येक इकाई 32 बिट्स है। <code>boolean</code>, <code>byte</code>, <code>short</code>, और <code>char</code> प्रकार सभी साइन-विस्तारित हैं (छोड़कर <code>char</code> जो साइन एक्सटेंशन#zero-extended|zero-extended) है और 32-बिट पूर्णांक के रूप में संचालित होता है, जैसा कि <code>int</code> प्रकार। छोटे प्रकारों में लोडिंग, भंडारण और प्रकार रूपांतरण के लिए केवल कुछ प्रकार-विशिष्ट निर्देश होते हैं। <code>boolean</code> 8-बिट के रूप में संचालित होता है <code>byte</code> मान, 0 प्रतिनिधित्व के साथ <code>false</code> और 1 प्रतिनिधित्व करता है <code>true</code>. (यद्यपि <code>boolean</code> जावा वर्चुअल मशीन विशिष्टता के बाद से एक प्रकार के रूप में माना गया है, द्वितीय संस्करण ने इस मुद्दे को संकलित और निष्पादित कोड में स्पष्ट किया है, इसमें थोड़ा अंतर है <code>boolean</code> और ए <code>byte</code> [[विधि हस्ताक्षर]] और बूलियन सरणियों के प्रकार में नाम मैंगलिंग # जावा को छोड़कर। <code>boolean</code>s in विधि हस्ताक्षर के रूप में उलझे हुए हैं <code>Z</code> जबकि <code>byte</code>एस के रूप में क्षतिग्रस्त हैं <code>B</code>. बूलियन सरणियाँ प्रकार को ले जाती हैं <code>boolean[]</code> लेकिन प्रति तत्व 8 बिट्स का उपयोग करें, और जेवीएम में बूलियन्स को [[बिट सरणी]] में पैक करने की कोई अंतर्निहित क्षमता नहीं है, इसलिए वे जिस प्रकार का प्रदर्शन करते हैं और उसी के समान व्यवहार करते हैं <code>byte</code> सरणियाँ। अन्य सभी उपयोगों में, <code>boolean</code> जेवीएम के लिए प्रकार प्रभावी रूप से अज्ञात है क्योंकि बूलियन पर काम करने के लिए सभी निर्देशों का उपयोग भी किया जाता है <code>byte</code>एस।) हालांकि नए जेवीएम रिलीज (ओपनजेडीके हॉटस्पॉट जेवीएम) 64-बिट का समर्थन करते हैं, आपके पास 64-बिट ओएस पर 32-बिट/64-बिट जेवीएम हो सकता है। 64-बिट वातावरण में जावा चलाने का प्राथमिक लाभ बड़ा पता स्थान है। यह बहुत बड़े जावा हीप आकार और जावा थ्रेड्स की बढ़ी हुई अधिकतम संख्या की अनुमति देता है, जो कुछ प्रकार के बड़े अनुप्रयोगों के लिए आवश्यक है, हालांकि 32-बिट JVM की तुलना में 64-बिट JVM का उपयोग करने में एक प्रदर्शन हिट है।
जेवीएम विशिष्ट प्रकार के डेटा पर काम करता है जैसा कि जावा आभासी मशीन विनिर्देशों में निर्दिष्ट है। डेटा प्रकारों को विभाजित किया जा सकता है<ref>{{Cite web|url=https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.2|title = अध्याय 2. जावा वर्चुअल मशीन की संरचना}}</ref> आदिम प्रकारों में ([[पूर्णांक]], फ़्लोटिंग-पॉइंट, लंबा आदि) और संदर्भ प्रकार। पहले के जेवीएम केवल [[32-बिट कंप्यूटिंग]]|32-बिट मशीन थे। <code>long</code> और <code>double</code> प्रकार, जो [[64-बिट कंप्यूटिंग]] | 64-बिट्स हैं, मूल रूप से समर्थित हैं, लेकिन फ्रेम के स्थानीय चर या ऑपरेंड स्टैक में भंडारण की दो इकाइयों का उपभोग करते हैं, क्योंकि प्रत्येक इकाई 32 बिट्स है। <code>boolean</code>, <code>byte</code>, <code>short</code>, और <code>char</code> प्रकार सभी साइन-विस्तारित हैं (छोड़कर <code>char</code> जो साइन एक्सटेंशन#zero-extended|zero-extended) है और 32-बिट पूर्णांक के रूप में संचालित होता है, जैसा कि <code>int</code> प्रकार। छोटे प्रकारों में लोडिंग, भंडारण और प्रकार रूपांतरण के लिए केवल कुछ प्रकार-विशिष्ट निर्देश होते हैं। <code>boolean</code> 8-बिट के रूप में संचालित होता है <code>byte</code> मान, 0 प्रतिनिधित्व के साथ <code>false</code> और 1 प्रतिनिधित्व करता है <code>true</code>. (यद्यपि <code>boolean</code> जावा आभासी मशीन विशिष्टता के बाद से एक प्रकार के रूप में माना गया है, द्वितीय संस्करण ने इस मुद्दे को संकलित और निष्पादित कोड में स्पष्ट किया है, इसमें थोड़ा अंतर है <code>boolean</code> और ए <code>byte</code> [[विधि हस्ताक्षर]] और बूलियन सरणियों के प्रकार में नाम मैंगलिंग # जावा को छोड़कर। <code>boolean</code>s in विधि हस्ताक्षर के रूप में उलझे हुए हैं <code>Z</code> जबकि <code>byte</code>एस के रूप में क्षतिग्रस्त हैं <code>B</code>. बूलियन सरणियाँ प्रकार को ले जाती हैं <code>boolean[]</code> लेकिन प्रति तत्व 8 बिट्स का उपयोग करें, और जेवीएम में बूलियन्स को [[बिट सरणी]] में पैक करने की कोई अंतर्निहित क्षमता नहीं है, इसलिए वे जिस प्रकार का प्रदर्शन करते हैं और उसी के समान व्यवहार करते हैं <code>byte</code> सरणियाँ। अन्य सभी उपयोगों में, <code>boolean</code> जेवीएम के लिए प्रकार प्रभावी रूप से अज्ञात है क्योंकि बूलियन पर काम करने के लिए सभी निर्देशों का उपयोग भी किया जाता है <code>byte</code>एस।) हालांकि नए जेवीएम रिलीज (ओपनजेडीके हॉटस्पॉट जेवीएम) 64-बिट का समर्थन करते हैं, आपके पास 64-बिट ओएस पर 32-बिट/64-बिट जेवीएम हो सकता है। 64-बिट वातावरण में जावा चलाने का प्राथमिक लाभ बड़ा पता स्थान है। यह बहुत बड़े जावा हीप आकार और जावा थ्रेड्स की बढ़ी हुई अधिकतम संख्या की अनुमति देता है, जो कुछ प्रकार के बड़े अनुप्रयोगों के लिए आवश्यक है, हालांकि 32-बिट जेवीएम की तुलना में 64-बिट जेवीएम का उपयोग करने में एक प्रदर्शन हिट है।


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


प्रत्येक फ्रेम एक ऑपरेंड स्टैक और स्थानीय चर की एक सरणी प्रदान करता है। ऑपरेंड स्टैक का उपयोग ऑपरेशंस के लिए कंप्यूटेशंस के लिए किया जाता है और कॉल की गई विधि के रिटर्न वैल्यू को प्राप्त करने के लिए किया जाता है, जबकि स्थानीय चर [[प्रोसेसर रजिस्टर]] के समान उद्देश्य की सेवा करते हैं और विधि तर्कों को पारित करने के लिए भी उपयोग किए जाते हैं। इस प्रकार, JVM एक [[स्टैक मशीन]] और एक [[रजिस्टर मशीन]] दोनों है। (व्यावहारिक रूप से, हॉटस्पॉट पूरी तरह से समाप्त कर देता है
प्रत्येक फ्रेम एक ऑपरेंड स्टैक और स्थानीय चर की एक सरणी प्रदान करता है। ऑपरेंड स्टैक का उपयोग ऑपरेशंस के लिए कंप्यूटेशंस के लिए किया जाता है और कॉल की गई विधि के रिटर्न वैल्यू को प्राप्त करने के लिए किया जाता है, जबकि स्थानीय चर [[प्रोसेसर रजिस्टर]] के समान उद्देश्य की सेवा करते हैं और विधि तर्कों को पारित करने के लिए भी उपयोग किए जाते हैं। इस प्रकार, जेवीएम एक [[स्टैक मशीन]] और एक [[रजिस्टर मशीन]] दोनों है। (व्यावहारिक रूप से, हॉटस्पॉट पूरी तरह से समाप्त कर देता है
इंटरप्रेटेड मोड में चलने पर भी नेटिव थ्रेड/कॉल स्टैक के अलावा हर स्टैक, क्योंकि इसका टेंपलेटिंग इंटरप्रेटर तकनीकी रूप से छद्म रूप में कंपाइलर है)
इंटरप्रेटेड मोड में चलने पर भी नेटिव थ्रेड/कॉल स्टैक के अलावा हर स्टैक, क्योंकि इसका टेंपलेटिंग इंटरप्रेटर तकनीकी रूप से छद्म रूप में कंपाइलर है)


Line 69: Line 68:
* [[monitor (synchronization)|Monitor-based concurrency]]
* [[monitor (synchronization)|Monitor-based concurrency]]
}}
}}
उद्देश्य द्विआधारी संगतता है। प्रत्येक विशेष होस्ट [[ऑपरेटिंग सिस्टम]] को JVM और रनटाइम के अपने कार्यान्वयन की आवश्यकता होती है। ये जेवीएम बाइटकोड को समान रूप से समझते हैं, लेकिन वास्तविक कार्यान्वयन अलग हो सकता है। केवल बायटेकोड का अनुकरण करने से अधिक जटिल [[जावा क्लास लाइब्रेरी]] को संगत और कुशलता से कार्यान्वित करना है जिसे प्रत्येक होस्ट ऑपरेटिंग सिस्टम में मैप किया जाना चाहिए।
उद्देश्य द्विआधारी संगतता है। प्रत्येक विशेष होस्ट [[ऑपरेटिंग सिस्टम]] को जेवीएम और रनटाइम के अपने कार्यान्वयन की आवश्यकता होती है। ये जेवीएम बाइटकोड को समान रूप से समझते हैं, लेकिन वास्तविक कार्यान्वयन अलग हो सकता है। केवल बायटेकोड का अनुकरण करने से अधिक जटिल [[जावा क्लास लाइब्रेरी]] को संगत और कुशलता से कार्यान्वित करना है जिसे प्रत्येक होस्ट ऑपरेटिंग सिस्टम में मैप किया जाना चाहिए।


ये निर्देश आम के एक सेट पर काम करते हैं {{vanchor|abstracted [[data type]]s|DATA_TYPE}} बल्कि किसी विशिष्ट निर्देश सेट आर्किटेक्चर के [[मूल डेटा प्रकार]]।
ये निर्देश आम के एक सेट पर काम करते हैं {{vanchor|abstracted [[data type]]s|DATA_TYPE}} बल्कि किसी विशिष्ट निर्देश सेट आर्किटेक्चर के [[मूल डेटा प्रकार]]।
Line 75: Line 74:
=== जेवीएम भाषाएं ===
=== जेवीएम भाषाएं ===
{{Main|List of JVM languages}}
{{Main|List of JVM languages}}
एक जेवीएम भाषा कार्यक्षमता वाली कोई भी भाषा है जिसे एक वैध वर्ग फ़ाइल के रूप में व्यक्त किया जा सकता है जिसे जावा वर्चुअल मशीन द्वारा होस्ट किया जा सकता है। एक वर्ग फ़ाइल में जावा वर्चुअल मशीन निर्देश ([[जावा बाइट कोड]]) और एक प्रतीक तालिका, साथ ही अन्य सहायक जानकारी होती है। क्लास फाइल फॉर्मेट हार्डवेयर- और ऑपरेटिंग सिस्टम-इंडिपेंडेंट बाइनरी फॉर्मेट है जिसका इस्तेमाल संकलित क्लास और इंटरफेस को दर्शाने के लिए किया जाता है।<ref>{{cite web|url=http://docs.oracle.com/javase/specs/jvms/se7/jvms7.pdf |title=जावा वर्चुअल मशीन विशिष्टता: जावा एसई 7 संस्करण|publisher=Docs.oracle.com |access-date=2015-06-26}}</ref>
एक जेवीएम भाषा कार्यक्षमता वाली कोई भी भाषा है जिसे एक वैध वर्ग फ़ाइल के रूप में व्यक्त किया जा सकता है जिसे जावा आभासी मशीन द्वारा होस्ट किया जा सकता है। एक वर्ग फ़ाइल में जावा आभासी मशीन निर्देश ([[जावा बाइट कोड]]) और एक प्रतीक तालिका, साथ ही अन्य सहायक जानकारी होती है। क्लास फाइल फॉर्मेट हार्डवेयर- और ऑपरेटिंग सिस्टम-इंडिपेंडेंट बाइनरी फॉर्मेट है जिसका इस्तेमाल संकलित क्लास और इंटरफेस को दर्शाने के लिए किया जाता है।<ref>{{cite web|url=http://docs.oracle.com/javase/specs/jvms/se7/jvms7.pdf |title=जावा वर्चुअल मशीन विशिष्टता: जावा एसई 7 संस्करण|publisher=Docs.oracle.com |access-date=2015-06-26}}</ref>
कई JVM भाषाएँ हैं, दोनों पुरानी भाषाएँ JVM में पोर्ट की गई हैं और पूरी तरह से नई भाषाएँ हैं। [[JRuby]] और [[Jython]] शायद मौजूदा भाषाओं के सबसे प्रसिद्ध पोर्ट हैं, यानी क्रमशः [[रूबी (प्रोग्रामिंग भाषा)]] और पायथन (प्रोग्रामिंग लैंग्वेज)। जावा बाइटकोड, [[क्लोजर]], [[अपाचे ग्रूवी]], [[स्काला (प्रोग्रामिंग भाषा)]] और [[कोटलिन (प्रोग्रामिंग भाषा)]] को संकलित करने के लिए स्क्रैच से बनाई गई नई भाषाओं में से सबसे लोकप्रिय हो सकती हैं। जेवीएम भाषाओं के साथ एक उल्लेखनीय विशेषता यह है कि वे [[भाषा इंटरऑपरेबिलिटी]] हैं, ताकि, उदाहरण के लिए, स्काला लाइब्रेरी का उपयोग जावा प्रोग्राम के साथ किया जा सके और इसके विपरीत।<ref>{{cite web |url=http://www.scala-lang.org/old/faq/4 |title=अक्सर पूछे जाने वाले प्रश्न - जावा इंटरऑपरेबिलिटी|author=<!--Staff writer(s); no by-line.--> |website=scala-lang.org |access-date=2015-11-18}}</ref>
कई जेवीएम भाषाएँ हैं, दोनों पुरानी भाषाएँ जेवीएम में पोर्ट की गई हैं और पूरी तरह से नई भाषाएँ हैं। [[JRuby]] और [[Jython]] शायद मौजूदा भाषाओं के सबसे प्रसिद्ध पोर्ट हैं, यानी क्रमशः [[रूबी (प्रोग्रामिंग भाषा)]] और पायथन (प्रोग्रामिंग लैंग्वेज)। जावा बाइटकोड, [[क्लोजर]], [[अपाचे ग्रूवी]], [[स्काला (प्रोग्रामिंग भाषा)]] और [[कोटलिन (प्रोग्रामिंग भाषा)]] को संकलित करने के लिए स्क्रैच से बनाई गई नई भाषाओं में से सबसे लोकप्रिय हो सकती हैं। जेवीएम भाषाओं के साथ एक उल्लेखनीय विशेषता यह है कि वे [[भाषा इंटरऑपरेबिलिटी]] हैं, ताकि, उदाहरण के लिए, स्काला लाइब्रेरी का उपयोग जावा प्रोग्राम के साथ किया जा सके और इसके विपरीत।<ref>{{cite web |url=http://www.scala-lang.org/old/faq/4 |title=अक्सर पूछे जाने वाले प्रश्न - जावा इंटरऑपरेबिलिटी|author=<!--Staff writer(s); no by-line.--> |website=scala-lang.org |access-date=2015-11-18}}</ref>
जावा 7 जेवीएम जेएसआर 292 लागू करता है: गतिशील रूप से टाइप की गई भाषाओं का समर्थन करता है<ref>{{cite web|url=https://jcp.org/en/jsr/detail?id=292 |title=जावा कम्युनिटी प्रोसेस (एसएम) प्रोग्राम - जेएसआर: जावा विशिष्टता अनुरोध - विवरण जेएसआर # 292|publisher=Jcp.org |access-date=2015-06-26}}</ref> जावा प्लेटफॉर्म पर, एक नई सुविधा जो जेवीएम में गतिशील रूप से टाइप की गई भाषाओं का समर्थन करती है। यह सुविधा [[दा विंची मशीन]] परियोजना के भीतर विकसित की गई है जिसका मिशन जेवीएम का विस्तार करना है ताकि यह जावा के अलावा अन्य भाषाओं का समर्थन करे।<ref>{{cite web|url=http://openjdk.java.net/projects/mlvm/ |title=दा विंची मशीन परियोजना|publisher=Openjdk.java.net |access-date=2015-06-26}}</ref><ref>{{cite web|url=http://www.oracle.com/technetwork/articles/javase/dyntypelang-142348.html |title=नई JDK 7 विशेषता: जावा वर्चुअल मशीन में गतिशील रूप से टाइप की गई भाषाओं के लिए समर्थन|publisher=Oracle.com |access-date=2015-06-26}}</ref>
जावा 7 जेवीएम जेएसआर 292 लागू करता है: गतिशील रूप से टाइप की गई भाषाओं का समर्थन करता है<ref>{{cite web|url=https://jcp.org/en/jsr/detail?id=292 |title=जावा कम्युनिटी प्रोसेस (एसएम) प्रोग्राम - जेएसआर: जावा विशिष्टता अनुरोध - विवरण जेएसआर # 292|publisher=Jcp.org |access-date=2015-06-26}}</ref> जावा प्लेटफॉर्म पर, एक नई सुविधा जो जेवीएम में गतिशील रूप से टाइप की गई भाषाओं का समर्थन करती है। यह सुविधा [[दा विंची मशीन]] परियोजना के भीतर विकसित की गई है जिसका मिशन जेवीएम का विस्तार करना है ताकि यह जावा के अलावा अन्य भाषाओं का समर्थन करे।<ref>{{cite web|url=http://openjdk.java.net/projects/mlvm/ |title=दा विंची मशीन परियोजना|publisher=Openjdk.java.net |access-date=2015-06-26}}</ref><ref>{{cite web|url=http://www.oracle.com/technetwork/articles/javase/dyntypelang-142348.html |title=नई JDK 7 विशेषता: जावा वर्चुअल मशीन में गतिशील रूप से टाइप की गई भाषाओं के लिए समर्थन|publisher=Oracle.com |access-date=2015-06-26}}</ref>




=== बायटेकोड सत्यापनकर्ता ===
=== बायटेकोड सत्यापनकर्ता ===
जावा का एक मूल दर्शन यह है कि यह इस दृष्टिकोण से स्वाभाविक रूप से सुरक्षित है कि कोई भी उपयोगकर्ता प्रोग्राम होस्ट मशीन को क्रैश नहीं कर सकता है या अन्यथा होस्ट मशीन पर अन्य संचालन के साथ अनुपयुक्त रूप से हस्तक्षेप कर सकता है, और यह कि विश्वसनीय से संबंधित कुछ विधियों और डेटा संरचनाओं की रक्षा करना संभव है एक ही JVM के भीतर निष्पादित अविश्वसनीय कोड द्वारा पहुंच या भ्रष्टाचार से कोड। इसके अलावा, सामान्य प्रोग्रामर त्रुटियां जो अक्सर डेटा भ्रष्टाचार या अप्रत्याशित व्यवहार का कारण बनती हैं, जैसे कि किसी सरणी के अंत तक पहुंचना या एक गैर-प्रारंभिक सूचक का उपयोग करना, होने की अनुमति नहीं है। जावा की कई विशेषताएं इस सुरक्षा को प्रदान करने के लिए गठबंधन करती हैं, जिसमें क्लास मॉडल, कचरा-एकत्रित #Heap और सत्यापनकर्ता शामिल हैं।
जावा का एक मूल दर्शन यह है कि यह इस दृष्टिकोण से स्वाभाविक रूप से सुरक्षित है कि कोई भी उपयोगकर्ता प्रोग्राम होस्ट मशीन को क्रैश नहीं कर सकता है या अन्यथा होस्ट मशीन पर अन्य संचालन के साथ अनुपयुक्त रूप से हस्तक्षेप कर सकता है, और यह कि विश्वसनीय से संबंधित कुछ विधियों और डेटा संरचनाओं की रक्षा करना संभव है एक ही जेवीएम के भीतर निष्पादित अविश्वसनीय कोड द्वारा पहुंच या भ्रष्टाचार से कोड। इसके अलावा, सामान्य प्रोग्रामर त्रुटियां जो अक्सर डेटा भ्रष्टाचार या अप्रत्याशित व्यवहार का कारण बनती हैं, जैसे कि किसी सरणी के अंत तक पहुंचना या एक गैर-प्रारंभिक सूचक का उपयोग करना, होने की अनुमति नहीं है। जावा की कई विशेषताएं इस सुरक्षा को प्रदान करने के लिए गठबंधन करती हैं, जिसमें क्लास मॉडल, कचरा-एकत्रित #Heap और सत्यापनकर्ता शामिल हैं।


JVM निष्पादित होने से पहले सभी बायटेकोड को सत्यापित करता है। इस सत्यापन में मुख्य रूप से तीन प्रकार के चेक होते हैं:
जेवीएम निष्पादित होने से पहले सभी बायटेकोड को सत्यापित करता है। इस सत्यापन में मुख्य रूप से तीन प्रकार के चेक होते हैं:


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


सत्यापनकर्ता मान्य कार्यक्रमों में केवल कुछ बायटेकोड अनुक्रमों की अनुमति देता है, उदा। एक शाखा (कंप्यूटर विज्ञान) | कूद (शाखा) निर्देश केवल उसी [[विधि (कंप्यूटर प्रोग्रामिंग)]] के भीतर एक निर्देश को लक्षित कर सकता है। इसके अलावा, सत्यापनकर्ता यह सुनिश्चित करता है कि कोई भी निर्देश एक निश्चित स्टैक स्थान पर संचालित होता है,<ref>{{cite web |title=सत्यापन प्रक्रिया|url=http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html#9766 |work=The Java Virtual Machine Specification |publisher=Sun Microsystems |year=1999 |access-date=2009-05-31}}</ref> JIT कंपाइलर को स्टैक एक्सेस को फिक्स्ड रजिस्टर एक्सेस में बदलने की अनुमति देता है। इस वजह से, JVM एक स्टैक आर्किटेक्चर है, जो JIT कंपाइलर का उपयोग करते समय रजिस्टर मशीन | रजिस्टर-आधारित आर्किटेक्चर पर एमुलेशन के लिए स्पीड पेनल्टी नहीं लगाता है। कोड-सत्यापित जेवीएम आर्किटेक्चर के चेहरे में, यह एक जेआईटी कंपाइलर से कोई फर्क नहीं पड़ता है कि इसे काल्पनिक रजिस्टरों या काल्पनिक स्टैक पदों का नाम दिया गया है जो लक्ष्य आर्किटेक्चर के रजिस्टरों को आवंटित किया जाना चाहिए। वास्तव में, कोड सत्यापन जेवीएम को क्लासिक स्टैक आर्किटेक्चर से अलग बनाता है, जिसमें से एक जेआईटी कंपाइलर के साथ कुशल अनुकरण अधिक जटिल होता है और आमतौर पर धीमी दुभाषिया द्वारा किया जाता है। इसके अतिरिक्त, डिफ़ॉल्ट JVM द्वारा उपयोग किया जाने वाला इंटरप्रेटर एक विशेष प्रकार है जिसे टेम्प्लेट इंटरप्रेटर के रूप में जाना जाता है, जो एक विशिष्ट इंटरप्रेटर की तरह स्टैक का अनुकरण करने के बजाय बायटेकोड को सीधे देशी, रजिस्टर आधारित मशीन भाषा में अनुवाद करता है।<ref>{{Cite web |url=https://openjdk.java.net/groups/hotspot/docs/RuntimeOverview.html#Interpreter |title=हॉटस्पॉट रनटाइम अवलोकन - दुभाषिया|website=OpenJDK|access-date=2021-05-24 |archive-date=2022-05-21 |archive-url=https://web.archive.org/web/20220521024017/https://openjdk.java.net/groups/hotspot/docs/RuntimeOverview.html#Interpreter |url-status=live }}</ref> (कई पहलुओं में हॉटस्पॉट इंटरप्रेटर को एक सच्चे दुभाषिया के बजाय एक JIT कंपाइलर माना जा सकता है), जिसका अर्थ है कि स्टैक आर्किटेक्चर जो कि बायटेकोड लक्ष्य वास्तव में कार्यान्वयन में उपयोग नहीं किया जाता है, लेकिन केवल मध्यवर्ती प्रतिनिधित्व के लिए एक विनिर्देश है जिसे अच्छी तरह से लागू किया जा सकता है एक रजिस्टर आधारित आर्किटेक्चर में (स्टैक आर्किटेक्चर का एक अन्य उदाहरण केवल एक विनिर्देश है और एक रजिस्टर आधारित वर्चुअल मशीन में लागू किया गया है जो कॉमन लैंग्वेज रनटाइम है)।<ref>{{Cite web|url=https://github.com/dotnet/runtime/issues/4775|title=सीएलआर रजिस्टर-आधारित क्यों नहीं बनाते? · अंक #4775 · डॉटनेट/रनटाइम|website=GitHub}}</ref>
सत्यापनकर्ता मान्य कार्यक्रमों में केवल कुछ बायटेकोड अनुक्रमों की अनुमति देता है, उदा। एक शाखा (कंप्यूटर विज्ञान) | कूद (शाखा) निर्देश केवल उसी [[विधि (कंप्यूटर प्रोग्रामिंग)]] के भीतर एक निर्देश को लक्षित कर सकता है। इसके अलावा, सत्यापनकर्ता यह सुनिश्चित करता है कि कोई भी निर्देश एक निश्चित स्टैक स्थान पर संचालित होता है,<ref>{{cite web |title=सत्यापन प्रक्रिया|url=http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html#9766 |work=The Java Virtual Machine Specification |publisher=Sun Microsystems |year=1999 |access-date=2009-05-31}}</ref> JIT कंपाइलर को स्टैक एक्सेस को फिक्स्ड रजिस्टर एक्सेस में बदलने की अनुमति देता है। इस वजह से, जेवीएम एक स्टैक आर्किटेक्चर है, जो JIT कंपाइलर का उपयोग करते समय रजिस्टर मशीन | रजिस्टर-आधारित आर्किटेक्चर पर एमुलेशन के लिए स्पीड पेनल्टी नहीं लगाता है। कोड-सत्यापित जेवीएम आर्किटेक्चर के चेहरे में, यह एक जेआईटी कंपाइलर से कोई फर्क नहीं पड़ता है कि इसे काल्पनिक रजिस्टरों या काल्पनिक स्टैक पदों का नाम दिया गया है जो लक्ष्य आर्किटेक्चर के रजिस्टरों को आवंटित किया जाना चाहिए। वास्तव में, कोड सत्यापन जेवीएम को क्लासिक स्टैक आर्किटेक्चर से अलग बनाता है, जिसमें से एक जेआईटी कंपाइलर के साथ कुशल अनुकरण अधिक जटिल होता है और आमतौर पर धीमी दुभाषिया द्वारा किया जाता है। इसके अतिरिक्त, डिफ़ॉल्ट जेवीएम द्वारा उपयोग किया जाने वाला इंटरप्रेटर एक विशेष प्रकार है जिसे टेम्प्लेट इंटरप्रेटर के रूप में जाना जाता है, जो एक विशिष्ट इंटरप्रेटर की तरह स्टैक का अनुकरण करने के बजाय बायटेकोड को सीधे देशी, रजिस्टर आधारित मशीन भाषा में अनुवाद करता है।<ref>{{Cite web |url=https://openjdk.java.net/groups/hotspot/docs/RuntimeOverview.html#Interpreter |title=हॉटस्पॉट रनटाइम अवलोकन - दुभाषिया|website=OpenJDK|access-date=2021-05-24 |archive-date=2022-05-21 |archive-url=https://web.archive.org/web/20220521024017/https://openjdk.java.net/groups/hotspot/docs/RuntimeOverview.html#Interpreter |url-status=live }}</ref> (कई पहलुओं में हॉटस्पॉट इंटरप्रेटर को एक सच्चे दुभाषिया के बजाय एक JIT कंपाइलर माना जा सकता है), जिसका अर्थ है कि स्टैक आर्किटेक्चर जो कि बायटेकोड लक्ष्य वास्तव में कार्यान्वयन में उपयोग नहीं किया जाता है, लेकिन केवल मध्यवर्ती प्रतिनिधित्व के लिए एक विनिर्देश है जिसे अच्छी तरह से लागू किया जा सकता है एक रजिस्टर आधारित आर्किटेक्चर में (स्टैक आर्किटेक्चर का एक अन्य उदाहरण केवल एक विनिर्देश है और एक रजिस्टर आधारित आभासी मशीन में लागू किया गया है जो कॉमन लैंग्वेज रनटाइम है)।<ref>{{Cite web|url=https://github.com/dotnet/runtime/issues/4775|title=सीएलआर रजिस्टर-आधारित क्यों नहीं बनाते? · अंक #4775 · डॉटनेट/रनटाइम|website=GitHub}}</ref>
बायटेकोड सत्यापनकर्ता के लिए मूल विनिर्देश प्राकृतिक भाषा का उपयोग करता है जो कुछ मामलों में अपूर्ण या गलत था। जेवीएम को एक औपचारिक प्रणाली के रूप में निर्दिष्ट करने के लिए कई प्रयास किए गए हैं। ऐसा करने से, वर्तमान जेवीएम कार्यान्वयन की सुरक्षा का अधिक गहन विश्लेषण किया जा सकता है, और संभावित सुरक्षा शोषण को रोका जा सकता है। यदि चलाया जा रहा एप्लिकेशन सुरक्षित साबित होता है, तो अनावश्यक सुरक्षा जांचों को छोड़ कर JVM को अनुकूलित करना भी संभव होगा।<ref>{{Cite book |doi=10.1145/320384.320397|chapter=A formal framework for the Java bytecode language and verifier|title=वस्तु-उन्मुख प्रोग्रामिंग, सिस्टम, भाषाओं और अनुप्रयोगों पर 14वें ACM SIGPLAN सम्मेलन की कार्यवाही - OOPSLA '99|pages=147–166|year=1999|last1=Freund|first1=Stephen N.|last2=Mitchell|first2=John C.|isbn=978-1581132380|citeseerx=10.1.1.2.4663|s2cid=14302964}}</ref>
बायटेकोड सत्यापनकर्ता के लिए मूल विनिर्देश प्राकृतिक भाषा का उपयोग करता है जो कुछ मामलों में अपूर्ण या गलत था। जेवीएम को एक औपचारिक प्रणाली के रूप में निर्दिष्ट करने के लिए कई प्रयास किए गए हैं। ऐसा करने से, वर्तमान जेवीएम कार्यान्वयन की सुरक्षा का अधिक गहन विश्लेषण किया जा सकता है, और संभावित सुरक्षा शोषण को रोका जा सकता है। यदि चलाया जा रहा एप्लिकेशन सुरक्षित साबित होता है, तो अनावश्यक सुरक्षा जांचों को छोड़ कर जेवीएम को अनुकूलित करना भी संभव होगा।<ref>{{Cite book |doi=10.1145/320384.320397|chapter=A formal framework for the Java bytecode language and verifier|title=वस्तु-उन्मुख प्रोग्रामिंग, सिस्टम, भाषाओं और अनुप्रयोगों पर 14वें ACM SIGPLAN सम्मेलन की कार्यवाही - OOPSLA '99|pages=147–166|year=1999|last1=Freund|first1=Stephen N.|last2=Mitchell|first2=John C.|isbn=978-1581132380|citeseerx=10.1.1.2.4663|s2cid=14302964}}</ref>




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


जावाकार्ड उद्योग द्वारा बाइटकोड सत्यापनकर्ताओं का औपचारिक प्रमाण किया गया है (जावा कार्ड बाइट कोड के लिए एक एम्बेडेड सत्यापनकर्ता का औपचारिक विकास)<ref>{{cite web|last1=Casset|first1=Ludovic|last2=Burdy|first2=Lilian|last3=Requet|first3=Antoine|date=10 April 2002|title=जावा कार्ड बाइट कोड के लिए एंबेडेड सत्यापनकर्ता का औपचारिक विकास|website=Inria - National Institute for Research in Digital Science and Technology at [[Côte d'Azur University#National_research_organizations|Côte d'Azur University]]|url-status=live|archive-date=3 October 2022|url=http://www-sop.inria.fr/everest/Lilian.Burdy/CBR02dsn.pdf|archive-url=https://web.archive.org/web/20221003184410/http://www-sop.inria.fr/everest/Lilian.Burdy/CBR02dsn.pdf}}</ref>)
जावाकार्ड उद्योग द्वारा बाइटकोड सत्यापनकर्ताओं का औपचारिक प्रमाण किया गया है (जावा कार्ड बाइट कोड के लिए एक एम्बेडेड सत्यापनकर्ता का औपचारिक विकास)<ref>{{cite web|last1=Casset|first1=Ludovic|last2=Burdy|first2=Lilian|last3=Requet|first3=Antoine|date=10 April 2002|title=जावा कार्ड बाइट कोड के लिए एंबेडेड सत्यापनकर्ता का औपचारिक विकास|website=Inria - National Institute for Research in Digital Science and Technology at [[Côte d'Azur University#National_research_organizations|Côte d'Azur University]]|url-status=live|archive-date=3 October 2022|url=http://www-sop.inria.fr/everest/Lilian.Burdy/CBR02dsn.pdf|archive-url=https://web.archive.org/web/20221003184410/http://www-sop.inria.fr/everest/Lilian.Burdy/CBR02dsn.pdf}}</ref>)
Line 105: Line 104:
जब जावा बाइटकोड एक दुभाषिया द्वारा निष्पादित किया जाता है, तो निष्पादन हमेशा मूल मशीन भाषा में संकलित उसी प्रोग्राम के निष्पादन से धीमा होगा। जावा बाइटकोड को निष्पादित करने के लिए जस्ट-इन-टाइम संकलन | जस्ट-इन-टाइम (JIT) कंपाइलर द्वारा इस समस्या को कम किया गया है। प्रोग्राम निष्पादित करते समय एक जेआईटी कंपाइलर जावा बाइटकोड को मूल मशीन भाषा में अनुवादित कर सकता है। कार्यक्रम के अनुवादित हिस्सों को तब व्याख्या की तुलना में अधिक तेज़ी से निष्पादित किया जा सकता है। यह तकनीक अक्सर निष्पादित प्रोग्राम के उन हिस्सों पर लागू होती है। इस तरह एक जेआईटी कंपाइलर समग्र निष्पादन समय को महत्वपूर्ण रूप से तेज कर सकता है।
जब जावा बाइटकोड एक दुभाषिया द्वारा निष्पादित किया जाता है, तो निष्पादन हमेशा मूल मशीन भाषा में संकलित उसी प्रोग्राम के निष्पादन से धीमा होगा। जावा बाइटकोड को निष्पादित करने के लिए जस्ट-इन-टाइम संकलन | जस्ट-इन-टाइम (JIT) कंपाइलर द्वारा इस समस्या को कम किया गया है। प्रोग्राम निष्पादित करते समय एक जेआईटी कंपाइलर जावा बाइटकोड को मूल मशीन भाषा में अनुवादित कर सकता है। कार्यक्रम के अनुवादित हिस्सों को तब व्याख्या की तुलना में अधिक तेज़ी से निष्पादित किया जा सकता है। यह तकनीक अक्सर निष्पादित प्रोग्राम के उन हिस्सों पर लागू होती है। इस तरह एक जेआईटी कंपाइलर समग्र निष्पादन समय को महत्वपूर्ण रूप से तेज कर सकता है।


Java प्रोग्रामिंग भाषा और Java bytecode के बीच कोई आवश्यक संबंध नहीं है। जावा में लिखे गए प्रोग्राम को वास्तविक कंप्यूटर की मशीन भाषा में सीधे संकलित किया जा सकता है और जावा के अलावा अन्य भाषाओं में लिखे गए प्रोग्राम को जावा बाइटकोड में संकलित किया जा सकता है।
जावा प्रोग्रामिंग भाषा और जावा bytecode के बीच कोई आवश्यक संबंध नहीं है। जावा में लिखे गए प्रोग्राम को वास्तविक कंप्यूटर की मशीन भाषा में सीधे संकलित किया जा सकता है और जावा के अलावा अन्य भाषाओं में लिखे गए प्रोग्राम को जावा बाइटकोड में संकलित किया जा सकता है।


Java bytecode का उद्देश्य प्लेटफ़ॉर्म-स्वतंत्र और सुरक्षित होना है।<ref>David J. Eck, ''[http://math.hws.edu/javanotes/c1/s3.html Introduction to Programming Using Java]'', Seventh Edition, Version 7.0, August 2014 at Section 1.3 "The Java Virtual Machine"</ref> कुछ जेवीएम कार्यान्वयन में एक दुभाषिया शामिल नहीं है, लेकिन इसमें केवल एक समय-समय पर संकलक शामिल है।<ref>''[http://docs.oracle.com/cd/E15289_01/doc.40/e15058/underst_jit.htm Oracle JRockit Introduction] {{Webarchive|url=https://web.archive.org/web/20150906145705/http://docs.oracle.com/cd/E15289_01/doc.40/e15058/underst_jit.htm |date=2015-09-06 }}'' Release R28 at 2. "Understanding Just-In-Time Compilation and Optimization"</ref>
जावा bytecode का उद्देश्य प्लेटफ़ॉर्म-स्वतंत्र और सुरक्षित होना है।<ref>David J. Eck, ''[http://math.hws.edu/javanotes/c1/s3.html Introduction to Programming Using Java]'', Seventh Edition, Version 7.0, August 2014 at Section 1.3 "The Java Virtual Machine"</ref> कुछ जेवीएम कार्यान्वयन में एक दुभाषिया शामिल नहीं है, लेकिन इसमें केवल एक समय-समय पर संकलक शामिल है।<ref>''[http://docs.oracle.com/cd/E15289_01/doc.40/e15058/underst_jit.htm Oracle JRockit Introduction] {{Webarchive|url=https://web.archive.org/web/20150906145705/http://docs.oracle.com/cd/E15289_01/doc.40/e15058/underst_jit.htm |date=2015-09-06 }}'' Release R28 at 2. "Understanding Just-In-Time Compilation and Optimization"</ref>




== वेब ब्राउज़र में जेवीएम ==
== वेब ब्राउज़र में जेवीएम ==
जावा प्लेटफॉर्म के जीवनकाल की शुरुआत में, JVM को [[समृद्ध वेब अनुप्रयोग]] बनाने के लिए एक वेब तकनीक के रूप में विपणन किया गया था। {{As of|2018}}अधिकांश वेब ब्राउज़र और ऑपरेटिंग सिस्टम बंडलिंग वेब ब्राउज़र जावा [[प्लग-इन (कंप्यूटिंग)]]|प्लग-इन के साथ शिप नहीं करते हैं, न ही वे किसी गैर-[[एडोब फ्लैश]] प्लग-इन को साइड-लोड करने की अनुमति देते हैं। जावा ब्राउज़र प्लगइन को [[JDK]] 9 में बहिष्कृत कर दिया गया था।<ref name="ars-nopluginjdk9">{{cite web|url=https://arstechnica.com/information-technology/2016/01/oracle-deprecates-the-java-browser-plugin-prepares-for-its-demise/|title=Oracle जावा ब्राउज़र प्लगइन को हटाता है, इसके निधन की तैयारी करता है|website=Ars Technica |date=28 January 2016 |access-date=15 April 2016}}</ref>
जावा प्लेटफॉर्म के जीवनकाल की शुरुआत में, जेवीएम को [[समृद्ध वेब अनुप्रयोग]] बनाने के लिए एक वेब तकनीक के रूप में विपणन किया गया था। {{As of|2018}}अधिकांश वेब ब्राउज़र और ऑपरेटिंग सिस्टम बंडलिंग वेब ब्राउज़र जावा [[प्लग-इन (कंप्यूटिंग)]]|प्लग-इन के साथ शिप नहीं करते हैं, न ही वे किसी गैर-[[एडोब फ्लैश]] प्लग-इन को साइड-लोड करने की अनुमति देते हैं। जावा ब्राउज़र प्लगइन को [[JDK]] 9 में बहिष्कृत कर दिया गया था।<ref name="ars-nopluginjdk9">{{cite web|url=https://arstechnica.com/information-technology/2016/01/oracle-deprecates-the-java-browser-plugin-prepares-for-its-demise/|title=Oracle जावा ब्राउज़र प्लगइन को हटाता है, इसके निधन की तैयारी करता है|website=Ars Technica |date=28 January 2016 |access-date=15 April 2016}}</ref>
[[NPAPI]] जावा ब्राउज़र प्लग-इन को JVM को HTML पेजों में एम्बेड किए गए तथाकथित [[जावा एप्लेट्स]] को निष्पादित करने की अनुमति देने के लिए डिज़ाइन किया गया था। प्लग-इन इंस्टॉल किए गए ब्राउज़रों के लिए, एप्लेट को निर्दिष्ट पृष्ठ पर एक आयताकार क्षेत्र में खींचने की अनुमति है। क्योंकि प्लग-इन में एक JVM शामिल है, जावा एप्लेट्स जावा प्रोग्रामिंग भाषा तक सीमित नहीं हैं; जेवीएम को लक्षित करने वाली कोई भी भाषा प्लग-इन में चल सकती है। एपीआई का एक प्रतिबंधित सेट एप्लेट्स को उपयोगकर्ता के माइक्रोफ़ोन या 3डी त्वरण तक पहुंच की अनुमति देता है, हालांकि एप्लेट्स अपने आयताकार क्षेत्र के बाहर पृष्ठ को संशोधित करने में सक्षम नहीं हैं। [[अडोब फ्लैश प्लेयर]], मुख्य प्रतिस्पर्धी तकनीक, इस संबंध में उसी तरह काम करती है।
[[NPAPI]] जावा ब्राउज़र प्लग-इन को जेवीएम को HTML पेजों में एम्बेड किए गए तथाकथित [[जावा एप्लेट्स]] को निष्पादित करने की अनुमति देने के लिए डिज़ाइन किया गया था। प्लग-इन इंस्टॉल किए गए ब्राउज़रों के लिए, एप्लेट को निर्दिष्ट पृष्ठ पर एक आयताकार क्षेत्र में खींचने की अनुमति है। क्योंकि प्लग-इन में एक जेवीएम शामिल है, जावा एप्लेट्स जावा प्रोग्रामिंग भाषा तक सीमित नहीं हैं; जेवीएम को लक्षित करने वाली कोई भी भाषा प्लग-इन में चल सकती है। एपीआई का एक प्रतिबंधित सेट एप्लेट्स को उपयोगकर्ता के माइक्रोफ़ोन या 3डी त्वरण तक पहुंच की अनुमति देता है, हालांकि एप्लेट्स अपने आयताकार क्षेत्र के बाहर पृष्ठ को संशोधित करने में सक्षम नहीं हैं। [[अडोब फ्लैश प्लेयर]], मुख्य प्रतिस्पर्धी तकनीक, इस संबंध में उसी तरह काम करती है।


{{As of|June 2015}} W3Tech के अनुसार, जावा एप्लेट और [[Microsoft सिल्वरलाइट]] का उपयोग सभी वेब साइटों के लिए 0.1% तक गिर गया था, जबकि फ्लैश 10.8% तक गिर गया था।<ref>{{cite web|url=http://w3techs.com/technologies/history_overview/client_side_language/all/y |title=क्लाइंट-साइड प्रोग्रामिंग भाषाओं के उपयोग में ऐतिहासिक वार्षिक रुझान, जून 2015|publisher=W3techs.com |access-date=2015-06-26}}</ref>
{{As of|June 2015}} W3Tech के अनुसार, जावा एप्लेट और [[Microsoft सिल्वरलाइट]] का उपयोग सभी वेब साइटों के लिए 0.1% तक गिर गया था, जबकि फ्लैश 10.8% तक गिर गया था।<ref>{{cite web|url=http://w3techs.com/technologies/history_overview/client_side_language/all/y |title=क्लाइंट-साइड प्रोग्रामिंग भाषाओं के उपयोग में ऐतिहासिक वार्षिक रुझान, जून 2015|publisher=W3techs.com |access-date=2015-06-26}}</ref>
Line 118: Line 117:


=== जावास्क्रिप्ट जेवीएम और दुभाषिए ===
=== जावास्क्रिप्ट जेवीएम और दुभाषिए ===
मई 2016 तक, JavaPoly उपयोगकर्ताओं को असंशोधित जावा पुस्तकालयों को आयात करने की अनुमति देता है, और उन्हें सीधे जावास्क्रिप्ट से आमंत्रित करता है। JavaPoly वेबसाइटों को असंशोधित जावा पुस्तकालयों का उपयोग करने की अनुमति देता है, भले ही उपयोगकर्ता के कंप्यूटर पर जावा स्थापित न हो।<ref>{{cite magazine|last= Krill|first= Paul|title= JavaPoly.js मौजूदा जावा कोड आयात करता है और इसे सीधे जावास्क्रिप्ट से आमंत्रित करता है|url= http://www.infoworld.com/article/3069995/java/new-javascript-library-brings-java-to-browsers-without-applets.html|magazine= InfoWorld|access-date= 18 July 2016|date= 13 May 2016}}</ref>
मई 2016 तक, जावाPoly उपयोगकर्ताओं को असंशोधित जावा पुस्तकालयों को आयात करने की अनुमति देता है, और उन्हें सीधे जावास्क्रिप्ट से आमंत्रित करता है। जावाPoly वेबसाइटों को असंशोधित जावा पुस्तकालयों का उपयोग करने की अनुमति देता है, भले ही उपयोगकर्ता के कंप्यूटर पर जावा स्थापित न हो।<ref>{{cite magazine|last= Krill|first= Paul|title= JavaPoly.js मौजूदा जावा कोड आयात करता है और इसे सीधे जावास्क्रिप्ट से आमंत्रित करता है|url= http://www.infoworld.com/article/3069995/java/new-javascript-library-brings-java-to-browsers-without-applets.html|magazine= InfoWorld|access-date= 18 July 2016|date= 13 May 2016}}</ref>




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


जेवीएम बाइटकोड को संकलित करना, जो जेवीएम भाषाओं में सार्वभौमिक है, भाषा के मौजूदा कंपाइलर को बायटेकोड बनाने की अनुमति देता है। जावास्क्रिप्ट कंपाइलर्स के लिए मुख्य जेवीएम बायटेकोड टीवीएम हैं,<ref>{{cite web |url = http://teavm.org/ |title = TeaVM प्रोजेक्ट होम पेज|publisher = Teavm.org |access-date = 2015-06-26 }}</ref> ड्रैगोम वेब एसडीके में समाहित संकलक,<ref>{{cite web |url = http://www.dragome.com/ |title = ड्रैगोम वेब एसडीके|publisher = Dragome.com |access-date = 2015-06-26 }}</ref> कैप्रेसर,<ref>{{cite web |url = http://wiki.apidesign.org/wiki/Bck2Brwsr |title = Bck2Brwsr - APIDesign|publisher = Wiki.apidesign.org |access-date = 2015-06-26 }}</ref> और j2js-संकलक।<ref>Wolfgang Kuehn (decatur). [https://github.com/decatur/j2js-compiler j2js-compiler] GitHub</ref>
जेवीएम बाइटकोड को संकलित करना, जो जेवीएम भाषाओं में सार्वभौमिक है, भाषा के मौजूदा कंपाइलर को बायटेकोड बनाने की अनुमति देता है। जावास्क्रिप्ट कंपाइलर्स के लिए मुख्य जेवीएम बायटेकोड टीवीएम हैं,<ref>{{cite web |url = http://teavm.org/ |title = TeaVM प्रोजेक्ट होम पेज|publisher = Teavm.org |access-date = 2015-06-26 }}</ref> ड्रैगोम वेब एसडीके में समाहित संकलक,<ref>{{cite web |url = http://www.dragome.com/ |title = ड्रैगोम वेब एसडीके|publisher = Dragome.com |access-date = 2015-06-26 }}</ref> कैप्रेसर,<ref>{{cite web |url = http://wiki.apidesign.org/wiki/Bck2Brwsr |title = Bck2Brwsr - APIDesign|publisher = Wiki.apidesign.org |access-date = 2015-06-26 }}</ref> और j2js-संकलक।<ref>Wolfgang Kuehn (decatur). [https://github.com/decatur/j2js-compiler j2js-compiler] GitHub</ref>
Line 131: Line 130:
{{Portal|Computer programming}}
{{Portal|Computer programming}}
* [[सामान्य भाषा रनटाइम]]
* [[सामान्य भाषा रनटाइम]]
* [[जावा वर्चुअल मशीनों की सूची]]
* [[जावा वर्चुअल मशीनों की सूची|जावा आभासी मशीनों की सूची]]
* जेवीएम भाषाओं की सूची
* जेवीएम भाषाओं की सूची
* [[जावा वर्चुअल मशीनों की तुलना]]
* [[जावा वर्चुअल मशीनों की तुलना|जावा आभासी मशीनों की तुलना]]
* आवेदन आभासी मशीनों की तुलना
* आवेदन आभासी मशीनों की तुलना
* [[स्वचालित अपवाद हैंडलिंग]]
* [[स्वचालित अपवाद हैंडलिंग]]
Line 154: Line 153:
*अंगुली का हस्ताक्षर
*अंगुली का हस्ताक्षर
*दुभाषिया (कंप्यूटिंग)
*दुभाषिया (कंप्यूटिंग)
*एप्लिकेशन वर्चुअल मशीनों की तुलना
*एप्लिकेशन आभासी मशीनों की तुलना
==संदर्भ==
==संदर्भ==
{{Reflist|30em}}
{{Reflist|30em}}
Line 167: Line 166:
{{Sun Microsystems}}
{{Sun Microsystems}}
[[श्रेणी:जावा वर्चुअल मशीन| ]]
[[श्रेणी:जावा वर्चुअल मशीन| ]]
[[श्रेणी:जावा (प्रोग्रामिंग भाषा)|वर्चुअल मशीन]]
[[श्रेणी:जावा (प्रोग्रामिंग भाषा)|आभासी मशीन]]
[[श्रेणी:जावा प्लेटफॉर्म सॉफ्टवेयर]]
[[श्रेणी:जावा प्लेटफॉर्म सॉफ्टवेयर]]
[[श्रेणी:जावा विशिष्टता अनुरोध|वर्चुअल मशीन]]
[[श्रेणी:जावा विशिष्टता अनुरोध|आभासी मशीन]]
[[श्रेणी:स्टैक-आधारित आभासी मशीनें]]
[[श्रेणी:स्टैक-आधारित आभासी मशीनें]]



Revision as of 20:37, 1 March 2023

Java virtual machine
DesignerSun Microsystems
Bits32-bit
Introduced1994
Version15.0.3[1]
TypeStack and register–register
EncodingVariable
BranchingCompare and branch
EndiannessBig
OpenYes
Registers
General purposePer-method operand stack (up to 65535 operands) plus per-method local variables (up to 65535)
जावा आभासी मशीन विशिष्टता जावा एसई 7 संस्करण पर आधारित जावा आभासी मशीन (जेवीएम) आर्किटेक्चर का अवलोकन

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

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

जेवीएम विनिर्देश

जावा आभासी मशीन एक विनिर्देशन द्वारा परिभाषित एक अमूर्त (आभासी) कंप्यूटर है। यह जावा रनटाइम वातावरण का एक हिस्सा है।कचरा संग्रह (कंप्यूटर विज्ञान) | कचरा-संग्रह विधिकलन का उपयोग किया जाता है और जावा आभासी मशीन निर्देशों (मशीन कोड में उनका अनुवाद) के किसी भी आंतरिक अनुकूलन को निर्दिष्ट नहीं किया जाता है। इस चूक का मुख्य कारण कार्यान्वयनकर्ताओं को अनावश्यक रूप से विवश नहीं करना है। जावा आभासी मशीन के सार विनिर्देश के कुछ ठोस कार्यान्वयन के अंदर ही कोई जावा एप्लिकेशन चलाया जा सकता है।[2] जावा प्लेटफॉर्म, मानक संस्करण (J2SE) 5.0 के साथ शुरू करते हुए, जेवीएम विनिर्देशन में परिवर्तन जेएसआर 924 के रूप में जावा सामुदायिक प्रक्रिया के तहत विकसित किए गए हैं।[3] As of 2006, वर्ग के लिए प्रस्तावित परिवर्तनों का समर्थन करने के लिए विनिर्देशन में परिवर्तन (फ़ाइल स्वरूप) (जेएसआर 202)[4] जेएसआर 924 के रख-रखाव रिलीज़ के रूप में किया जा रहा है। जेवीएम के लिए विनिर्देश ब्लू बुक के रूप में प्रकाशित किया गया था,[5] प्रस्तावना में कहा गया है:

We intend that this specification should sufficiently document the Java Virtual Machine to make possible compatible clean-room implementations. Oracle provides tests that verify the proper operation of implementations of the Java Virtual Machine.

ओरेकल के जेवीएम में से एक का नाम हॉटस्पॉट है; दूसरा, BEA सिस्टम्स से विरासत में मिला है, JRockit है। ओरेकल जावा ट्रेडमार्क का मालिक है और ओरेकल के विनिर्देशों के साथ पूरी तरह से संगत के रूप में कार्यान्वयन सूट को प्रमाणित करने के लिए इसके उपयोग की अनुमति दे सकता है।

क्लास लोडर

जेवीएम बाइट कोड की संगठनात्मक इकाइयों में से एक क्लास (कंप्यूटर प्रोग्रामिंग) है। एक क्लास लोडर कार्यान्वयन जावा क्लास फ़ाइल स्वरूप के अनुरूप कुछ भी पहचानने और लोड करने में सक्षम होना चाहिए। कोई भी कार्यान्वयन वर्ग फ़ाइलों के अलावा अन्य बाइनरी रूपों को पहचानने के लिए स्वतंत्र है, लेकिन इसे कक्षा फ़ाइलों को पहचानना होगा।

क्लास लोडर इस सख्त क्रम में तीन बुनियादी गतिविधियाँ करता है:

  1. लोड हो रहा है: एक प्रकार के लिए बाइनरी डेटा ढूँढता है और आयात करता है
  2. लिंकिंग: सत्यापन, तैयारी और (वैकल्पिक रूप से) समाधान करता है
    • सत्यापन: आयातित प्रकार की शुद्धता सुनिश्चित करता है
    • तैयारी: वर्ग चर के लिए स्मृति आवंटित करता है और स्मृति को डिफ़ॉल्ट मानों में प्रारंभ करता है
    • संकल्प: प्रतीकात्मक संदर्भों को प्रकार से प्रत्यक्ष संदर्भों में परिवर्तित करता है।
  3. इनिशियलाइज़ेशन: जावा कोड को इनिशियलाइज़ करता है जो क्लास वेरिएबल्स को उनके उचित शुरुआती मानों के लिए इनिशियलाइज़ करता है।

सामान्य तौर पर, तीन प्रकार के क्लास लोडर होते हैं: बूटस्ट्रैप क्लास लोडर, एक्सटेंशन क्लास लोडर और सिस्टम / एप्लिकेशन क्लास लोडर।

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

आभासी मशीन आर्किटेक्चर

जेवीएम विशिष्ट प्रकार के डेटा पर काम करता है जैसा कि जावा आभासी मशीन विनिर्देशों में निर्दिष्ट है। डेटा प्रकारों को विभाजित किया जा सकता है[6] आदिम प्रकारों में (पूर्णांक, फ़्लोटिंग-पॉइंट, लंबा आदि) और संदर्भ प्रकार। पहले के जेवीएम केवल 32-बिट कंप्यूटिंग|32-बिट मशीन थे। long और double प्रकार, जो 64-बिट कंप्यूटिंग | 64-बिट्स हैं, मूल रूप से समर्थित हैं, लेकिन फ्रेम के स्थानीय चर या ऑपरेंड स्टैक में भंडारण की दो इकाइयों का उपभोग करते हैं, क्योंकि प्रत्येक इकाई 32 बिट्स है। boolean, byte, short, और char प्रकार सभी साइन-विस्तारित हैं (छोड़कर char जो साइन एक्सटेंशन#zero-extended|zero-extended) है और 32-बिट पूर्णांक के रूप में संचालित होता है, जैसा कि int प्रकार। छोटे प्रकारों में लोडिंग, भंडारण और प्रकार रूपांतरण के लिए केवल कुछ प्रकार-विशिष्ट निर्देश होते हैं। boolean 8-बिट के रूप में संचालित होता है byte मान, 0 प्रतिनिधित्व के साथ false और 1 प्रतिनिधित्व करता है true. (यद्यपि boolean जावा आभासी मशीन विशिष्टता के बाद से एक प्रकार के रूप में माना गया है, द्वितीय संस्करण ने इस मुद्दे को संकलित और निष्पादित कोड में स्पष्ट किया है, इसमें थोड़ा अंतर है boolean और ए byte विधि हस्ताक्षर और बूलियन सरणियों के प्रकार में नाम मैंगलिंग # जावा को छोड़कर। booleans in विधि हस्ताक्षर के रूप में उलझे हुए हैं Z जबकि byteएस के रूप में क्षतिग्रस्त हैं B. बूलियन सरणियाँ प्रकार को ले जाती हैं boolean[] लेकिन प्रति तत्व 8 बिट्स का उपयोग करें, और जेवीएम में बूलियन्स को बिट सरणी में पैक करने की कोई अंतर्निहित क्षमता नहीं है, इसलिए वे जिस प्रकार का प्रदर्शन करते हैं और उसी के समान व्यवहार करते हैं byte सरणियाँ। अन्य सभी उपयोगों में, boolean जेवीएम के लिए प्रकार प्रभावी रूप से अज्ञात है क्योंकि बूलियन पर काम करने के लिए सभी निर्देशों का उपयोग भी किया जाता है byteएस।) हालांकि नए जेवीएम रिलीज (ओपनजेडीके हॉटस्पॉट जेवीएम) 64-बिट का समर्थन करते हैं, आपके पास 64-बिट ओएस पर 32-बिट/64-बिट जेवीएम हो सकता है। 64-बिट वातावरण में जावा चलाने का प्राथमिक लाभ बड़ा पता स्थान है। यह बहुत बड़े जावा हीप आकार और जावा थ्रेड्स की बढ़ी हुई अधिकतम संख्या की अनुमति देता है, जो कुछ प्रकार के बड़े अनुप्रयोगों के लिए आवश्यक है, हालांकि 32-बिट जेवीएम की तुलना में 64-बिट जेवीएम का उपयोग करने में एक प्रदर्शन हिट है।

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

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

बायटेकोड निर्देश

जेवीएम में निम्नलिखित कार्यों के समूह के लिए निर्देश (कंप्यूटर विज्ञान) है:

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

ये निर्देश आम के एक सेट पर काम करते हैं abstracted data types बल्कि किसी विशिष्ट निर्देश सेट आर्किटेक्चर के मूल डेटा प्रकार

जेवीएम भाषाएं

एक जेवीएम भाषा कार्यक्षमता वाली कोई भी भाषा है जिसे एक वैध वर्ग फ़ाइल के रूप में व्यक्त किया जा सकता है जिसे जावा आभासी मशीन द्वारा होस्ट किया जा सकता है। एक वर्ग फ़ाइल में जावा आभासी मशीन निर्देश (जावा बाइट कोड) और एक प्रतीक तालिका, साथ ही अन्य सहायक जानकारी होती है। क्लास फाइल फॉर्मेट हार्डवेयर- और ऑपरेटिंग सिस्टम-इंडिपेंडेंट बाइनरी फॉर्मेट है जिसका इस्तेमाल संकलित क्लास और इंटरफेस को दर्शाने के लिए किया जाता है।[7] कई जेवीएम भाषाएँ हैं, दोनों पुरानी भाषाएँ जेवीएम में पोर्ट की गई हैं और पूरी तरह से नई भाषाएँ हैं। JRuby और Jython शायद मौजूदा भाषाओं के सबसे प्रसिद्ध पोर्ट हैं, यानी क्रमशः रूबी (प्रोग्रामिंग भाषा) और पायथन (प्रोग्रामिंग लैंग्वेज)। जावा बाइटकोड, क्लोजर, अपाचे ग्रूवी, स्काला (प्रोग्रामिंग भाषा) और कोटलिन (प्रोग्रामिंग भाषा) को संकलित करने के लिए स्क्रैच से बनाई गई नई भाषाओं में से सबसे लोकप्रिय हो सकती हैं। जेवीएम भाषाओं के साथ एक उल्लेखनीय विशेषता यह है कि वे भाषा इंटरऑपरेबिलिटी हैं, ताकि, उदाहरण के लिए, स्काला लाइब्रेरी का उपयोग जावा प्रोग्राम के साथ किया जा सके और इसके विपरीत।[8] जावा 7 जेवीएम जेएसआर 292 लागू करता है: गतिशील रूप से टाइप की गई भाषाओं का समर्थन करता है[9] जावा प्लेटफॉर्म पर, एक नई सुविधा जो जेवीएम में गतिशील रूप से टाइप की गई भाषाओं का समर्थन करती है। यह सुविधा दा विंची मशीन परियोजना के भीतर विकसित की गई है जिसका मिशन जेवीएम का विस्तार करना है ताकि यह जावा के अलावा अन्य भाषाओं का समर्थन करे।[10][11]


बायटेकोड सत्यापनकर्ता

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

जेवीएम निष्पादित होने से पहले सभी बायटेकोड को सत्यापित करता है। इस सत्यापन में मुख्य रूप से तीन प्रकार के चेक होते हैं:

  • शाखाएँ हमेशा मान्य स्थानों पर होती हैं
  • डेटा हमेशा प्रारंभ होता है और संदर्भ हमेशा टाइप-सुरक्षित होते हैं
  • निजी या पैकेज निजी डेटा और विधियों तक पहुंच कठोर रूप से नियंत्रित होती है

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

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


रिमोट कोड का सुरक्षित निष्पादन

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

जावाकार्ड उद्योग द्वारा बाइटकोड सत्यापनकर्ताओं का औपचारिक प्रमाण किया गया है (जावा कार्ड बाइट कोड के लिए एक एम्बेडेड सत्यापनकर्ता का औपचारिक विकास)[16])

बायटेकोड इंटरप्रेटर और समय-समय पर संकलन

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

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

जावा प्रोग्रामिंग भाषा और जावा bytecode के बीच कोई आवश्यक संबंध नहीं है। जावा में लिखे गए प्रोग्राम को वास्तविक कंप्यूटर की मशीन भाषा में सीधे संकलित किया जा सकता है और जावा के अलावा अन्य भाषाओं में लिखे गए प्रोग्राम को जावा बाइटकोड में संकलित किया जा सकता है।

जावा bytecode का उद्देश्य प्लेटफ़ॉर्म-स्वतंत्र और सुरक्षित होना है।[17] कुछ जेवीएम कार्यान्वयन में एक दुभाषिया शामिल नहीं है, लेकिन इसमें केवल एक समय-समय पर संकलक शामिल है।[18]


वेब ब्राउज़र में जेवीएम

जावा प्लेटफॉर्म के जीवनकाल की शुरुआत में, जेवीएम को समृद्ध वेब अनुप्रयोग बनाने के लिए एक वेब तकनीक के रूप में विपणन किया गया था। As of 2018अधिकांश वेब ब्राउज़र और ऑपरेटिंग सिस्टम बंडलिंग वेब ब्राउज़र जावा प्लग-इन (कंप्यूटिंग)|प्लग-इन के साथ शिप नहीं करते हैं, न ही वे किसी गैर-एडोब फ्लैश प्लग-इन को साइड-लोड करने की अनुमति देते हैं। जावा ब्राउज़र प्लगइन को JDK 9 में बहिष्कृत कर दिया गया था।[19] NPAPI जावा ब्राउज़र प्लग-इन को जेवीएम को HTML पेजों में एम्बेड किए गए तथाकथित जावा एप्लेट्स को निष्पादित करने की अनुमति देने के लिए डिज़ाइन किया गया था। प्लग-इन इंस्टॉल किए गए ब्राउज़रों के लिए, एप्लेट को निर्दिष्ट पृष्ठ पर एक आयताकार क्षेत्र में खींचने की अनुमति है। क्योंकि प्लग-इन में एक जेवीएम शामिल है, जावा एप्लेट्स जावा प्रोग्रामिंग भाषा तक सीमित नहीं हैं; जेवीएम को लक्षित करने वाली कोई भी भाषा प्लग-इन में चल सकती है। एपीआई का एक प्रतिबंधित सेट एप्लेट्स को उपयोगकर्ता के माइक्रोफ़ोन या 3डी त्वरण तक पहुंच की अनुमति देता है, हालांकि एप्लेट्स अपने आयताकार क्षेत्र के बाहर पृष्ठ को संशोधित करने में सक्षम नहीं हैं। अडोब फ्लैश प्लेयर, मुख्य प्रतिस्पर्धी तकनीक, इस संबंध में उसी तरह काम करती है।

As of June 2015 W3Tech के अनुसार, जावा एप्लेट और Microsoft सिल्वरलाइट का उपयोग सभी वेब साइटों के लिए 0.1% तक गिर गया था, जबकि फ्लैश 10.8% तक गिर गया था।[20]


जावास्क्रिप्ट जेवीएम और दुभाषिए

मई 2016 तक, जावाPoly उपयोगकर्ताओं को असंशोधित जावा पुस्तकालयों को आयात करने की अनुमति देता है, और उन्हें सीधे जावास्क्रिप्ट से आमंत्रित करता है। जावाPoly वेबसाइटों को असंशोधित जावा पुस्तकालयों का उपयोग करने की अनुमति देता है, भले ही उपयोगकर्ता के कंप्यूटर पर जावा स्थापित न हो।[21]


जावास्क्रिप्ट का संकलन

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

जेवीएम बाइटकोड को संकलित करना, जो जेवीएम भाषाओं में सार्वभौमिक है, भाषा के मौजूदा कंपाइलर को बायटेकोड बनाने की अनुमति देता है। जावास्क्रिप्ट कंपाइलर्स के लिए मुख्य जेवीएम बायटेकोड टीवीएम हैं,[22] ड्रैगोम वेब एसडीके में समाहित संकलक,[23] कैप्रेसर,[24] और j2js-संकलक।[25] जेवीएम भाषाओं से जावास्क्रिप्ट के प्रमुख संकलक में शामिल हैं जावा-टू-जावास्क्रिप्ट कंपाइलर, जो गूगल वेब टूलकिट, क्लोजरस्क्रिप्ट (क्लोजर), ग्रोओस्क्रिप्ट (अपाचे ग्रूवी), स्काला (प्रोग्रामिंग लैंग्वेज)|Scala.js (Scala) और अन्य में निहित है।[26]


यह भी देखें


इस पेज में लापता आंतरिक लिंक की सूची

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

संदर्भ

  1. yan (2021-04-20). "jdk-updates/jdk15u: 1055f2102e6e". Oracle Corporation. Retrieved 2021-04-20.
  2. Bill Venners, Inside the Java Virtual Machine Chapter 5
  3. "जावा कम्युनिटी प्रोसेस (एसएम) प्रोग्राम - जेएसआर: जावा विशिष्टता अनुरोध - विवरण जेएसआर # 924". Jcp.org. Retrieved 2015-06-26.
  4. "जावा कम्युनिटी प्रोसेस (एसएम) प्रोग्राम - जेएसआर: जावा विशिष्टता अनुरोध - विवरण जेएसआर # 202". Jcp.org. Retrieved 2015-06-26.
  5. The Java Virtual Machine Specification (the first and second editions are also available online).
  6. "अध्याय 2. जावा वर्चुअल मशीन की संरचना".
  7. "जावा वर्चुअल मशीन विशिष्टता: जावा एसई 7 संस्करण" (PDF). Docs.oracle.com. Retrieved 2015-06-26.
  8. "अक्सर पूछे जाने वाले प्रश्न - जावा इंटरऑपरेबिलिटी". scala-lang.org. Retrieved 2015-11-18.
  9. "जावा कम्युनिटी प्रोसेस (एसएम) प्रोग्राम - जेएसआर: जावा विशिष्टता अनुरोध - विवरण जेएसआर # 292". Jcp.org. Retrieved 2015-06-26.
  10. "दा विंची मशीन परियोजना". Openjdk.java.net. Retrieved 2015-06-26.
  11. "नई JDK 7 विशेषता: जावा वर्चुअल मशीन में गतिशील रूप से टाइप की गई भाषाओं के लिए समर्थन". Oracle.com. Retrieved 2015-06-26.
  12. "सत्यापन प्रक्रिया". The Java Virtual Machine Specification. Sun Microsystems. 1999. Retrieved 2009-05-31.
  13. "हॉटस्पॉट रनटाइम अवलोकन - दुभाषिया". OpenJDK. Archived from the original on 2022-05-21. Retrieved 2021-05-24.
  14. "सीएलआर रजिस्टर-आधारित क्यों नहीं बनाते? · अंक #4775 · डॉटनेट/रनटाइम". GitHub.
  15. Freund, Stephen N.; Mitchell, John C. (1999). "A formal framework for the Java bytecode language and verifier". वस्तु-उन्मुख प्रोग्रामिंग, सिस्टम, भाषाओं और अनुप्रयोगों पर 14वें ACM SIGPLAN सम्मेलन की कार्यवाही - OOPSLA '99. pp. 147–166. CiteSeerX 10.1.1.2.4663. doi:10.1145/320384.320397. ISBN 978-1581132380. S2CID 14302964.
  16. Casset, Ludovic; Burdy, Lilian; Requet, Antoine (10 April 2002). "जावा कार्ड बाइट कोड के लिए एंबेडेड सत्यापनकर्ता का औपचारिक विकास" (PDF). Inria - National Institute for Research in Digital Science and Technology at Côte d'Azur University. Archived (PDF) from the original on 3 October 2022.
  17. David J. Eck, Introduction to Programming Using Java, Seventh Edition, Version 7.0, August 2014 at Section 1.3 "The Java Virtual Machine"
  18. Oracle JRockit Introduction Archived 2015-09-06 at the Wayback Machine Release R28 at 2. "Understanding Just-In-Time Compilation and Optimization"
  19. "Oracle जावा ब्राउज़र प्लगइन को हटाता है, इसके निधन की तैयारी करता है". Ars Technica. 28 January 2016. Retrieved 15 April 2016.
  20. "क्लाइंट-साइड प्रोग्रामिंग भाषाओं के उपयोग में ऐतिहासिक वार्षिक रुझान, जून 2015". W3techs.com. Retrieved 2015-06-26.
  21. Krill, Paul (13 May 2016). "JavaPoly.js मौजूदा जावा कोड आयात करता है और इसे सीधे जावास्क्रिप्ट से आमंत्रित करता है". InfoWorld. Retrieved 18 July 2016.
  22. "TeaVM प्रोजेक्ट होम पेज". Teavm.org. Retrieved 2015-06-26.
  23. "ड्रैगोम वेब एसडीके". Dragome.com. Retrieved 2015-06-26.
  24. "Bck2Brwsr - APIDesign". Wiki.apidesign.org. Retrieved 2015-06-26.
  25. Wolfgang Kuehn (decatur). j2js-compiler GitHub
  26. "JS में संकलित भाषाओं की सूची · jashkenas/coffeescript Wiki · GitHub". Github.com. 2015-06-19. Retrieved 2015-06-26.

आभासी मशीन श्रेणी:जावा प्लेटफॉर्म सॉफ्टवेयर आभासी मशीन श्रेणी:स्टैक-आधारित आभासी मशीनें