जावा एक संकलित या एक व्याख्या की गई प्रोग्रामिंग भाषा है?


169

पूर्व में मैंने प्रोग्रामिंग भाषा के रूप में C ++ का उपयोग किया है। मुझे पता है कि C ++ में लिखा कोड एक संकलन प्रक्रिया से गुजरता है जब तक कि यह ऑब्जेक्ट कोड "मशीन कोड" नहीं बन जाता।

मैं जानना चाहूंगा कि जावा उस संबंध में कैसे काम करता है। उपयोगकर्ता द्वारा लिखा गया जावा कोड कंप्यूटर द्वारा कैसे चलाया जाता है?


14
C ++ की व्याख्या की जा सकती है। वहाँ कुछ सी दुभाषिया हैं।
टॉम हॉन्टिन -

जवाबों:


220

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

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

तकनीकी रूप से जावा को मूल कोड से आगे-आगे संकलन करना और परिणामी बाइनरी को चलाना संभव है। जावा कोड की सीधे व्याख्या करना भी संभव है।

संक्षेपण करने के लिए, निष्पादन पर्यावरण के आधार पर, बायटेकोड हो सकता है:

  • समय से पहले संकलित और मूल कोड के रूप में निष्पादित (अधिकांश सी ++ संकलक के समान)
  • संकलित समय और संकलित
  • व्याख्या की
  • एक समर्थित प्रोसेसर द्वारा सीधे निष्पादित किया जाता है (बायटेकोड कुछ सीपीयू का मूल अनुदेश सेट है)

20
असल में, कुछ हॉटस्पॉट JVM बाईटकोड की व्याख्या करके शुरू करते हैं, और केवल मूल कोड के संकलन के बाद उन्हें पता चलता है कि वे क्या संकलन करने लायक हैं, और कोड को कैसे चलाया जा रहा है, इसके बारे में कुछ आँकड़े एकत्र किए हैं; प्रत्येक सशर्त शाखा में लिए गए सबसे सामान्य पथ का पता लगाने के लिए।
स्टीफन C

1
इसलिए शब्द 'हॉटस्पॉट' :) यह एक अनुकूलन हासिल करने के लिए अक्सर चल रहा है।
दोपहर सिल्क 4

4
आप हॉटस्पॉट में -Xcomp के साथ दुभाषिया को बंद कर सकते हैं। एक बुरा विचार क्या है यह देखने के लिए एक आवेदन पर कोशिश कर रहा है।
टॉम हॉन्टिन -

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

चूँकि जावा एक व्याख्यात्मक भाषा है, यह प्रदर्शन या किसी जावा अनुप्रयोग निष्पादन को कैसे प्रभावित करेगा
NAND

93

यहां छवि विवरण दर्ज करें

जावा में लिखा गया कोड है:

  • पहले एक प्रोग्राम द्वारा बायटेकोड पर संकलित किया गया, जिसे जेवैक कहा जाता है जैसा कि ऊपर की छवि के बाएं भाग में दिखाया गया है;
  • फिर, जैसा कि ऊपर की छवि के दाहिने हिस्से में दिखाया गया है, जावा नामक एक अन्य प्रोग्राम जावा रनटाइम वातावरण को शुरू करता है और यह जावा इंटरप्रेटर / जेआईटी कंपाइलर का उपयोग करके बायटेकोड को संकलित और / या व्याख्या कर सकता है।

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


क्या यह कैश्ड बाईटेकोड के कारण है कि जावा बहुत अधिक मेमोरी का उपयोग करता है?
पेड्रो गॉर्डो

3
@ कॉमेडुलम: एक 'बहुत सारी स्मृति' एक फजी कथन है। जावा का मेमोरी मैनेजमेंट बहुत सीधा है - तीन पीढ़ियां जेवीएम का उपयोग अपनी वस्तुओं के निर्माण और रखरखाव के लिए करती हैं। यह एक और SO उत्तर आपके लिए उपयोगी हो सकता है।
DISPLAYNAME

उपरोक्त स्पष्टीकरण के साथ, सैद्धांतिक रूप से, C ++ संकलित कोड हमेशा तार्किक रूप से समान जावा कोड से अधिक तेज़ होगा क्योंकि हमेशा .class फ़ाइल का कुछ भाग होगा जो JIT मशीन कोड में बदलने का निर्णय नहीं करता है। दूसरे शब्दों में, जावा कभी भी नंगे धातु निष्पादन की गति को नहीं पकड़ सकता है जिसे C ++ ने प्रदर्शित किया है। क्या यह सही धारणा है?
देवदत्त १६

@DevdattaK: मैं C ++ को इतना नहीं जानता, लेकिन मेरा अनुमान है कि छोटे और विशेष कार्यक्रमों के लिए, जावा आपको तेजी से परिणाम दे सकता है क्योंकि यह कोड के उन हिस्सों को संकलित करने में समय बर्बाद नहीं करेगा जहां बहुत अधिक गति उपलब्ध नहीं है।
डिस्प्लेनेम

1
@DevdattaK आपकी धारणा की चर्चा इस विकी पृष्ठ en.m.wikipedia.org/wiki/Java_performance?wprov=sfla1 में की गई है । संक्षेप में, यह हमेशा सच नहीं होता है।
सुंदर राजन

57

"व्याख्या की गई भाषा" या "संकलित भाषा" शब्द का कोई मतलब नहीं है, क्योंकि किसी भी प्रोग्रामिंग भाषा की व्याख्या और / या संकलित की जा सकती है।

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

इन दिनों आंशिक जस्ट-इन-टाइम संकलन का उपयोग कई भाषाओं के लिए किया जाता है, जिन्हें कभी "व्याख्यायित" माना जाता था, उदाहरण के लिए जावास्क्रिप्ट।


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

3
आप जावास्क्रिप्ट के बारे में एक जावा प्रश्न में क्यों बात कर रहे हैं?
कोरे तुगे

1
@KorayTugay एक उदाहरण के रूप में। मैं निश्चित रूप से यह नहीं कहना चाहता कि जावा और जावास्क्रिप्ट में उनके नाम के पहले चार अक्षरों के अलावा कुछ भी सामान्य नहीं है।
starblue

व्याख्या की गई और संकलित भाषा में कम से कम अंतर का मतलब यह नहीं होगा कि संकलित भाषा बाइनरी में किसी भी समय निष्पादन प्रवाह में बदलाव नहीं हो सकता है, जबकि एक व्याख्या की गई भाषा कुछ मौजूदा कार्यों की आज्ञाकारी है? C में लाइब्रेरी विकल्प है जबकि अन्य भाषाओं में आपके पास C बाइनरी एक्सटेंशन के बिना एक सरणी ऑब्जेक्ट नहीं हो सकता है जिसे अपडेट किया जा सकता है या किसी अन्य प्लेटफॉर्म पर पूरी तरह से अलग कोड हो सकता है। स्क्रिप्टिंग भाषा दोनों को चलाने में सक्षम होगी, जबकि संकलित भाषा को चलाने के लिए एक अलग बाइनरी की आवश्यकता होगी
ईटन इमेरिच

53

जावा को बायटेकोड के लिए संकलित किया गया है, जो तब जावा वीएम में जाता है, जो इसकी व्याख्या करता है।


33
... लेकिन सख्ती से सही नहीं।
स्टीफन C

2
JVM बाइटकोड को "व्याख्या" करने के लिए नहीं चुन सकता है। यह JIT इसे संकलित कर सकता है और इसे सीधे निष्पादित कर सकता है।
मेहरदाद अफश्री २५'० ९ ४:४ Af

1
JIT तकनीकी रूप से इसे सीधे निष्पादित नहीं कर रही है। यह सिर्फ याद है कि इसे कैसे अंजाम दिया गया था।
cletus

मेहरदाद: सहमत, मैंने संभवतः जेआईटी संचालन का वर्णन यहां नहीं किया था, जैसा कि मुझे लगता है कि जेवीएम तक, और मैं वैसे भी अपना उत्तर सरल रख रहा था :)
दोपहर का सिल्क

7
cletus: JIT के बाद , इसे सीधे निष्पादित किया जाएगा। JIT बाइटेकोड का एक टुकड़ा (उदाहरण के लिए एक पूर्ण विधि) पढ़ रहा है और मशीन कोड के लिए संकलन कर रहा है और इसे कूद रहा है।
मेहरदाद अफश्री

12

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


11

दोनों की तरह। सबसे पहले जावा को संकलित किया गया (कुछ "अनूदित" कहना पसंद करेंगे) बायटेकोड को, जो तब या तो संकलित किया गया, या जेआईटी के मूड के आधार पर व्याख्या की गई।


32
यह सॉफ्टवेयर का एक उन्नत टुकड़ा है, जो मूड विकसित करने के लिए :)
थोरारिन 25'09

5
जेआईटी वास्तव में एक बहुत ही परिष्कृत सॉफ्टवेयर है, जो रनटाइम सूचना (एक प्रोफाइलर की तरह) के आधार पर अनुकूलन कर सकता है, जो कि एक समय से आगे संकलक नहीं कर सकता (क्योंकि इसमें रनटाइम व्यवहार के बारे में जानकारी नहीं है) समय से पहले एक कार्यक्रम)। लेकिन यह वास्तव में मूड नहीं है ... :-)
जेस्पर

5

जावा संकलन और व्याख्या दोनों करता है,

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

जब प्रोग्राम को चलाया जाना है, तो बायटेकोड को कन्वर्ट किया जाता है , सिर्फ-इन-टाइम (JIT) कंपाइलर का उपयोग करके बायटेकोड को परिवर्तित किया जा सकता है। परिणाम मशीन कोड है जिसे फिर मेमोरी में फीड किया जाता है और निष्पादित किया जाता है।

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

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

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

जावा की तरह आधुनिक प्रोग्रामिंग भाषा कार्यान्वयन में, यह दोनों विकल्पों को प्रदान करने के लिए एक मंच के लिए तेजी से लोकप्रिय है।


होना चाहिए "बाईटकोड सकता है बजाय" परिवर्तित किया जा " है परिवर्तित"। जावा ऐन्टेना बायटेकोड को परिभाषित करता है। चाहे वह बाईटकोड चला रहा हो (a) सीधे हार्डवेयर में , (b) इंटरप्रेटर के माध्यम से, (c) पहले से संकलित किया गया हो, या (d) रनटाइम के दौरान आंशिक रूप से संकलित किया गया हो, सभी कार्यान्वयन विवरण के रूप में बचे हुए हैं। ध्यान दें कि उन सभी विकल्पों में से चार का उपयोग वास्तव में विभिन्न वास्तविक दुनिया जावा कार्यान्वयन द्वारा किया गया है।
बेसिल बोर्ख

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

Jazelle DBX (Direct Bytecode eXecution) तकनीक के लिए मैंने जो लिंक दिया था, उस पर क्लिक करें , जहाँ JVM bytecode का सबसेट सीपीयू ( थोथा-सॉर्टा) का देशी मशीन निर्देश है। उसके बिना, आपको मशीन कोड प्राप्त होता है जो बायटेकोड (ए) दुभाषिया (मक्खी पर), (बी) समय से पहले संकलक से, या (सी) ऑन-द-टाइम कंपाइलर से उड़ता है ( पहले व्याख्या की गई, और फिर कभी-कभी संकलित और निष्पादन के दौरान कैश की गई)।
तुलसी बॉर्क

-2

जावा एक बाइट-संकलित भाषा है जो जावा वर्चुअल मशीन नामक एक प्लेटफ़ॉर्म को लक्षित करता है जो स्टैक-आधारित है और कई प्लेटफार्मों पर कुछ बहुत तेज़ कार्यान्वयन है।


1
"बाइट-संकलित" का क्या अर्थ है?
जेस्पर

2
@ जैस्पर: "बाइट-संकलित" का अर्थ आमतौर पर "बायटेकोड द्वारा संकलित" होता है। "बायटेकोड" एक सामान्य शब्द है जो किसी भी प्रकार के गैर-पाठकीय मध्यवर्ती कोड (आमतौर पर मशीन-निष्पादन योग्य नहीं) को कवर करता है।
ग्रेग हेविगेल

-3

से उद्धरण: https://blogs.oracle.com/ask-arun/entry/run_your_java_applications_faster

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

तो मैं कहूंगा कि जावा निश्चित रूप से एक संकलित भाषा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.