जावा बाइटकोड: Difference between revisions
No edit summary |
No edit summary |
||
(10 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
{{Short description|Instruction set of the Java virtual machine}} | {{Short description|Instruction set of the Java virtual machine}} | ||
कंप्यूटिंग में, '''जावा [[बाईटकोड]]''', जावा [[आभासी मशीन|आभासी | कंप्यूटिंग में, '''जावा [[बाईटकोड]]''', जावा [[आभासी मशीन|आभासी यंत्र]] (जेवीएम) का बाइटकोड-संरचित [[निर्देश समुच्चय]] है, जो आभासी यंत्र जो कंप्यूटर को [[जावा (प्रोग्रामिंग भाषा)]] प्रोग्रामिंग भाषा में लिखे प्रोग्राम चलाने में सक्षम बनाता है और कई अन्य प्रोग्रामिंग भाषाएं, जेवीएम भाषाओं की सूची देखें। | ||
== जावा से संबंध == | == जावा से संबंध == | ||
जावा (प्रोग्रामिंग भाषा) प्रोग्रामर | जावा (प्रोग्रामिंग भाषा) प्रोग्रामर के जावा बाइटकोड के बारे में जानने या समझने की बिल्कुल भी आवश्यकता नहीं है। चूंकि, जैसा कि [[आईबीएम]] विकासक निर्माणकर्ता पत्रिका में सुझाव दिया गया है, कि बाइटकोड को समझना और [[जावा संकलक]] द्वारा बाइटकोड उत्पन्न होने की संभावना जावा प्रोग्रामर को उसी प्रकार सहायता करती है जैसे असेंबली भाषा का ज्ञान [[सी (प्रोग्रामिंग भाषा)]] या [[सी ++]] प्रोग्रामर को सहायता करता है।<ref>{{Cite web |title=IBM Developer |url=https://developer.ibm.com/languages/java/ |url-status=live |access-date=20 February 2006 |website=developer.ibm.com}}</ref> | ||
== निर्देश सेट आर्किटेक्चर == | == निर्देश सेट आर्किटेक्चर == | ||
जेवीएम [[स्टैक मशीन|स्टैक | जेवीएम [[स्टैक मशीन|स्टैक यंत्र]] और [[रजिस्टर मशीन|रजिस्टर यंत्र]] दोनों है। विधि कॉल के प्रत्येक फ्रेम में एक ऑपरेंड स्टैक और स्थानीय चर की एक सरणी होती है।<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| | {{further|जावा बाइटकोड निर्देशों की सूची}} | ||
प्रत्येक बाइटकोड बाइट से बना होता है जो ऑपरेंड के लिए शून्य या अधिक बाइट्स के साथ [[opcode]] का प्रतिनिधित्व करता है।<ref name="jvm"/>{{rp|2.11}} | प्रत्येक बाइटकोड बाइट से बना होता है जो ऑपरेंड के लिए शून्य या अधिक बाइट्स के साथ [[opcode|ओपकोड]] का प्रतिनिधित्व करता है।<ref name="jvm"/>{{rp|2.11}} | ||
256 संभावित बाइट-लॉन्ग ऑपकोड में से | |||
2015 तक 256 संभावित बाइट-लॉन्ग ऑपकोड में से 202 उपयोग (~79%) में हैं, 51 भविष्य में उपयोग (~20%) के लिए आरक्षित हैं, और 3 निर्देश (~1%) उपयोग के लिए जेवीएम कार्यान्वयन के लिए स्थायी रूप से आरक्षित हैं।<ref name="jvm" />{{rp|6.2}} इनमें से दो (<code>impdep1</code> और <code>impdep2</code>) क्रमशः कार्यान्वयन-विशिष्ट सॉफ़्टवेयर और हार्डवेयर के लिए ट्रैप प्रदान करना है। ब्रेकप्वाइंट को प्रायुक्त करने के लिए तीसरे का उपयोग डिबगर्स के लिए किया जाता है। | |||
निर्देश कई व्यापक समूहों में आते हैं: | निर्देश कई व्यापक समूहों में आते हैं: | ||
Line 24: | Line 25: | ||
* विधि मंगलाचरण और वापसी (उदा। <code>invokespecial</code>, <code>areturn</code>) | * विधि मंगलाचरण और वापसी (उदा। <code>invokespecial</code>, <code>areturn</code>) | ||
अपवाद फेंकने, | अपवाद फेंकने, समक्रमण इत्यादि जैसे कई विशिष्ट कार्यों के लिए कुछ निर्देश भी हैं। | ||
कई निर्देशों में उपसर्ग और/या प्रत्यय होते हैं जो उनके द्वारा संचालित ऑपरेंड के प्रकारों का जिक्र करते हैं।<ref name="jvm"/>{{rp|2.11.1}} ये इस प्रकार हैं: | कई निर्देशों में उपसर्ग और/या प्रत्यय होते हैं जो उनके द्वारा संचालित ऑपरेंड के प्रकारों का जिक्र करते हैं।<ref name="jvm"/>{{rp|2.11.1}} ये इस प्रकार हैं: | ||
Line 30: | Line 31: | ||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
! | ! उपसर्ग/प्रत्यय !! ऑपरेंड प्रकार | ||
|- | |- | ||
| <code>i</code> || | | <code>i</code> || पूर्णांक | ||
|- | |- | ||
| <code>l</code> || | | <code>l</code> || लॉन्ग | ||
|- | |- | ||
| <code>s</code> || | | <code>s</code> || शार्ट | ||
|- | |- | ||
| <code>b</code> || | | <code>b</code> || बाइट | ||
|- | |- | ||
| <code>c</code> || | | <code>c</code> || करैक्टर | ||
|- | |- | ||
| <code>f</code> || | | <code>f</code> || फ्लोट | ||
|- | |- | ||
| <code>d</code> || | | <code>d</code> || डबल | ||
|- | |- | ||
| <code>a</code> || | | <code>a</code> || रिफरेन्स | ||
|} | |} | ||
उदाहरण के लिए, <code>iadd</code> दो पूर्णांक जोड़ देगा, जबकि <code>dadd</code> दो युगल जोड़ेंगे। <code>const</code | उदाहरण के लिए, <code>iadd</code> दो पूर्णांक जोड़ देगा, जबकि <code>dadd</code> दो युगल जोड़ेंगे। <code>const</code>, <code>load</code>, और <code>store</code> निर्देश प्रपत्र <code>_''n''</code> का प्रत्यय भी ले सकते हैं, जहाँ n <code>load</code> और <code>store</code> के लिए 0–3 के लिए संख्या है। <code>const</code> के लिए अधिकतम n प्रकार से भिन्न होता है। <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> के लिए n स्थानीय चर सरणी में इंडेक्स को लोड करने या स्टोर करने के लिए निर्दिष्ट करता है। <code>aload_0</code> निर्देश ऑब्जेक्ट को स्थानीय चर 0 में स्टैक पर धकेलता है (यह आमतौर पर <code>[[this (computer programming)|this]]</code> वस्तु)। <code>istore_1</code> स्टैक के शीर्ष पर पूर्णांक को स्थानीय चर 1 में संग्रहीत करता है। 3 से अधिक स्थानीय चर के लिए प्रत्यय हटा दिया जाता है और ऑपरेंड का उपयोग किया जाना चाहिए। | ||
== उदाहरण == | == उदाहरण == | ||
निम्नलिखित जावा कोड पर विचार करें: | निम्नलिखित जावा कोड पर विचार करें:<syntaxhighlight lang="d"> | ||
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); | System.out.println (i); | ||
} | } | ||
</ | </syntaxhighlight> | ||
जावा | जावा संकलक ऊपर दिए गए जावा कोड को बाइटकोड में निम्नानुसार अनुवादित कर सकता है, यह मानते हुए कि ऊपर विधि में रखा गया था:<syntaxhighlight lang="d"> | ||
< | 0: iconst_2 | ||
0: | 1: istore_1 | ||
1: | 2: iload_1 | ||
2: iload_1 | 3: sipush 1000 | ||
3: | 6: if_icmpge 44 | ||
6: if_icmpge 44 | 9: iconst_2 | ||
9: | 10: istore_2 | ||
10: | 11: iload_2 | ||
11: iload_2 | 12: iload_1 | ||
12: iload_1 | 13: if_icmpge 31 | ||
13: if_icmpge 31 | 16: iload_1 | ||
16: iload_1 | 17: iload_2 | ||
17: iload_2 | 18: irem | ||
18: | 19: ifne 25 | ||
19 : | 22: goto 38 | ||
22: | 25: iinc 2, 1 | ||
25: | 28: goto 11 | ||
28: | 31: getstatic #84; // Field java/lang/System.out:Ljava/io/PrintStream; | ||
31: | 34: iload_1 | ||
34: iload_1 | 35: invokevirtual #85; // Method java/io/PrintStream.println:(I)V | ||
35: | 38: iinc 1, 1 | ||
38: | 41: goto 2 | ||
41: | 44: return | ||
44: | </syntaxhighlight> | ||
== पीढ़ी == | == पीढ़ी == | ||
{{Further| | {{Further|जेवीएम भाषाओं की सूची}} | ||
[[javac]] बाइटकोड का निर्माण करके जावा आभासी | [[javac|जावक]] बाइटकोड का निर्माण करके जावा आभासी यंत्र को लक्षित करने वाली सबसे आम भाषा जावा है। मूल रूप से केवल संकलक मौजूद था, [[सन माइक्रोसिस्टम्स]] से जावैक संकलक, जो [[जावा स्रोत कोड]] को जावा बाइटकोड में संकलित करता है; लेकिन क्योंकि जावा बाइटकोड के लिए सभी विनिर्देश अब उपलब्ध हैं, अन्य पार्टियों ने संकलक्स की आपूर्ति की है जो जावा बाइटकोड का उत्पादन करते हैं। अन्य संकलक के उदाहरणों में सम्मिलित हैं: | ||
* जावा के लिए एक्लिप्स | * जावा के लिए एक्लिप्स संकलक (ईसीजे) | ||
*[[Jikes]], | *[[Jikes|जाइक]], जावा से जावा बाइटकोड में संकलित (आईबीएम द्वारा विकसित, सी++ में कार्यान्वित) | ||
* एस्प्रेसो, जावा से जावा बाइटकोड में संकलित (केवल जावा 1.0) | * एस्प्रेसो, जावा से जावा बाइटकोड में संकलित (केवल जावा 1.0) | ||
* जावा के लिए | * जावा के लिए जीएनयू कम्पाइलर (जीसीजे), जावा से जावा बाइटकोड में संकलित करता है; यह देशी [[मशीन कोड|यंत्र कोड]] को भी संकलित कर सकता है और संस्करण 6 तक जीएनयू संकलक संग्रह (जीसीसी) का भाग था। | ||
कुछ प्रोजेक्ट जावा असेंबलर प्रदान करते हैं ताकि जावा बाइटकोड को हाथ से लिखने में सक्षम बनाया जा सके। | कुछ प्रोजेक्ट जावा असेंबलर प्रदान करते हैं ताकि जावा बाइटकोड को हाथ से लिखने में सक्षम बनाया जा सके। यंत्र द्वारा असेंबली कोड भी उत्पन्न किया जा सकता है, उदाहरण के लिए जावा आभासी यंत्र को लक्षित करने वाले संकलक द्वारा। उल्लेखनीय जावा कोडांतरकों में सम्मिलित हैं: | ||
* [[जैस्मीन (जावा असेंबलर)]], जावा कक्षाओं के लिए पाठ विवरण लेता है, जावा आभासी | * [[जैस्मीन (जावा असेंबलर)]], जावा कक्षाओं के लिए पाठ विवरण लेता है, जावा आभासी यंत्र इंस्ट्रक्शन सेट का उपयोग करके साधारण असेंबली-जैसे सिंटैक्स में लिखा जाता है और जावा क्लास फ़ाइल उत्पन्न करता है<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://github.com/Storyyeller/Krakatau Krakatau home page]</ref> | ||
*लिलाक, जावा आभासी | *लिलाक, जावा आभासी यंत्र के लिए असेंबलर और डिसअसेंबलर।<ref>[http://lilac.sourceforge.net Lilac home page]</ref> | ||
दूसरों ने जावा आभासी | दूसरों ने जावा आभासी यंत्र को लक्षित करने के लिए विभिन्न प्रोग्रामिंग भाषाओं के लिए संकलक विकसित किए हैं, जैसे: | ||
*[[ठंडा गलन]] | *[[ठंडा गलन]] | ||
*[[JRuby]] और [[Jython]], | *[[JRuby|जेरूबी]] और [[Jython|ज्योथन]], रूबी (प्रोग्रामिंग भाषा) और पाइथन (प्रोग्रामिंग भाषा) पर आधारित दो स्क्रिप्टिंग भाषाएँ | ||
* [[ग्रूवी (प्रोग्रामिंग भाषा)]], स्थिर-टाइपिंग और स्थिर संकलन क्षमताओं के साथ वैकल्पिक रूप से टाइप की गई और गतिशील सामान्य-उद्देश्य वाली भाषा | * [[ग्रूवी (प्रोग्रामिंग भाषा)]], स्थिर-टाइपिंग और स्थिर संकलन क्षमताओं के साथ वैकल्पिक रूप से टाइप की गई और गतिशील सामान्य-उद्देश्य वाली भाषा | ||
*स्कैला (प्रोग्रामिंग भाषा), वस्तु-उन्मुख और कार्यात्मक प्रोग्रामिंग का समर्थन करने वाली प्रकार-सुरक्षित सामान्य-उद्देश्य [[स्काला (प्रोग्रामिंग भाषा)]] | *स्कैला (प्रोग्रामिंग भाषा), वस्तु-उन्मुख और कार्यात्मक प्रोग्रामिंग का समर्थन करने वाली प्रकार-सुरक्षित सामान्य-उद्देश्य [[स्काला (प्रोग्रामिंग भाषा)]] | ||
*[[JGNAT]] और | *[[JGNAT|जगनत]] और एप्लेटमैजिक, भाषा Ada (प्रोग्रामिंग भाषा) से जावा बाइटकोड में संकलित | ||
*जावा आभासी | *जावा आभासी यंत्र सी टू जावा बाइट-कोड संकलक्स {{dead link|date=December 2018}} | ||
* [[क्लोजर]], लिस्प (प्रोग्रामिंग भाषा) परिवार में कार्यात्मक, अपरिवर्तनीय, सामान्य-उद्देश्य वाली प्रोग्रामिंग भाषा जिसमें समवर्ती पर जोर दिया गया है | * [[क्लोजर]], लिस्प (प्रोग्रामिंग भाषा) परिवार में कार्यात्मक, अपरिवर्तनीय, सामान्य-उद्देश्य वाली प्रोग्रामिंग भाषा जिसमें समवर्ती पर जोर दिया गया है | ||
* [[कावा (योजना कार्यान्वयन)]], योजना का कार्यान्वयन (प्रोग्रामिंग भाषा) प्रोग्रामिंग भाषा, [[लिस्प (प्रोग्रामिंग भाषा)]] की बोली भी। | * [[कावा (योजना कार्यान्वयन)]], योजना का कार्यान्वयन (प्रोग्रामिंग भाषा) प्रोग्रामिंग भाषा, [[लिस्प (प्रोग्रामिंग भाषा)]] की बोली भी। | ||
*[[मिडलेट पास्कल]] | *[[मिडलेट पास्कल]] | ||
* | *जावाएफएक्स स्क्रिप्ट कोड को जावा बाइटकोड में संकलित किया गया है | ||
*[[कोटलिन (प्रोग्रामिंग भाषा)]], टाइप इंट्रेंस के साथ स्टेटिकली टाइप की गई सामान्य प्रयोजन [[योजना (प्रोग्रामिंग भाषा)]] | *[[कोटलिन (प्रोग्रामिंग भाषा)]], टाइप इंट्रेंस के साथ स्टेटिकली टाइप की गई सामान्य प्रयोजन [[योजना (प्रोग्रामिंग भाषा)]] | ||
*[[वस्तु पास्कल]] सोर्स कोड [[फ़्री पास्कल]] 3.0+ | *[[वस्तु पास्कल]] सोर्स कोड [[फ़्री पास्कल|मुफ्त पास्कल]] 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| | {{Further|जावा वर्चुअल यंत्र}} | ||
जावा बाइटकोड को निष्पादित करने के लिए आज कई जावा आभासी | |||
जावा बाइटकोड को मुफ्त और वाणिज्यिक उत्पादों दोनों को निष्पादित करने के लिए आज कई जावा आभासी मशीनें उपलब्ध हैं। यदि आभासी यंत्र में बाइटकोड निष्पादित करना अवांछनीय है, तो विकासक जावा स्रोत कोड या बाइटकोड को सीधे देशी यंत्र कोड में संकलित कर सकता है जैसे कि जावा के लिए जीएनयू संकलक (जीसीजे)। कुछ प्रोसेसर जावा बाइटकोड को मूल रूप से निष्पादित कर सकते हैं। ऐसे प्रोसेसर को [[जावा प्रोसेसर]] कहा जाता है। | |||
== गतिशील भाषाओं के लिए समर्थन == | == गतिशील भाषाओं के लिए समर्थन == | ||
{{Further| | {{Further|जेवीएम भाषाओं की सूची}} | ||
जावा | |||
जावा वर्चुअल मशीन गतिशील रूप से टाइप की जाने वाली भाषाओं के लिए कुछ सहायता प्रदान करती है। अधिकांश वर्तमान जेवीएम निर्देश सेट स्थिर रूप से टाइप किए गए हैं - इस अर्थ में कि विधि कॉल में उनके हस्ताक्षर टाइप किए गए हैं, बिना किसी तंत्र के इस निर्णय को चलाने के लिए या वैकल्पिक दृष्टिकोण द्वारा विधि प्रेषण का चयन करने के लिए [[संकलन समय]] पर टाइप किया गया है।<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 131: | 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> नया | |||
[[जावा सामुदायिक प्रक्रिया]] 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> ओपकोड भी शामिल है। | |||
== यह भी देखें == | == यह भी देखें == | ||
Line 139: | Line 141: | ||
* जेवीएम भाषाओं की सूची | * जेवीएम भाषाओं की सूची | ||
* [[जावा बैकपोर्टिंग टूल]] | * [[जावा बैकपोर्टिंग टूल]] | ||
* जावा आभासी | * जावा आभासी यंत्र | ||
* [[JStik]] | * [[JStik]] | ||
* [[सामान्य मध्यवर्ती भाषा]] (CIL), जावा बाइटकोड के लिए माइक्रोसॉफ्ट का प्रतिद्वंद्वी | * [[सामान्य मध्यवर्ती भाषा]] (CIL), जावा बाइटकोड के लिए माइक्रोसॉफ्ट का प्रतिद्वंद्वी | ||
Line 158: | Line 160: | ||
{{Java (Sun)}} | {{Java (Sun)}} | ||
[[Category: | [[Category:All articles with dead external links]] | ||
[[Category:Articles with dead external links from December 2018]] | |||
[[Category:Articles with hatnote templates targeting a nonexistent page]] | |||
[[Category:CS1 maint]] | |||
[[Category:Collapse templates]] | |||
[[Category:Created On 17/02/2023]] | [[Category:Created On 17/02/2023]] | ||
[[Category:Lua-based templates]] | |||
[[Category:Machine Translated Page]] | |||
[[Category:Navigational boxes| ]] | |||
[[Category:Navigational boxes without horizontal lists]] | |||
[[Category:Pages with empty portal template]] | |||
[[Category:Pages with script errors]] | |||
[[Category:Portal-inline template with redlinked portals]] | |||
[[Category:Portal templates with redlinked portals]] | |||
[[Category:Short description with empty Wikidata description]] | |||
[[Category:Sidebars with styles needing conversion]] | |||
[[Category:Template documentation pages|Documentation/doc]] | |||
[[Category:Templates Vigyan Ready]] | |||
[[Category:Templates generating microformats]] | |||
[[Category:Templates that add a tracking category]] | |||
[[Category:Templates that are not mobile friendly]] | |||
[[Category:Templates that generate short descriptions]] | |||
[[Category:Templates using TemplateData]] | |||
[[Category:Wikipedia metatemplates]] | |||
[[Category:जावा प्लेटफॉर्म| बायटेकोड्स]] | |||
[[Category:बाइटकोड]] | |||
[[Category:विधानसभा भाषाएँ]] |
Latest revision as of 18:36, 20 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]
दूसरों ने जावा आभासी यंत्र को लक्षित करने के लिए विभिन्न प्रोग्रामिंग भाषाओं के लिए संकलक विकसित किए हैं, जैसे:
- ठंडा गलन
- जेरूबी और ज्योथन, रूबी (प्रोग्रामिंग भाषा) और पाइथन (प्रोग्रामिंग भाषा) पर आधारित दो स्क्रिप्टिंग भाषाएँ
- ग्रूवी (प्रोग्रामिंग भाषा), स्थिर-टाइपिंग और स्थिर संकलन क्षमताओं के साथ वैकल्पिक रूप से टाइप की गई और गतिशील सामान्य-उद्देश्य वाली भाषा
- स्कैला (प्रोग्रामिंग भाषा), वस्तु-उन्मुख और कार्यात्मक प्रोग्रामिंग का समर्थन करने वाली प्रकार-सुरक्षित सामान्य-उद्देश्य स्काला (प्रोग्रामिंग भाषा)
- जगनत और एप्लेटमैजिक, भाषा Ada (प्रोग्रामिंग भाषा) से जावा बाइटकोड में संकलित
- जावा आभासी यंत्र सी टू जावा बाइट-कोड संकलक्स[dead link]
- क्लोजर, लिस्प (प्रोग्रामिंग भाषा) परिवार में कार्यात्मक, अपरिवर्तनीय, सामान्य-उद्देश्य वाली प्रोग्रामिंग भाषा जिसमें समवर्ती पर जोर दिया गया है
- कावा (योजना कार्यान्वयन), योजना का कार्यान्वयन (प्रोग्रामिंग भाषा) प्रोग्रामिंग भाषा, लिस्प (प्रोग्रामिंग भाषा) की बोली भी।
- मिडलेट पास्कल
- जावाएफएक्स स्क्रिप्ट कोड को जावा बाइटकोड में संकलित किया गया है
- कोटलिन (प्रोग्रामिंग भाषा), टाइप इंट्रेंस के साथ स्टेटिकली टाइप की गई सामान्य प्रयोजन योजना (प्रोग्रामिंग भाषा)
- वस्तु पास्कल सोर्स कोड मुफ्त पास्कल 3.0+ संकलक का उपयोग करके जावा बाइटकोड में संकलित किया गया है।[7][8]
निष्पादन
जावा बाइटकोड को मुफ्त और वाणिज्यिक उत्पादों दोनों को निष्पादित करने के लिए आज कई जावा आभासी मशीनें उपलब्ध हैं। यदि आभासी यंत्र में बाइटकोड निष्पादित करना अवांछनीय है, तो विकासक जावा स्रोत कोड या बाइटकोड को सीधे देशी यंत्र कोड में संकलित कर सकता है जैसे कि जावा के लिए जीएनयू संकलक (जीसीजे)। कुछ प्रोसेसर जावा बाइटकोड को मूल रूप से निष्पादित कर सकते हैं। ऐसे प्रोसेसर को जावा प्रोसेसर कहा जाता है।
गतिशील भाषाओं के लिए समर्थन
जावा वर्चुअल मशीन गतिशील रूप से टाइप की जाने वाली भाषाओं के लिए कुछ सहायता प्रदान करती है। अधिकांश वर्तमान जेवीएम निर्देश सेट स्थिर रूप से टाइप किए गए हैं - इस अर्थ में कि विधि कॉल में उनके हस्ताक्षर टाइप किए गए हैं, बिना किसी तंत्र के इस निर्णय को चलाने के लिए या वैकल्पिक दृष्टिकोण द्वारा विधि प्रेषण का चयन करने के लिए संकलन समय पर टाइप किया गया है।[9]
जावा सामुदायिक प्रक्रिया 292 (जावा प्लेटफॉर्म पर गतिशील रूप से टाइप की गई भाषाओं का समर्थन)[10] ने जेवीएम स्तर पर एक नया invokedynamic
निर्देश जोड़ा, जो डायनेमिक टाइप चेकिंग (मौजूदा स्टैटिकली टाइप-चेक्ड invokevirtual
निर्देश के अतिरिक्त) पर विश्वाश करने वाली मेथड इनवोकेशन की अनुमति देता है। दा विंची यंत्र प्रोटोटाइप आभासी यंत्र कार्यान्वयन है जो गतिशील भाषाओं का समर्थन करने के उद्देश्य से जेवीएम एक्सटेंशन को होस्ट करता है। जावा प्लेटफॉर्म, मानक संस्करण 7 का समर्थन करने वाले सभी जेवीएम में invokedynamic
ओपकोड भी शामिल है।
यह भी देखें
- जावा बाइटकोड निर्देशों की सूची
- जावा वर्ग फ़ाइल
- जेवीएम भाषाओं की सूची
- जावा बैकपोर्टिंग टूल
- जावा आभासी यंत्र
- JStik
- सामान्य मध्यवर्ती भाषा (CIL), जावा बाइटकोड के लिए माइक्रोसॉफ्ट का प्रतिद्वंद्वी
- ऑब्जेक्टवेब एएसएम
- बाइट कोड इंजीनियरिंग लाइब्रेरी
संदर्भ
- ↑ "IBM Developer". developer.ibm.com. Retrieved 20 February 2006.
{{cite web}}
: CS1 maint: url-status (link) - ↑ 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.).
- ↑ Jasmin home page
- ↑ Jamaica: The Java virtual machine (JVM) macro assembler
- ↑ Krakatau home page
- ↑ Lilac home page
- ↑ Free Pascal 3.0 release notes
- ↑ Free Pascal JVM Target
- ↑ Nutter, Charles (2007-01-03). "InvokeDynamic: Actually Useful?". Retrieved 2008-01-25.
- ↑ see JSR 292
बाहरी संबंध
- Oracle's Java Virtual Machine Specification
- Programming Languages for the Java Virtual Machine
- Bytecode Visualizer – bytecode viewer and debugger (free Eclipse plugin)
- AdaptJ StackTrace – bytecode level debugging with a full control of the stack, the local variables, and the execution flow
- Java Class Unpacker – plugin for Total Commander, it lets open class files as compressed archives and see fields and methods as files. The bytecode can be viewed as text using F3