जावा बाइटकोड: Difference between revisions
No edit summary |
No edit summary |
||
Line 65: | Line 65: | ||
जावा संकलक ऊपर दिए गए जावा कोड को बाइटकोड में निम्नानुसार अनुवादित कर सकता है, यह मानते हुए कि ऊपर विधि में रखा गया था: | जावा संकलक ऊपर दिए गए जावा कोड को बाइटकोड में निम्नानुसार अनुवादित कर सकता है, यह मानते हुए कि ऊपर विधि में रखा गया था: | ||
== पीढ़ी == | == पीढ़ी == |
Revision as of 17:27, 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);
}
जावा संकलक ऊपर दिए गए जावा कोड को बाइटकोड में निम्नानुसार अनुवादित कर सकता है, यह मानते हुए कि ऊपर विधि में रखा गया था:
पीढ़ी
javac बाइटकोड का निर्माण करके जावा आभासी यंत्र को लक्षित करने वाली सबसे आम भाषा जावा है। मूल रूप से केवल संकलक मौजूद था, सन माइक्रोसिस्टम्स से जावैक संकलक, जो जावा स्रोत कोड को जावा बाइटकोड में संकलित करता है; लेकिन क्योंकि जावा बाइटकोड के लिए सभी विनिर्देश अब उपलब्ध हैं, अन्य पार्टियों ने संकलक्स की आपूर्ति की है जो जावा बाइटकोड का उत्पादन करते हैं। अन्य संकलक के उदाहरणों में शामिल हैं:
- जावा के लिए एक्लिप्स संकलक (ECJ)
- Jikes, Java से Java bytecode में संकलित (IBM द्वारा विकसित, C++ में कार्यान्वित)
- एस्प्रेसो, जावा से जावा बाइटकोड में संकलित (केवल जावा 1.0)
- जावा के लिए GNU कम्पाइलर (GCJ), जावा से जावा बाइटकोड में संकलित करता है; यह देशी यंत्र कोड को भी संकलित कर सकता है और संस्करण 6 तक जीएनयू संकलक संग्रह (जीसीसी) का भाग था।
कुछ प्रोजेक्ट जावा असेंबलर प्रदान करते हैं ताकि जावा बाइटकोड को हाथ से लिखने में सक्षम बनाया जा सके। यंत्र द्वारा असेंबली कोड भी उत्पन्न किया जा सकता है, उदाहरण के लिए जावा आभासी यंत्र को लक्षित करने वाले संकलक द्वारा। उल्लेखनीय जावा कोडांतरकों में शामिल हैं:
- जैस्मीन (जावा असेंबलर), जावा कक्षाओं के लिए पाठ विवरण लेता है, जावा आभासी यंत्र इंस्ट्रक्शन सेट का उपयोग करके साधारण असेंबली-जैसे सिंटैक्स में लिखा जाता है और जावा क्लास फ़ाइल उत्पन्न करता है[3]
- जमैका, जावा आभासी यंत्र के लिए मैक्रो (कंप्यूटर साइंस) असेंबली भाषा। जावा सिंटैक्स का उपयोग क्लास या इंटरफ़ेस परिभाषा के लिए किया जाता है। विधि निकायों को बाइटकोड निर्देशों का उपयोग करके निर्दिष्ट किया गया है।[4]
- Krakatau Bytecode Tools, में वर्तमान में तीन टूल हैं: जावा क्लासफाइल्स के लिए डीकंपलर और डिस्सेबलर और क्लासफाइल्स बनाने के लिए असेंबलर।[5]
- लिलाक, जावा आभासी यंत्र के लिए असेंबलर और डिसअसेंबलर।[6]
दूसरों ने जावा आभासी यंत्र को लक्षित करने के लिए विभिन्न प्रोग्रामिंग भाषाओं के लिए संकलक विकसित किए हैं, जैसे:
- ठंडा गलन
- JRuby और Jython, Ruby (प्रोग्रामिंग भाषा) और Python (प्रोग्रामिंग भाषा) पर आधारित दो स्क्रिप्टिंग भाषाएँ
- ग्रूवी (प्रोग्रामिंग भाषा), स्थिर-टाइपिंग और स्थिर संकलन क्षमताओं के साथ वैकल्पिक रूप से टाइप की गई और गतिशील सामान्य-उद्देश्य वाली भाषा
- स्कैला (प्रोग्रामिंग भाषा), वस्तु-उन्मुख और कार्यात्मक प्रोग्रामिंग का समर्थन करने वाली प्रकार-सुरक्षित सामान्य-उद्देश्य स्काला (प्रोग्रामिंग भाषा)
- JGNAT और AppletMagic, भाषा Ada (प्रोग्रामिंग भाषा) से Java bytecode में संकलित
- जावा आभासी यंत्र#सी टू बाइटकोड संकलक्स|सी टू जावा बाइट-कोड संकलक्स[dead link]
- क्लोजर, लिस्प (प्रोग्रामिंग भाषा) परिवार में कार्यात्मक, अपरिवर्तनीय, सामान्य-उद्देश्य वाली प्रोग्रामिंग भाषा जिसमें समवर्ती पर जोर दिया गया है
- कावा (योजना कार्यान्वयन), योजना का कार्यान्वयन (प्रोग्रामिंग भाषा) प्रोग्रामिंग भाषा, लिस्प (प्रोग्रामिंग भाषा) की बोली भी।
- मिडलेट पास्कल
- JavaFX स्क्रिप्ट कोड को Java bytecode में संकलित किया गया है
- कोटलिन (प्रोग्रामिंग भाषा), टाइप इंट्रेंस के साथ स्टेटिकली टाइप की गई सामान्य प्रयोजन योजना (प्रोग्रामिंग भाषा)
- वस्तु पास्कल सोर्स कोड फ़्री पास्कल 3.0+ संकलक का उपयोग करके जावा बाइटकोड में संकलित किया गया है।[7][8]
निष्पादन
जावा बाइटकोड को निष्पादित करने के लिए आज कई जावा आभासी यंत्रें उपलब्ध हैं, दोनों मुफ्त और व्यावसायिक उत्पाद। यदि आभासी यंत्र में बाइटकोड निष्पादित करना अवांछनीय है, तो विकासक जावा स्रोत कोड या बाइटकोड को सीधे देशी यंत्र कोड में संकलित कर सकता है जैसे कि जावा के लिए जीएनयू संकलक (जीसीजे)। कुछ प्रोसेसर जावा बाइटकोड को मूल रूप से निष्पादित कर सकते हैं। ऐसे प्रोसेसर को जावा प्रोसेसर कहा जाता है।
गतिशील भाषाओं के लिए समर्थन
जावा आभासी यंत्र टाइप सिस्टम#डायनामिक टाइपिंग के लिए कुछ सहायता प्रदान करती है। अधिकांश मौजूदा जेवीएम निर्देश सेट टाइप सिस्टम # स्टेटिक टाइपिंग है - इस अर्थ में कि मेथड कॉल में उनके हस्ताक्षर संकलन समय पर टाइप-चेक किए जाते हैं, बिना किसी तंत्र के रन टाइम (प्रोग्राम जीवनचक्र चरण) के लिए इस निर्णय को स्थगित करने के लिए, या चुनने के लिए वैकल्पिक दृष्टिकोण द्वारा विधि प्रेषण।[9]
जावा सामुदायिक प्रक्रिया 292 (जावा प्लेटफॉर्म पर गतिशील रूप से टाइप की गई भाषाओं का समर्थन)[10] नया जोड़ा invokedynamic
जेवीएम स्तर पर निर्देश, डायनेमिक टाइप सिस्टम # टाइप चेकिंग पर निर्भर विधि आमंत्रण की अनुमति देने के लिए (मौजूदा स्टेटिकली टाइप-चेक के बजाय) invokevirtual
निर्देश)। दा विंची यंत्र प्रोटोटाइप आभासी यंत्र कार्यान्वयन है जो गतिशील भाषाओं का समर्थन करने के उद्देश्य से जेवीएम एक्सटेंशन को होस्ट करता है। जावा प्लेटफॉर्म, मानक संस्करण 7 का समर्थन करने वाले सभी जेवीएम में भी शामिल हैं invokedynamic
opcode.
यह भी देखें
- जावा बाइटकोड निर्देशों की सूची
- जावा वर्ग फ़ाइल
- जेवीएम भाषाओं की सूची
- जावा बैकपोर्टिंग टूल
- जावा आभासी यंत्र
- 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