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

From Vigyanwiki
No edit summary
No edit summary
Line 64: Line 64:
</syntaxhighlight>
</syntaxhighlight>


जावा संकलक ऊपर दिए गए जावा कोड को बाइटकोड में निम्नानुसार अनुवादित कर सकता है, यह मानते हुए कि ऊपर विधि में रखा गया था:
जावा संकलक ऊपर दिए गए जावा कोड को बाइटकोड में निम्नानुसार अनुवादित कर सकता है, यह मानते हुए कि ऊपर विधि में रखा गया था:<syntaxhighlight lang="d">
0:  iconst_2
1:  istore_1
2:  iload_1
3:  sipush  1000
6:  if_icmpge      44
9:  iconst_2
10:  istore_2
11:  iload_2
12:  iload_1
13:  if_icmpge      31
16:  iload_1
17:  iload_2
18:  irem
19:  ifne    25
22:  goto    38
25:  iinc    2, 1
28:  goto    11
31:  getstatic      #84; // Field java/lang/System.out:Ljava/io/PrintStream;
34:  iload_1
35:  invokevirtual  #85; // Method java/io/PrintStream.println:(I)V
38:  iinc    1, 1
41:  goto    2
44:  return
</syntaxhighlight>


== पीढ़ी ==
== पीढ़ी ==
{{Further|List of JVM languages}}
{{Further|जेवीएम भाषाओं की सूची}}
[[javac]] बाइटकोड का निर्माण करके जावा आभासी यंत्र को लक्षित करने वाली सबसे आम भाषा जावा है। मूल रूप से केवल संकलक मौजूद था, [[सन माइक्रोसिस्टम्स]] से जावैक संकलक, जो [[जावा स्रोत कोड]] को जावा बाइटकोड में संकलित करता है; लेकिन क्योंकि जावा बाइटकोड के लिए सभी विनिर्देश अब उपलब्ध हैं, अन्य पार्टियों ने संकलक्स की आपूर्ति की है जो जावा बाइटकोड का उत्पादन करते हैं। अन्य संकलक के उदाहरणों में शामिल हैं:
[[javac|जावक]] बाइटकोड का निर्माण करके जावा आभासी यंत्र को लक्षित करने वाली सबसे आम भाषा जावा है। मूल रूप से केवल संकलक मौजूद था, [[सन माइक्रोसिस्टम्स]] से जावैक संकलक, जो [[जावा स्रोत कोड]] को जावा बाइटकोड में संकलित करता है; लेकिन क्योंकि जावा बाइटकोड के लिए सभी विनिर्देश अब उपलब्ध हैं, अन्य पार्टियों ने संकलक्स की आपूर्ति की है जो जावा बाइटकोड का उत्पादन करते हैं। अन्य संकलक के उदाहरणों में सम्मिलित हैं:
* जावा के लिए एक्लिप्स संकलक (ECJ)
* जावा के लिए एक्लिप्स संकलक (ईसीजे)
*[[Jikes]], Java से Java bytecode में संकलित (IBM द्वारा विकसित, C++ में कार्यान्वित)
*[[Jikes|जाइक]], जावा से जावा बाइटकोड में संकलित (आईबीएम द्वारा विकसित, सी++ में कार्यान्वित)
* एस्प्रेसो, जावा से जावा बाइटकोड में संकलित (केवल जावा 1.0)
* एस्प्रेसो, जावा से जावा बाइटकोड में संकलित (केवल जावा 1.0)
* जावा के लिए GNU कम्पाइलर (GCJ), जावा से जावा बाइटकोड में संकलित करता है; यह देशी [[मशीन कोड|यंत्र कोड]] को भी संकलित कर सकता है और संस्करण 6 तक जीएनयू संकलक संग्रह (जीसीसी) का भाग था।
* जावा के लिए जीएनयू कम्पाइलर (जीसीजे), जावा से जावा बाइटकोड में संकलित करता है; यह देशी [[मशीन कोड|यंत्र कोड]] को भी संकलित कर सकता है और संस्करण 6 तक जीएनयू संकलक संग्रह (जीसीसी) का भाग था।


कुछ प्रोजेक्ट जावा असेंबलर प्रदान करते हैं ताकि जावा बाइटकोड को हाथ से लिखने में सक्षम बनाया जा सके। यंत्र द्वारा असेंबली कोड भी उत्पन्न किया जा सकता है, उदाहरण के लिए जावा आभासी यंत्र को लक्षित करने वाले संकलक द्वारा। उल्लेखनीय जावा कोडांतरकों में शामिल हैं:
कुछ प्रोजेक्ट जावा असेंबलर प्रदान करते हैं ताकि जावा बाइटकोड को हाथ से लिखने में सक्षम बनाया जा सके। यंत्र द्वारा असेंबली कोड भी उत्पन्न किया जा सकता है, उदाहरण के लिए जावा आभासी यंत्र को लक्षित करने वाले संकलक द्वारा। उल्लेखनीय जावा कोडांतरकों में सम्मिलित हैं:
* [[जैस्मीन (जावा असेंबलर)]], जावा कक्षाओं के लिए पाठ विवरण लेता है, जावा आभासी यंत्र इंस्ट्रक्शन सेट का उपयोग करके साधारण असेंबली-जैसे सिंटैक्स में लिखा जाता है और जावा क्लास फ़ाइल उत्पन्न करता है<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>
*क्राकाटाऊ बाइटकोड उपकरण, में वर्तमान में जावा क्लासफाइल्स के लिए डीकंपाइलर और डिस्सेबलर और क्लासफाइल्स बनाने के लिए असेंबलर तीन उपकरण हैं।<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|ज्योथन]], रूबी (प्रोग्रामिंग भाषा) और पाइथन (प्रोग्रामिंग भाषा) पर आधारित दो स्क्रिप्टिंग भाषाएँ
* [[ग्रूवी (प्रोग्रामिंग भाषा)]], स्थिर-टाइपिंग और स्थिर संकलन क्षमताओं के साथ वैकल्पिक रूप से टाइप की गई और गतिशील सामान्य-उद्देश्य वाली भाषा
* [[ग्रूवी (प्रोग्रामिंग भाषा)]], स्थिर-टाइपिंग और स्थिर संकलन क्षमताओं के साथ वैकल्पिक रूप से टाइप की गई और गतिशील सामान्य-उद्देश्य वाली भाषा
*स्कैला (प्रोग्रामिंग भाषा), वस्तु-उन्मुख और कार्यात्मक प्रोग्रामिंग का समर्थन करने वाली प्रकार-सुरक्षित सामान्य-उद्देश्य [[स्काला (प्रोग्रामिंग भाषा)]]
*स्कैला (प्रोग्रामिंग भाषा), वस्तु-उन्मुख और कार्यात्मक प्रोग्रामिंग का समर्थन करने वाली प्रकार-सुरक्षित सामान्य-उद्देश्य [[स्काला (प्रोग्रामिंग भाषा)]]
*[[JGNAT]] और AppletMagic, भाषा Ada (प्रोग्रामिंग भाषा) से Java bytecode में संकलित
*[[JGNAT|जगनत]] और एप्लेटमैजिक, भाषा Ada (प्रोग्रामिंग भाषा) से जावा बाइटकोड में संकलित
*जावा आभासी यंत्र#सी टू बाइटकोड संकलक्स|सी टू जावा बाइट-कोड संकलक्स {{dead link|date=December 2018}}
*जावा आभासी यंत्र सी टू जावा बाइट-कोड संकलक्स {{dead link|date=December 2018}}
* [[क्लोजर]], लिस्प (प्रोग्रामिंग भाषा) परिवार में कार्यात्मक, अपरिवर्तनीय, सामान्य-उद्देश्य वाली प्रोग्रामिंग भाषा जिसमें समवर्ती पर जोर दिया गया है
* [[क्लोजर]], लिस्प (प्रोग्रामिंग भाषा) परिवार में कार्यात्मक, अपरिवर्तनीय, सामान्य-उद्देश्य वाली प्रोग्रामिंग भाषा जिसमें समवर्ती पर जोर दिया गया है
* [[कावा (योजना कार्यान्वयन)]], योजना का कार्यान्वयन (प्रोग्रामिंग भाषा) प्रोग्रामिंग भाषा, [[लिस्प (प्रोग्रामिंग भाषा)]] की बोली भी।
* [[कावा (योजना कार्यान्वयन)]], योजना का कार्यान्वयन (प्रोग्रामिंग भाषा) प्रोग्रामिंग भाषा, [[लिस्प (प्रोग्रामिंग भाषा)]] की बोली भी।
*[[मिडलेट पास्कल]]
*[[मिडलेट पास्कल]]
*JavaFX स्क्रिप्ट कोड को Java bytecode में संकलित किया गया है
*जावाएफएक्स स्क्रिप्ट कोड को जावा बाइटकोड में संकलित किया गया है
*[[कोटलिन (प्रोग्रामिंग भाषा)]], टाइप इंट्रेंस के साथ स्टेटिकली टाइप की गई सामान्य प्रयोजन [[योजना (प्रोग्रामिंग भाषा)]]
*[[कोटलिन (प्रोग्रामिंग भाषा)]], टाइप इंट्रेंस के साथ स्टेटिकली टाइप की गई सामान्य प्रयोजन [[योजना (प्रोग्रामिंग भाषा)]]
*[[वस्तु पास्कल]] सोर्स कोड [[फ़्री पास्कल]] 3.0+ संकलक का उपयोग करके जावा बाइटकोड में संकलित किया गया है।<ref>[http://wiki.freepascal.org/FPC_New_Features_3.0#Support_for_the_Java_Virtual_Machine_and_Dalvik_targets Free Pascal 3.0 release notes]</ref><ref>[http://wiki.freepascal.org/FPC_JVM Free Pascal JVM Target]</ref>
*[[वस्तु पास्कल]] सोर्स कोड [[फ़्री पास्कल|मुफ्त पास्कल]] 3.0+ संकलक का उपयोग करके जावा बाइटकोड में संकलित किया गया है।<ref>[http://wiki.freepascal.org/FPC_New_Features_3.0#Support_for_the_Java_Virtual_Machine_and_Dalvik_targets Free Pascal 3.0 release notes]</ref><ref>[http://wiki.freepascal.org/FPC_JVM Free Pascal JVM Target]</ref>




== निष्पादन ==
== निष्पादन ==
{{Further|Java virtual machine}}
{{Further|जावा वर्चुअल यंत्र}}
जावा बाइटकोड को निष्पादित करने के लिए आज कई जावा आभासी यंत्रें उपलब्ध हैं, दोनों मुफ्त और व्यावसायिक उत्पाद। यदि आभासी यंत्र में बाइटकोड निष्पादित करना अवांछनीय है, तो विकासक जावा स्रोत कोड या बाइटकोड को सीधे देशी यंत्र कोड में संकलित कर सकता है जैसे कि जावा के लिए जीएनयू संकलक (जीसीजे)। कुछ प्रोसेसर जावा बाइटकोड को मूल रूप से निष्पादित कर सकते हैं। ऐसे प्रोसेसर को [[जावा प्रोसेसर]] कहा जाता है।
 
जावा बाइटकोड को मुफ्त और वाणिज्यिक उत्पादों दोनों को निष्पादित करने के लिए आज कई जावा आभासी मशीनें उपलब्ध हैं। यदि आभासी यंत्र में बाइटकोड निष्पादित करना अवांछनीय है, तो विकासक जावा स्रोत कोड या बाइटकोड को सीधे देशी यंत्र कोड में संकलित कर सकता है जैसे कि जावा के लिए जीएनयू संकलक (जीसीजे)। कुछ प्रोसेसर जावा बाइटकोड को मूल रूप से निष्पादित कर सकते हैं। ऐसे प्रोसेसर को [[जावा प्रोसेसर]] कहा जाता है।


== गतिशील भाषाओं के लिए समर्थन ==
== गतिशील भाषाओं के लिए समर्थन ==
{{Further|List of JVM languages}}
{{Further|जेवीएम भाषाओं की सूची}}
जावा आभासी यंत्र टाइप सिस्टम#डायनामिक टाइपिंग के लिए कुछ सहायता प्रदान करती है। अधिकांश मौजूदा जेवीएम निर्देश सेट टाइप सिस्टम # स्टेटिक टाइपिंग है - इस अर्थ में कि मेथड कॉल में उनके हस्ताक्षर [[संकलन समय]] पर टाइप-चेक किए जाते हैं, बिना किसी तंत्र के रन टाइम (प्रोग्राम जीवनचक्र चरण) के लिए इस निर्णय को स्थगित करने के लिए, या चुनने के लिए वैकल्पिक दृष्टिकोण द्वारा विधि प्रेषण।<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 106: Line 132:
|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> जेवीएम स्तर पर निर्देश, डायनेमिक टाइप सिस्टम # टाइप चेकिंग पर निर्भर विधि आमंत्रण की अनुमति देने के लिए (मौजूदा स्टेटिकली टाइप-चेक के बजाय) <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> निर्देश जोड़ा, जो डायनेमिक टाइप चेकिंग (मौजूदा स्टैटिकली टाइप-चेक्ड <code>invokevirtual</code> निर्देश के अतिरिक्त) पर विश्वाश करने वाली मेथड इनवोकेशन की अनुमति देता है। [[दा विंची मशीन|दा विंची यंत्र]] प्रोटोटाइप आभासी यंत्र कार्यान्वयन है जो गतिशील भाषाओं का समर्थन करने के उद्देश्य से जेवीएम एक्सटेंशन को होस्ट करता है। जावा प्लेटफॉर्म, मानक संस्करण 7 का समर्थन करने वाले सभी जेवीएम में <code>invokedynamic</code> ओपकोड भी शामिल है।


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

Revision as of 17:43, 3 March 2023

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

जावा से संबंध

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


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

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


निर्देश सेट

प्रत्येक बाइटकोड बाइट से बना होता है जो ऑपरेंड के लिए शून्य या अधिक बाइट्स के साथ ओपकोड का प्रतिनिधित्व करता है।[2]: 2.11 

2015 तक 256 संभावित बाइट-लॉन्ग ऑपकोड में से 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  ये इस प्रकार हैं:

उपसर्ग/प्रत्यय ऑपरेंड प्रकार
i पूर्णांक
l लॉन्ग
s शार्ट
b बाइट
c करैक्टर
f फ्लोट
d डबल
a रिफरेन्स

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

उदाहरण

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

outer:
for (int i = 2; i < 1000; i++) {
    for (int j = 2; j < i; j++) {
        if (i % j == 0)
            continue outer;
    }
    System.out.println (i);
}

जावा संकलक ऊपर दिए गए जावा कोड को बाइटकोड में निम्नानुसार अनुवादित कर सकता है, यह मानते हुए कि ऊपर विधि में रखा गया था:

0:   iconst_2
1:   istore_1
2:   iload_1
3:   sipush  1000
6:   if_icmpge       44
9:   iconst_2
10:  istore_2
11:  iload_2
12:  iload_1
13:  if_icmpge       31
16:  iload_1
17:  iload_2
18:  irem
19:  ifne    25
22:  goto    38
25:  iinc    2, 1
28:  goto    11
31:  getstatic       #84; // Field java/lang/System.out:Ljava/io/PrintStream;
34:  iload_1
35:  invokevirtual   #85; // Method java/io/PrintStream.println:(I)V
38:  iinc    1, 1
41:  goto    2
44:  return

पीढ़ी

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

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

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

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

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


निष्पादन

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

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

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

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

यह भी देखें

संदर्भ

  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


बाहरी संबंध