जावा बाइटकोड: Difference between revisions

From Vigyanwiki
(Created page with "{{Short description|Instruction set of the Java virtual machine}} {{short lead|date=August 2022}} कंप्यूटिंग में, जावा बाईटको...")
 
No edit summary
Line 1: Line 1:
{{Short description|Instruction set of the Java virtual machine}}
{{Short description|Instruction set of the Java virtual machine}}
{{short lead|date=August 2022}}
कंप्यूटिंग में, जावा [[बाईटकोड]], जावा [[आभासी मशीन]] (JVM) का बायटेकोड-स्ट्रक्चर्ड [[निर्देश समुच्चय]] है, वर्चुअल मशीन जो कंप्यूटर को [[जावा (प्रोग्रामिंग भाषा)]] प्रोग्रामिंग लैंग्वेज और कई अन्य प्रोग्रामिंग लैंग्वेज में लिखे प्रोग्राम को चलाने में सक्षम बनाती है, देखें सूची जेवीएम भाषाएं।
कंप्यूटिंग में, जावा [[बाईटकोड]], जावा [[आभासी मशीन]] (JVM) का बायटेकोड-स्ट्रक्चर्ड [[निर्देश समुच्चय]] है, एक वर्चुअल मशीन जो कंप्यूटर को [[जावा (प्रोग्रामिंग भाषा)]] प्रोग्रामिंग लैंग्वेज और कई अन्य प्रोग्रामिंग लैंग्वेज में लिखे प्रोग्राम को चलाने में सक्षम बनाती है, देखें सूची जेवीएम भाषाएं।


== जावा से संबंध ==
== जावा से संबंध ==
Line 8: Line 7:


== निर्देश सेट आर्किटेक्चर ==
== निर्देश सेट आर्किटेक्चर ==
जेवीएम एक [[स्टैक मशीन]] और एक [[रजिस्टर मशीन]] दोनों है। विधि कॉल के लिए प्रत्येक कॉल स्टैक#STACK-FRAME में एक ऑपरेंड स्टैक और स्थानीय चर की एक सरणी होती है।<ref name="jvm">{{cite book |last1=Lindholm |first1=Tim |last2=Yellin |first2=Frank |last3=Bracha |first3=Gilad |last4=Buckley |first4=Alex |title=The Java Virtual Machine Specification |edition=Java SE 8 |date=2015-02-13 |url=http://docs.oracle.com/javase/specs/jvms/se8/html/}}</ref>{{rp|2.6}} ऑपरेंड स्टैक का उपयोग ऑपरेशंस के लिए कंप्यूटेशंस के लिए किया जाता है और कॉल की गई विधि के रिटर्न वैल्यू को प्राप्त करने के लिए किया जाता है, जबकि स्थानीय चर [[प्रोसेसर रजिस्टर]] के समान उद्देश्य की सेवा करते हैं और विधि तर्कों को पारित करने के लिए भी उपयोग किए जाते हैं। कंपाइलर द्वारा गणना किए गए ऑपरेंड स्टैक और स्थानीय चर सरणी का अधिकतम आकार प्रत्येक विधि की विशेषताओं का हिस्सा है।<ref name="jvm"/>{{rp|4.7.3}} प्रत्येक को स्वतंत्र रूप से 0 से 65535 मानों के आकार में रखा जा सकता है, जहां प्रत्येक मान 32 बिट्स है। {{code|lang="java"|long}} और {{code|lang="java"|double}} प्रकार, जो 64 बिट हैं, लगातार दो स्थानीय चर लेते हैं<ref name="jvm"/>{{rp|2.6.1}} (जिन्हें स्थानीय चर सरणी में 64-बिट संरेखित करने की आवश्यकता नहीं है) या ऑपरेंड स्टैक में एक मान (लेकिन स्टैक की गहराई में दो इकाइयों के रूप में गिना जाता है)।<ref name="jvm"/>{{rp|2.6.2}}
जेवीएम [[स्टैक मशीन]] और [[रजिस्टर मशीन]] दोनों है। विधि कॉल के लिए प्रत्येक कॉल स्टैक#STACK-FRAME में ऑपरेंड स्टैक और स्थानीय चर की सरणी होती है।<ref name="jvm">{{cite book |last1=Lindholm |first1=Tim |last2=Yellin |first2=Frank |last3=Bracha |first3=Gilad |last4=Buckley |first4=Alex |title=The Java Virtual Machine Specification |edition=Java SE 8 |date=2015-02-13 |url=http://docs.oracle.com/javase/specs/jvms/se8/html/}}</ref>{{rp|2.6}} ऑपरेंड स्टैक का उपयोग ऑपरेशंस के लिए कंप्यूटेशंस के लिए किया जाता है और कॉल की गई विधि के रिटर्न वैल्यू को प्राप्त करने के लिए किया जाता है, जबकि स्थानीय चर [[प्रोसेसर रजिस्टर]] के समान उद्देश्य की सेवा करते हैं और विधि तर्कों को पारित करने के लिए भी उपयोग किए जाते हैं। कंपाइलर द्वारा गणना किए गए ऑपरेंड स्टैक और स्थानीय चर सरणी का अधिकतम आकार प्रत्येक विधि की विशेषताओं का हिस्सा है।<ref name="jvm" />{{rp|4.7.3}} प्रत्येक को स्वतंत्र रूप से 0 से 65535 मानों के आकार में रखा जा सकता है, जहां प्रत्येक मान 32 बिट्स है। {{code|lang="java"|long}} और {{code|lang="java"|double}} प्रकार, जो 64 बिट हैं, लगातार दो स्थानीय चर लेते हैं<ref name="jvm"/>{{rp|2.6.1}} (जिन्हें स्थानीय चर सरणी में 64-बिट संरेखित करने की आवश्यकता नहीं है) या ऑपरेंड स्टैक में मान (लेकिन स्टैक की गहराई में दो इकाइयों के रूप में गिना जाता है)।<ref name="jvm"/>{{rp|2.6.2}}




=== निर्देश सेट ===
=== निर्देश सेट ===
{{further|List of Java bytecode instructions}}
{{further|List of Java bytecode instructions}}
प्रत्येक बाइटकोड एक बाइट से बना होता है जो ऑपरेंड के लिए शून्य या अधिक बाइट्स के साथ [[opcode]] का प्रतिनिधित्व करता है।<ref name="jvm"/>{{rp|2.11}}
प्रत्येक बाइटकोड बाइट से बना होता है जो ऑपरेंड के लिए शून्य या अधिक बाइट्स के साथ [[opcode]] का प्रतिनिधित्व करता है।<ref name="jvm"/>{{rp|2.11}}
256 संभावित बाइट-लॉन्ग ऑपकोड में से, {{as of|2015|lc=y}}, 202 उपयोग में हैं (~79%), 51 भविष्य में उपयोग के लिए आरक्षित हैं (~20%), और 3 निर्देश (~1%) उपयोग के लिए जेवीएम कार्यान्वयन के लिए स्थायी रूप से आरक्षित हैं।<ref name="jvm"/>{{rp|6.2}} इनमें से दो (<code>impdep1</code> और <code>impdep2</code>) क्रमशः कार्यान्वयन-विशिष्ट सॉफ़्टवेयर और हार्डवेयर के लिए ट्रैप प्रदान करना है। ब्रेकप्वाइंट को लागू करने के लिए तीसरे का उपयोग डिबगर्स के लिए किया जाता है।
256 संभावित बाइट-लॉन्ग ऑपकोड में से, {{as of|2015|lc=y}}, 202 उपयोग में हैं (~79%), 51 भविष्य में उपयोग के लिए आरक्षित हैं (~20%), और 3 निर्देश (~1%) उपयोग के लिए जेवीएम कार्यान्वयन के लिए स्थायी रूप से आरक्षित हैं।<ref name="jvm"/>{{rp|6.2}} इनमें से दो (<code>impdep1</code> और <code>impdep2</code>) क्रमशः कार्यान्वयन-विशिष्ट सॉफ़्टवेयर और हार्डवेयर के लिए ट्रैप प्रदान करना है। ब्रेकप्वाइंट को लागू करने के लिए तीसरे का उपयोग डिबगर्स के लिए किया जाता है।


Line 49: Line 48:
| <code>a</code> || reference
| <code>a</code> || reference
|}
|}
उदाहरण के लिए, <code>iadd</code> दो पूर्णांक जोड़ देगा, जबकि <code>dadd</code> दो युगल जोड़ेंगे। <code>const</code>का>, <code>load</code>, और <code>store</code> निर्देश प्रपत्र का प्रत्यय भी ले सकते हैं <code>_''n''</code>, जहाँ n 0–3 के लिए एक संख्या है <code>load</code> और <code>store</code>. के लिए अधिकतम एन <code>const</code> प्रकार से भिन्न होता है। <code>const</code> ई> निर्देश स्टैक पर निर्दिष्ट प्रकार के मान को पुश करते हैं। उदाहरण के लिए, <code>iconst_5</code> स्टैक पर मान 5 के साथ एक पूर्णांक (32 बिट मान) पुश करेगा, जबकि <code>dconst_1</code> स्टैक पर मान 1 के साथ एक डबल (64 बिट फ्लोटिंग पॉइंट वैल्यू) पुश करेगा। एक भी है <code>aconst_null</code>, जो एक धक्का देता है {{code|lang=java|null}} संदर्भ। एन के लिए <code>load</code> और <code>store</code> निर्देश लोड करने या स्टोर करने के लिए स्थानीय चर सरणी में इंडेक्स निर्दिष्ट करता है। <code>aload_0</code> e> निर्देश ऑब्जेक्ट को स्थानीय चर 0 में स्टैक पर धकेलता है (यह आमतौर पर <code>[[this (computer programming)|this]]</code> वस्तु)। <code>istore_1</code> स्टैक के शीर्ष पर पूर्णांक को स्थानीय चर 1 में संग्रहीत करता है। 3 से अधिक स्थानीय चर के लिए प्रत्यय हटा दिया जाता है और ऑपरेंड का उपयोग किया जाना चाहिए।
उदाहरण के लिए, <code>iadd</code> दो पूर्णांक जोड़ देगा, जबकि <code>dadd</code> दो युगल जोड़ेंगे। <code>const</code>का>, <code>load</code>, और <code>store</code> निर्देश प्रपत्र का प्रत्यय भी ले सकते हैं <code>_''n''</code>, जहाँ n 0–3 के लिए संख्या है <code>load</code> और <code>store</code>. के लिए अधिकतम एन <code>const</code> प्रकार से भिन्न होता है। <code>const</code> ई> निर्देश स्टैक पर निर्दिष्ट प्रकार के मान को पुश करते हैं। उदाहरण के लिए, <code>iconst_5</code> स्टैक पर मान 5 के साथ पूर्णांक (32 बिट मान) पुश करेगा, जबकि <code>dconst_1</code> स्टैक पर मान 1 के साथ डबल (64 बिट फ्लोटिंग पॉइंट वैल्यू) पुश करेगा। भी है <code>aconst_null</code>, जो धक्का देता है {{code|lang=java|null}} संदर्भ। एन के लिए <code>load</code> और <code>store</code> निर्देश लोड करने या स्टोर करने के लिए स्थानीय चर सरणी में इंडेक्स निर्दिष्ट करता है। <code>aload_0</code> e> निर्देश ऑब्जेक्ट को स्थानीय चर 0 में स्टैक पर धकेलता है (यह आमतौर पर <code>[[this (computer programming)|this]]</code> वस्तु)। <code>istore_1</code> स्टैक के शीर्ष पर पूर्णांक को स्थानीय चर 1 में संग्रहीत करता है। 3 से अधिक स्थानीय चर के लिए प्रत्यय हटा दिया जाता है और ऑपरेंड का उपयोग किया जाना चाहिए।


== उदाहरण ==
== उदाहरण ==
Line 66: Line 65:
</वाक्यविन्यास हाइलाइट>
</वाक्यविन्यास हाइलाइट>


एक जावा कंपाइलर ऊपर दिए गए जावा कोड को बायटेकोड में निम्नानुसार अनुवादित कर सकता है, यह मानते हुए कि ऊपर एक विधि में रखा गया था:
जावा कंपाइलर ऊपर दिए गए जावा कोड को बायटेकोड में निम्नानुसार अनुवादित कर सकता है, यह मानते हुए कि ऊपर विधि में रखा गया था:
<वाक्यविन्यास लैंग = जैस्मीन>
<वाक्यविन्यास लैंग = जैस्मीन>
0: आइकॉनस्ट_2
0: आइकॉनस्ट_2
Line 94: Line 93:
== पीढ़ी ==
== पीढ़ी ==
{{Further|List of JVM languages}}
{{Further|List of JVM languages}}
[[javac]] बाइटकोड का निर्माण करके जावा वर्चुअल मशीन को लक्षित करने वाली सबसे आम भाषा जावा है। मूल रूप से केवल एक संकलक मौजूद था, [[सन माइक्रोसिस्टम्स]] से जावैक संकलक, जो [[जावा स्रोत कोड]] को जावा बाइटकोड में संकलित करता है; लेकिन क्योंकि जावा बाइटकोड के लिए सभी विनिर्देश अब उपलब्ध हैं, अन्य पार्टियों ने कंपाइलर्स की आपूर्ति की है जो जावा बाइटकोड का उत्पादन करते हैं। अन्य संकलक के उदाहरणों में शामिल हैं:
[[javac]] बाइटकोड का निर्माण करके जावा वर्चुअल मशीन को लक्षित करने वाली सबसे आम भाषा जावा है। मूल रूप से केवल संकलक मौजूद था, [[सन माइक्रोसिस्टम्स]] से जावैक संकलक, जो [[जावा स्रोत कोड]] को जावा बाइटकोड में संकलित करता है; लेकिन क्योंकि जावा बाइटकोड के लिए सभी विनिर्देश अब उपलब्ध हैं, अन्य पार्टियों ने कंपाइलर्स की आपूर्ति की है जो जावा बाइटकोड का उत्पादन करते हैं। अन्य संकलक के उदाहरणों में शामिल हैं:
* जावा के लिए एक्लिप्स कंपाइलर (ECJ)
* जावा के लिए एक्लिप्स कंपाइलर (ECJ)
*[[Jikes]], Java से Java bytecode में संकलित (IBM द्वारा विकसित, C++ में कार्यान्वित)
*[[Jikes]], Java से Java bytecode में संकलित (IBM द्वारा विकसित, C++ में कार्यान्वित)
Line 101: Line 100:


कुछ प्रोजेक्ट जावा असेंबलर प्रदान करते हैं ताकि जावा बायटेकोड को हाथ से लिखने में सक्षम बनाया जा सके। मशीन द्वारा असेंबली कोड भी उत्पन्न किया जा सकता है, उदाहरण के लिए जावा वर्चुअल मशीन को लक्षित करने वाले कंपाइलर द्वारा। उल्लेखनीय जावा कोडांतरकों में शामिल हैं:
कुछ प्रोजेक्ट जावा असेंबलर प्रदान करते हैं ताकि जावा बायटेकोड को हाथ से लिखने में सक्षम बनाया जा सके। मशीन द्वारा असेंबली कोड भी उत्पन्न किया जा सकता है, उदाहरण के लिए जावा वर्चुअल मशीन को लक्षित करने वाले कंपाइलर द्वारा। उल्लेखनीय जावा कोडांतरकों में शामिल हैं:
* [[जैस्मीन (जावा असेंबलर)]], जावा कक्षाओं के लिए पाठ विवरण लेता है, जावा वर्चुअल मशीन इंस्ट्रक्शन सेट का उपयोग करके एक साधारण असेंबली-जैसे सिंटैक्स में लिखा जाता है और जावा क्लास फ़ाइल उत्पन्न करता है<ref>[http://jasmin.sourceforge.net Jasmin home page<!-- Bot generated title -->]</ref>
* [[जैस्मीन (जावा असेंबलर)]], जावा कक्षाओं के लिए पाठ विवरण लेता है, जावा वर्चुअल मशीन इंस्ट्रक्शन सेट का उपयोग करके साधारण असेंबली-जैसे सिंटैक्स में लिखा जाता है और जावा क्लास फ़ाइल उत्पन्न करता है<ref>[http://jasmin.sourceforge.net Jasmin home page<!-- Bot generated title -->]</ref>
*जमैका, जावा वर्चुअल मशीन के लिए एक मैक्रो (कंप्यूटर साइंस) असेंबली लैंग्वेज। जावा सिंटैक्स का उपयोग क्लास या इंटरफ़ेस परिभाषा के लिए किया जाता है। विधि निकायों को बाइटकोड निर्देशों का उपयोग करके निर्दिष्ट किया गया है।<ref>[https://www.javaworld.com/article/2072355/core-java/learn-to-speak-jamaican.html Jamaica: The Java virtual machine (JVM) macro assembler<!-- Bot generated title -->]</ref>
*जमैका, जावा वर्चुअल मशीन के लिए मैक्रो (कंप्यूटर साइंस) असेंबली लैंग्वेज। जावा सिंटैक्स का उपयोग क्लास या इंटरफ़ेस परिभाषा के लिए किया जाता है। विधि निकायों को बाइटकोड निर्देशों का उपयोग करके निर्दिष्ट किया गया है।<ref>[https://www.javaworld.com/article/2072355/core-java/learn-to-speak-jamaican.html Jamaica: The Java virtual machine (JVM) macro assembler<!-- Bot generated title -->]</ref>
*Krakatau Bytecode Tools, में वर्तमान में तीन टूल हैं: जावा क्लासफाइल्स के लिए एक डीकंपलर और डिस्सेबलर और क्लासफाइल्स बनाने के लिए एक असेंबलर।<ref>[https://github.com/Storyyeller/Krakatau Krakatau home page]</ref>
*Krakatau Bytecode Tools, में वर्तमान में तीन टूल हैं: जावा क्लासफाइल्स के लिए डीकंपलर और डिस्सेबलर और क्लासफाइल्स बनाने के लिए असेंबलर।<ref>[https://github.com/Storyyeller/Krakatau Krakatau home page]</ref>
*लिलाक, जावा वर्चुअल मशीन के लिए एक असेंबलर और डिसअसेंबलर।<ref>[http://lilac.sourceforge.net Lilac home page]</ref>
*लिलाक, जावा वर्चुअल मशीन के लिए असेंबलर और डिसअसेंबलर।<ref>[http://lilac.sourceforge.net Lilac home page]</ref>
दूसरों ने जावा वर्चुअल मशीन को लक्षित करने के लिए विभिन्न प्रोग्रामिंग भाषाओं के लिए कंपाइलर विकसित किए हैं, जैसे:
दूसरों ने जावा वर्चुअल मशीन को लक्षित करने के लिए विभिन्न प्रोग्रामिंग भाषाओं के लिए कंपाइलर विकसित किए हैं, जैसे:
*[[ठंडा गलन]]
*[[ठंडा गलन]]
*[[JRuby]] और [[Jython]], Ruby (प्रोग्रामिंग भाषा) और Python (प्रोग्रामिंग भाषा) पर आधारित दो स्क्रिप्टिंग भाषाएँ
*[[JRuby]] और [[Jython]], Ruby (प्रोग्रामिंग भाषा) और Python (प्रोग्रामिंग भाषा) पर आधारित दो स्क्रिप्टिंग भाषाएँ
* [[ग्रूवी (प्रोग्रामिंग भाषा)]], स्थिर-टाइपिंग और स्थिर संकलन क्षमताओं के साथ वैकल्पिक रूप से टाइप की गई और गतिशील सामान्य-उद्देश्य वाली भाषा
* [[ग्रूवी (प्रोग्रामिंग भाषा)]], स्थिर-टाइपिंग और स्थिर संकलन क्षमताओं के साथ वैकल्पिक रूप से टाइप की गई और गतिशील सामान्य-उद्देश्य वाली भाषा
*स्कैला (प्रोग्रामिंग भाषा), वस्तु-उन्मुख और कार्यात्मक प्रोग्रामिंग का समर्थन करने वाली एक प्रकार-सुरक्षित सामान्य-उद्देश्य [[स्काला (प्रोग्रामिंग भाषा)]]
*स्कैला (प्रोग्रामिंग भाषा), वस्तु-उन्मुख और कार्यात्मक प्रोग्रामिंग का समर्थन करने वाली प्रकार-सुरक्षित सामान्य-उद्देश्य [[स्काला (प्रोग्रामिंग भाषा)]]
*[[JGNAT]] और AppletMagic, भाषा Ada (प्रोग्रामिंग भाषा) से Java bytecode में संकलित
*[[JGNAT]] और AppletMagic, भाषा Ada (प्रोग्रामिंग भाषा) से Java bytecode में संकलित
*जावा वर्चुअल मशीन#सी टू बाइटकोड कंपाइलर्स|सी टू जावा बाइट-कोड कंपाइलर्स {{dead link|date=December 2018}}
*जावा वर्चुअल मशीन#सी टू बाइटकोड कंपाइलर्स|सी टू जावा बाइट-कोड कंपाइलर्स {{dead link|date=December 2018}}
* [[क्लोजर]], लिस्प (प्रोग्रामिंग लैंग्वेज) परिवार में एक कार्यात्मक, अपरिवर्तनीय, सामान्य-उद्देश्य वाली प्रोग्रामिंग भाषा जिसमें समवर्ती पर जोर दिया गया है
* [[क्लोजर]], लिस्प (प्रोग्रामिंग लैंग्वेज) परिवार में कार्यात्मक, अपरिवर्तनीय, सामान्य-उद्देश्य वाली प्रोग्रामिंग भाषा जिसमें समवर्ती पर जोर दिया गया है
* [[कावा (योजना कार्यान्वयन)]], योजना का कार्यान्वयन (प्रोग्रामिंग भाषा) प्रोग्रामिंग भाषा, [[लिस्प (प्रोग्रामिंग भाषा)]] की एक बोली भी।
* [[कावा (योजना कार्यान्वयन)]], योजना का कार्यान्वयन (प्रोग्रामिंग भाषा) प्रोग्रामिंग भाषा, [[लिस्प (प्रोग्रामिंग भाषा)]] की बोली भी।
*[[मिडलेट पास्कल]]
*[[मिडलेट पास्कल]]
*JavaFX स्क्रिप्ट कोड को Java bytecode में संकलित किया गया है
*JavaFX स्क्रिप्ट कोड को Java bytecode में संकलित किया गया है
Line 122: Line 121:
== निष्पादन ==
== निष्पादन ==
{{Further|Java virtual machine}}
{{Further|Java virtual machine}}
जावा बाइटकोड को निष्पादित करने के लिए आज कई जावा वर्चुअल मशीनें उपलब्ध हैं, दोनों मुफ्त और व्यावसायिक उत्पाद। यदि वर्चुअल मशीन में बायटेकोड निष्पादित करना अवांछनीय है, तो एक डेवलपर जावा स्रोत कोड या बायटेकोड को सीधे देशी मशीन कोड में संकलित कर सकता है जैसे कि जावा के लिए जीएनयू कंपाइलर (जीसीजे)। कुछ प्रोसेसर जावा बाइटकोड को मूल रूप से निष्पादित कर सकते हैं। ऐसे प्रोसेसर को [[जावा प्रोसेसर]] कहा जाता है।
जावा बाइटकोड को निष्पादित करने के लिए आज कई जावा वर्चुअल मशीनें उपलब्ध हैं, दोनों मुफ्त और व्यावसायिक उत्पाद। यदि वर्चुअल मशीन में बायटेकोड निष्पादित करना अवांछनीय है, तो डेवलपर जावा स्रोत कोड या बायटेकोड को सीधे देशी मशीन कोड में संकलित कर सकता है जैसे कि जावा के लिए जीएनयू कंपाइलर (जीसीजे)। कुछ प्रोसेसर जावा बाइटकोड को मूल रूप से निष्पादित कर सकते हैं। ऐसे प्रोसेसर को [[जावा प्रोसेसर]] कहा जाता है।


== गतिशील भाषाओं के लिए समर्थन ==
== गतिशील भाषाओं के लिए समर्थन ==
{{Further|List of JVM languages}}
{{Further|List of JVM languages}}
जावा वर्चुअल मशीन टाइप सिस्टम#डायनामिक टाइपिंग के लिए कुछ सहायता प्रदान करती है। अधिकांश मौजूदा जेवीएम निर्देश सेट टाइप सिस्टम # स्टेटिक टाइपिंग है - इस अर्थ में कि मेथड कॉल में उनके हस्ताक्षर [[संकलन समय]] पर टाइप-चेक किए जाते हैं, बिना किसी तंत्र के रन टाइम (प्रोग्राम जीवनचक्र चरण) के लिए इस निर्णय को स्थगित करने के लिए, या चुनने के लिए एक वैकल्पिक दृष्टिकोण द्वारा विधि प्रेषण।<ref>{{cite web
जावा वर्चुअल मशीन टाइप सिस्टम#डायनामिक टाइपिंग के लिए कुछ सहायता प्रदान करती है। अधिकांश मौजूदा जेवीएम निर्देश सेट टाइप सिस्टम # स्टेटिक टाइपिंग है - इस अर्थ में कि मेथड कॉल में उनके हस्ताक्षर [[संकलन समय]] पर टाइप-चेक किए जाते हैं, बिना किसी तंत्र के रन टाइम (प्रोग्राम जीवनचक्र चरण) के लिए इस निर्णय को स्थगित करने के लिए, या चुनने के लिए वैकल्पिक दृष्टिकोण द्वारा विधि प्रेषण।<ref>{{cite web
| url=http://headius.blogspot.com/2007/01/invokedynamic-actually-useful.html
| url=http://headius.blogspot.com/2007/01/invokedynamic-actually-useful.html
| title=InvokeDynamic: Actually Useful?
| title=InvokeDynamic: Actually Useful?
Line 132: Line 131:
|last=Nutter|first=Charles
|last=Nutter|first=Charles
| access-date=2008-01-25}}</ref>
| access-date=2008-01-25}}</ref>
[[जावा सामुदायिक प्रक्रिया]] 292 (जावा प्लेटफॉर्म पर गतिशील रूप से टाइप की गई भाषाओं का समर्थन)<ref>[http://www.jcp.org/en/jsr/detail?id=292 see JSR 292]</ref> एक नया जोड़ा <code>invokedynamic</code> JVM स्तर पर निर्देश, डायनेमिक टाइप सिस्टम # टाइप चेकिंग पर निर्भर विधि आमंत्रण की अनुमति देने के लिए (मौजूदा स्टेटिकली टाइप-चेक के बजाय) <code>invokevirtual</code> निर्देश)। [[दा विंची मशीन]] एक प्रोटोटाइप वर्चुअल मशीन कार्यान्वयन है जो गतिशील भाषाओं का समर्थन करने के उद्देश्य से जेवीएम एक्सटेंशन को होस्ट करता है। जावा प्लेटफॉर्म, मानक संस्करण 7 का समर्थन करने वाले सभी जेवीएम में भी शामिल हैं <code>invokedynamic</code> opcode.
[[जावा सामुदायिक प्रक्रिया]] 292 (जावा प्लेटफॉर्म पर गतिशील रूप से टाइप की गई भाषाओं का समर्थन)<ref>[http://www.jcp.org/en/jsr/detail?id=292 see JSR 292]</ref> नया जोड़ा <code>invokedynamic</code> JVM स्तर पर निर्देश, डायनेमिक टाइप सिस्टम # टाइप चेकिंग पर निर्भर विधि आमंत्रण की अनुमति देने के लिए (मौजूदा स्टेटिकली टाइप-चेक के बजाय) <code>invokevirtual</code> निर्देश)। [[दा विंची मशीन]] प्रोटोटाइप वर्चुअल मशीन कार्यान्वयन है जो गतिशील भाषाओं का समर्थन करने के उद्देश्य से जेवीएम एक्सटेंशन को होस्ट करता है। जावा प्लेटफॉर्म, मानक संस्करण 7 का समर्थन करने वाले सभी जेवीएम में भी शामिल हैं <code>invokedynamic</code> opcode.


== यह भी देखें ==
== यह भी देखें ==

Revision as of 18:51, 2 March 2023

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

जावा से संबंध

जावा (प्रोग्रामिंग लैंग्वेज) प्रोग्रामर को जावा बाइटकोड के बारे में जानने या समझने की बिल्कुल भी जरूरत नहीं है। हालांकि, जैसा कि आईबीएम डेवलपर वर्क्स जर्नल में सुझाव दिया गया है, बाइटकोड को समझना और जावा संकलक द्वारा बाइटकोड उत्पन्न होने की संभावना जावा प्रोग्रामर को उसी तरह मदद करती है जैसे असेंबली भाषा का ज्ञान सी (प्रोग्रामिंग भाषा) या सी ++ प्रोग्रामर को मदद करता है।[1]


निर्देश सेट आर्किटेक्चर

जेवीएम स्टैक मशीन और रजिस्टर मशीन दोनों है। विधि कॉल के लिए प्रत्येक कॉल स्टैक#STACK-FRAME में ऑपरेंड स्टैक और स्थानीय चर की सरणी होती है।[2]: 2.6  ऑपरेंड स्टैक का उपयोग ऑपरेशंस के लिए कंप्यूटेशंस के लिए किया जाता है और कॉल की गई विधि के रिटर्न वैल्यू को प्राप्त करने के लिए किया जाता है, जबकि स्थानीय चर प्रोसेसर रजिस्टर के समान उद्देश्य की सेवा करते हैं और विधि तर्कों को पारित करने के लिए भी उपयोग किए जाते हैं। कंपाइलर द्वारा गणना किए गए ऑपरेंड स्टैक और स्थानीय चर सरणी का अधिकतम आकार प्रत्येक विधि की विशेषताओं का हिस्सा है।[2]: 4.7.3  प्रत्येक को स्वतंत्र रूप से 0 से 65535 मानों के आकार में रखा जा सकता है, जहां प्रत्येक मान 32 बिट्स है। long और double प्रकार, जो 64 बिट हैं, लगातार दो स्थानीय चर लेते हैं[2]: 2.6.1  (जिन्हें स्थानीय चर सरणी में 64-बिट संरेखित करने की आवश्यकता नहीं है) या ऑपरेंड स्टैक में मान (लेकिन स्टैक की गहराई में दो इकाइयों के रूप में गिना जाता है)।[2]: 2.6.2 


निर्देश सेट

प्रत्येक बाइटकोड बाइट से बना होता है जो ऑपरेंड के लिए शून्य या अधिक बाइट्स के साथ opcode का प्रतिनिधित्व करता है।[2]: 2.11  256 संभावित बाइट-लॉन्ग ऑपकोड में से, as of 2015, 202 उपयोग में हैं (~79%), 51 भविष्य में उपयोग के लिए आरक्षित हैं (~20%), और 3 निर्देश (~1%) उपयोग के लिए जेवीएम कार्यान्वयन के लिए स्थायी रूप से आरक्षित हैं।[2]: 6.2  इनमें से दो (impdep1 और impdep2) क्रमशः कार्यान्वयन-विशिष्ट सॉफ़्टवेयर और हार्डवेयर के लिए ट्रैप प्रदान करना है। ब्रेकप्वाइंट को लागू करने के लिए तीसरे का उपयोग डिबगर्स के लिए किया जाता है।

निर्देश कई व्यापक समूहों में आते हैं:

  • लोड और स्टोर (उदा। aload_0, istore)
  • अंकगणित और तर्क (उदा. ladd, fcmpl)
  • प्रकार रूपांतरण (उदा. i2b, d2i)
  • वस्तु निर्माण और हेरफेर (new, putfield)
  • ऑपरेंड स्टैक प्रबंधन (उदा। swap, dup2)
  • नियंत्रण हस्तांतरण (उदा। ifeq, goto)
  • विधि मंगलाचरण और वापसी (उदा। invokespecial, areturn)

अपवाद फेंकने, सिंक्रनाइज़ेशन इत्यादि जैसे कई विशिष्ट कार्यों के लिए कुछ निर्देश भी हैं।

कई निर्देशों में उपसर्ग और/या प्रत्यय होते हैं जो उनके द्वारा संचालित ऑपरेंड के प्रकारों का जिक्र करते हैं।[2]: 2.11.1  ये इस प्रकार हैं:

Prefix/suffix Operand type
i integer
l long
s short
b byte
c character
f float
d double
a reference

उदाहरण के लिए, iadd दो पूर्णांक जोड़ देगा, जबकि dadd दो युगल जोड़ेंगे। constका>, load, और store निर्देश प्रपत्र का प्रत्यय भी ले सकते हैं _n, जहाँ n 0–3 के लिए संख्या है load और store. के लिए अधिकतम एन const प्रकार से भिन्न होता है। const ई> निर्देश स्टैक पर निर्दिष्ट प्रकार के मान को पुश करते हैं। उदाहरण के लिए, iconst_5 स्टैक पर मान 5 के साथ पूर्णांक (32 बिट मान) पुश करेगा, जबकि dconst_1 स्टैक पर मान 1 के साथ डबल (64 बिट फ्लोटिंग पॉइंट वैल्यू) पुश करेगा। भी है aconst_null, जो धक्का देता है null संदर्भ। एन के लिए load और store निर्देश लोड करने या स्टोर करने के लिए स्थानीय चर सरणी में इंडेक्स निर्दिष्ट करता है। aload_0 e> निर्देश ऑब्जेक्ट को स्थानीय चर 0 में स्टैक पर धकेलता है (यह आमतौर पर this वस्तु)। istore_1 स्टैक के शीर्ष पर पूर्णांक को स्थानीय चर 1 में संग्रहीत करता है। 3 से अधिक स्थानीय चर के लिए प्रत्यय हटा दिया जाता है और ऑपरेंड का उपयोग किया जाना चाहिए।

उदाहरण

निम्नलिखित जावा कोड पर विचार करें:

<वाक्यविन्यास प्रकाश लैंग = जावा> बाहरी: के लिए (int i = 2; i <1000; i++) {

   के लिए (int j = 2; j <i; j++) {
       अगर (मैं% जे == 0)
           बाहरी जारी रखें;
   }
   System.out.println (i);

} </वाक्यविन्यास हाइलाइट>

जावा कंपाइलर ऊपर दिए गए जावा कोड को बायटेकोड में निम्नानुसार अनुवादित कर सकता है, यह मानते हुए कि ऊपर विधि में रखा गया था: <वाक्यविन्यास लैंग = जैस्मीन> 0: आइकॉनस्ट_2 1: आईस्टोर_1 2: iload_1 3: सिपुश 1000 6: if_icmpge 44 9: आइकनस्ट_2 10: आइस्टोर_2 11: iload_2 12: iload_1 13: if_icmpge 31 16: iload_1 17: iload_2 18: इरेम 19 : यदि 25 22: गोटो 38 25: आईएनसी 2, 1 28: गोटो 11 31: गेटस्टैटिक #84; // फील्ड जावा/लैंग/सिस्टम.आउट: लाजावा/आईओ/प्रिंटस्ट्रीम; 34: iload_1 35: इनवोकवर्चुअल #85; // विधि जावा/io/PrintStream.println:(I)V 38: आईएनसी 1, 1 41: गोटो 2 44: रिटर्न </ सिंटैक्स हाइलाइट>

पीढ़ी

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

  • जावा के लिए एक्लिप्स कंपाइलर (ECJ)
  • Jikes, Java से Java bytecode में संकलित (IBM द्वारा विकसित, C++ में कार्यान्वित)
  • एस्प्रेसो, जावा से जावा बाइटकोड में संकलित (केवल जावा 1.0)
  • जावा के लिए GNU कम्पाइलर (GCJ), जावा से जावा बायटेकोड में संकलित करता है; यह देशी मशीन कोड को भी संकलित कर सकता है और संस्करण 6 तक जीएनयू कंपाइलर संग्रह (जीसीसी) का हिस्सा था।

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

  • जैस्मीन (जावा असेंबलर), जावा कक्षाओं के लिए पाठ विवरण लेता है, जावा वर्चुअल मशीन इंस्ट्रक्शन सेट का उपयोग करके साधारण असेंबली-जैसे सिंटैक्स में लिखा जाता है और जावा क्लास फ़ाइल उत्पन्न करता है[3]
  • जमैका, जावा वर्चुअल मशीन के लिए मैक्रो (कंप्यूटर साइंस) असेंबली लैंग्वेज। जावा सिंटैक्स का उपयोग क्लास या इंटरफ़ेस परिभाषा के लिए किया जाता है। विधि निकायों को बाइटकोड निर्देशों का उपयोग करके निर्दिष्ट किया गया है।[4]
  • Krakatau Bytecode Tools, में वर्तमान में तीन टूल हैं: जावा क्लासफाइल्स के लिए डीकंपलर और डिस्सेबलर और क्लासफाइल्स बनाने के लिए असेंबलर।[5]
  • लिलाक, जावा वर्चुअल मशीन के लिए असेंबलर और डिसअसेंबलर।[6]

दूसरों ने जावा वर्चुअल मशीन को लक्षित करने के लिए विभिन्न प्रोग्रामिंग भाषाओं के लिए कंपाइलर विकसित किए हैं, जैसे:


निष्पादन

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

गतिशील भाषाओं के लिए समर्थन

जावा वर्चुअल मशीन टाइप सिस्टम#डायनामिक टाइपिंग के लिए कुछ सहायता प्रदान करती है। अधिकांश मौजूदा जेवीएम निर्देश सेट टाइप सिस्टम # स्टेटिक टाइपिंग है - इस अर्थ में कि मेथड कॉल में उनके हस्ताक्षर संकलन समय पर टाइप-चेक किए जाते हैं, बिना किसी तंत्र के रन टाइम (प्रोग्राम जीवनचक्र चरण) के लिए इस निर्णय को स्थगित करने के लिए, या चुनने के लिए वैकल्पिक दृष्टिकोण द्वारा विधि प्रेषण।[9] जावा सामुदायिक प्रक्रिया 292 (जावा प्लेटफॉर्म पर गतिशील रूप से टाइप की गई भाषाओं का समर्थन)[10] नया जोड़ा invokedynamic JVM स्तर पर निर्देश, डायनेमिक टाइप सिस्टम # टाइप चेकिंग पर निर्भर विधि आमंत्रण की अनुमति देने के लिए (मौजूदा स्टेटिकली टाइप-चेक के बजाय) invokevirtual निर्देश)। दा विंची मशीन प्रोटोटाइप वर्चुअल मशीन कार्यान्वयन है जो गतिशील भाषाओं का समर्थन करने के उद्देश्य से जेवीएम एक्सटेंशन को होस्ट करता है। जावा प्लेटफॉर्म, मानक संस्करण 7 का समर्थन करने वाले सभी जेवीएम में भी शामिल हैं invokedynamic opcode.

यह भी देखें

संदर्भ

  1. "IBM Developer". developer.ibm.com. Retrieved 20 February 2006.{{cite web}}: CS1 maint: url-status (link)
  2. 2.0 2.1 2.2 2.3 2.4 2.5 2.6 Lindholm, Tim; Yellin, Frank; Bracha, Gilad; Buckley, Alex (2015-02-13). The Java Virtual Machine Specification (Java SE 8 ed.).
  3. Jasmin home page
  4. Jamaica: The Java virtual machine (JVM) macro assembler
  5. Krakatau home page
  6. Lilac home page
  7. Free Pascal 3.0 release notes
  8. Free Pascal JVM Target
  9. Nutter, Charles (2007-01-03). "InvokeDynamic: Actually Useful?". Retrieved 2008-01-25.
  10. see JSR 292


बाहरी संबंध