जावा बाइटकोड

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

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

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

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

निर्देश कई व्यापक समूहों में आते हैं:
 * लोड और स्टोर (उदा।,  )
 * अंकगणित और तर्क (उदा.,  )
 * प्रकार रूपांतरण (उदा.,  )
 * वस्तु निर्माण और हेरफेर
 * ऑपरेंड स्टैक प्रबंधन (उदा।,  )
 * नियंत्रण हस्तांतरण (उदा।,  )
 * विधि मंगलाचरण और वापसी (उदा।,  )

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

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

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

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

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

एक जावा कंपाइलर ऊपर दिए गए जावा कोड को बायटेकोड में निम्नानुसार अनुवादित कर सकता है, यह मानते हुए कि ऊपर एक विधि में रखा गया था: <वाक्यविन्यास लैंग = जैस्मीन> 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 तक जीएनयू कंपाइलर संग्रह (जीसीसी) का हिस्सा था।

कुछ प्रोजेक्ट जावा असेंबलर प्रदान करते हैं ताकि जावा बायटेकोड को हाथ से लिखने में सक्षम बनाया जा सके। मशीन द्वारा असेंबली कोड भी उत्पन्न किया जा सकता है, उदाहरण के लिए जावा वर्चुअल मशीन को लक्षित करने वाले कंपाइलर द्वारा। उल्लेखनीय जावा कोडांतरकों में शामिल हैं: दूसरों ने जावा वर्चुअल मशीन को लक्षित करने के लिए विभिन्न प्रोग्रामिंग भाषाओं के लिए कंपाइलर विकसित किए हैं, जैसे:
 * जैस्मीन (जावा असेंबलर), जावा कक्षाओं के लिए पाठ विवरण लेता है, जावा वर्चुअल मशीन इंस्ट्रक्शन सेट का उपयोग करके एक साधारण असेंबली-जैसे सिंटैक्स में लिखा जाता है और जावा क्लास फ़ाइल उत्पन्न करता है
 * जमैका, जावा वर्चुअल मशीन के लिए एक मैक्रो (कंप्यूटर साइंस) असेंबली लैंग्वेज। जावा सिंटैक्स का उपयोग क्लास या इंटरफ़ेस परिभाषा के लिए किया जाता है। विधि निकायों को बाइटकोड निर्देशों का उपयोग करके निर्दिष्ट किया गया है।
 * Krakatau Bytecode Tools, में वर्तमान में तीन टूल हैं: जावा क्लासफाइल्स के लिए एक डीकंपलर और डिस्सेबलर और क्लासफाइल्स बनाने के लिए एक असेंबलर।
 * लिलाक, जावा वर्चुअल मशीन के लिए एक असेंबलर और डिसअसेंबलर।
 * ठंडा गलन
 * JRuby और Jython, Ruby (प्रोग्रामिंग भाषा) और Python (प्रोग्रामिंग भाषा) पर आधारित दो स्क्रिप्टिंग भाषाएँ
 * ग्रूवी (प्रोग्रामिंग भाषा), स्थिर-टाइपिंग और स्थिर संकलन क्षमताओं के साथ वैकल्पिक रूप से टाइप की गई और गतिशील सामान्य-उद्देश्य वाली भाषा
 * स्कैला (प्रोग्रामिंग भाषा), वस्तु-उन्मुख और कार्यात्मक प्रोग्रामिंग का समर्थन करने वाली एक प्रकार-सुरक्षित सामान्य-उद्देश्य स्काला (प्रोग्रामिंग भाषा)
 * JGNAT और AppletMagic, भाषा Ada (प्रोग्रामिंग भाषा) से Java bytecode में संकलित
 * जावा वर्चुअल मशीन#सी टू बाइटकोड कंपाइलर्स|सी टू जावा बाइट-कोड कंपाइलर्स
 * क्लोजर, लिस्प (प्रोग्रामिंग लैंग्वेज) परिवार में एक कार्यात्मक, अपरिवर्तनीय, सामान्य-उद्देश्य वाली प्रोग्रामिंग भाषा जिसमें समवर्ती पर जोर दिया गया है
 * कावा (योजना कार्यान्वयन), योजना का कार्यान्वयन (प्रोग्रामिंग भाषा) प्रोग्रामिंग भाषा, लिस्प (प्रोग्रामिंग भाषा) की एक बोली भी।
 * मिडलेट पास्कल
 * JavaFX स्क्रिप्ट कोड को Java bytecode में संकलित किया गया है
 * कोटलिन (प्रोग्रामिंग भाषा), टाइप इंट्रेंस के साथ स्टेटिकली टाइप की गई सामान्य प्रयोजन योजना (प्रोग्रामिंग भाषा)
 * वस्तु पास्कल सोर्स कोड फ़्री पास्कल 3.0+ कंपाइलर का उपयोग करके जावा बाइटकोड में संकलित किया गया है।

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

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

यह भी देखें

 * जावा बाइटकोड निर्देशों की सूची
 * जावा वर्ग फ़ाइल
 * जेवीएम भाषाओं की सूची
 * जावा बैकपोर्टिंग टूल
 * जावा वर्चुअल मशीन
 * JStik
 * सामान्य मध्यवर्ती भाषा (CIL), जावा बाइटकोड के लिए माइक्रोसॉफ्ट का प्रतिद्वंद्वी
 * ऑब्जेक्टवेब एएसएम
 * बाइट कोड इंजीनियरिंग लाइब्रेरी

बाहरी संबंध

 * 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