2010-02-04 19 views
13

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

+3

आशा http://en.wikipedia.org/wiki/Bytecode मदद करेगा। – Jichao

उत्तर

36

जेवीएम (जावा वर्चुअल मशीन) में एक असली मशीन की तरह एक निर्देश सेट है। इस निर्देश सेट को दिया गया नाम जावा बाइटकोड है। यह Java Virtual Machine Specification में वर्णित है। निष्पादन से पहले अन्य भाषाओं को बाइटकोड में अनुवादित किया जाता है, उदाहरण के लिए रूबी और पायथन। जावा का बाइटकोड काफी कम स्तर पर है जबकि पायथन बहुत अधिक स्तर है।

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

व्याख्या आमतौर पर शुरू करने के लिए जल्दी होती है लेकिन निष्पादन के दौरान धीमी होती है, जबकि जेआईटी के पास अधिक स्टार्टअप ओवरहेड होता है लेकिन बाद में तेज़ी से चलता है। आधुनिक जेवीएम दोनों के लाभ प्राप्त करने के लिए व्याख्या और जेआईटी तकनीकों के संयोजन का उपयोग करते हैं। बाइटकोड का पहली बार व्याख्या की जाती है जबकि जेआईटी पृष्ठभूमि में इसका अनुवाद कर रहा है। एक बार जेआईटी संकलन पूरा हो जाने पर, जेवीएम दुभाषिया के बजाय उस कोड का उपयोग करने के लिए स्विच करता है। कभी-कभी जेआईटी संकलन सी और सी ++ के लिए उपयोग किए जाने वाले समय-समय पर संकलन के मुकाबले बेहतर परिणाम उत्पन्न कर सकता है क्योंकि यह अधिक गतिशील है।JVM ट्रैक रख सकता है कि कोड कितनी बार कॉल किया जाता है और कोड के माध्यम से सामान्य पथ क्या हैं और प्रोग्राम चलते समय अधिक कुशल कोड उत्पन्न करने के लिए इस जानकारी का उपयोग करते हैं। JVM इस नए कोड पर स्विच कर सकता है जैसे कि यह प्रारंभ में दुभाषिया से जेआईटी कोड में स्विच करता है।

जैसे कि अन्य भाषाएं हैं जो देशी कोड, जैसे सी, सी ++, फोरट्रान; अन्य भाषाओं के लिए कंपाइलर्स हैं जो जेवीएम बाइटकोड आउटपुट करते हैं। एक उदाहरण स्कैला भाषा है। मेरा मानना ​​है कि ग्रोवी और जर्बी जावा बाइटकोड में भी परिवर्तित हो सकते हैं।

+1

+1 बहुत अच्छी तरह से समझाया गया – stacker

+1

_ बाइटकोड का पहली बार व्याख्या की गई है जबकि जेआईटी पृष्ठभूमि में इसका अनुवाद कर रहा है। क्या यह एक मल्टी-थ्रेडेड अवधारणा या अनुक्रमिक प्रक्रिया है? – jmishra

+2

@ ladiesMan217, निश्चित रूप से, विशेष कार्यान्वयन तक है; लेकिन मुझे उम्मीद है कि आधुनिक जेवीएम जेआईटी कंपाइलर को समांतर थ्रेड –

13

बाइटकोड आपके स्रोत कोड और वास्तविक मशीन कोड के बीच एक कदम है। जेवीएम बाइटकोड लेता है और इसे मशीन कोड में अनुवाद करता है।

JIT तथ्य यह है कि JVM मक्खी जब कार्यक्रम क्रियान्वित किया जाता है, न कि एक ही चरण में से (सी या सी की तरह में की तरह एक पारंपरिक रूप से संकलित/जुड़ा हुआ भाषा ++)

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

पाठ्यक्रम का नुकसान यह है कि यह आमतौर पर एक मूल रूप से संकलित अनुप्रयोग की तुलना में थोड़ा धीमा होगा क्योंकि JVM को अभी भी बाइट कोड को मशीन कोड में अनुवाद करने में कुछ काम करना है।

+0

"जेवीएम बाइटकोड लेता है और इसे मशीन कोड में अनुवाद करता है।" हमेशा नहीं, है ना? –

0

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

0

jcyang पहले से ही विकिपीडिया के लिए एक लिंक प्रदान की है, लेकिन यह एक अपने प्रश्न के लिए एक बेहतर मुकाबला नहीं है:

Java Bytecode

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

0

बाइटकोड मशीन भाषा निर्देशों के जेवीएम समतुल्य है।

0

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

0

Oracle jdk

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

बाइटकोड जावा प्रोग्राम के लिए संकलित प्रारूप है। एक बार जावा प्रोग्राम को बाइटकोड में परिवर्तित कर दिया गया है, इसे नेटवर्क में स्थानांतरित किया जा सकता है और जावा वर्चुअल मशीन (JVM) द्वारा निष्पादित किया जा सकता है। बाइटकोड फ़ाइलों में आम तौर पर एक .class एक्सटेंशन होता है।

संबंधित मुद्दे