2013-05-18 8 views
5

मेरे समझ इस तरह है, परिभाषाएँ:संकलन बनाम अनुवाद, "compiling" जावा से बाइटकोड?

अनुवाद - कुछ भाषा में कोड, कुछ अन्य भाषा में कोड पैदा होता है।

कंपिलटन - एक मशीन कोड में अनुवाद।

मशीन कोड - सीपीयू के लिए सीधा निर्देश।

अब, docs.oracle.com से:

javac - जावा प्रोग्रामिंग भाषा संकलक

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

Wikipedia से:

Java अनुप्रयोगों संकलित

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

क्या आप इसे स्पष्ट कर सकते हैं? अनुवाद और संकलन के बीच क्या अंतर है?

+0

आपकी परिभाषा गलत हैं। –

उत्तर

6

यह परिभाषाओं के सभी एक बात है, और वहाँ क्या "संकलन" का मतलब के लिए कोई एक स्वीकार किए जाते हैं परिभाषा है। आपकी आंखों में, संकलन कुछ भाषा में देशी भाषा में एक स्रोत कोड बदल रहा है; इसलिए एक रूपांतरण प्रक्रिया जो मशीन कोड उत्पन्न नहीं करती है उसे "संकलन" नहीं कहा जाना चाहिए। मेरी आंखों में (और जाहिर है, javac प्रलेखन लेखकों की आंखें भी), यह चाहिए।

वास्तव में बहुत से अलग-अलग शब्द हैं: अनुवाद, संकलन, अपघटन, असेंबली, डिस्सेप्लर, आदि।

व्यक्तिगत रूप से, मैं कहेंगे इन शर्तों के सभी के अंतर्गत "संकलन" समूह के लिए समझ में आता है, क्योंकि इन सभी प्रक्रियाओं आम में एक बहुत कुछ है:

  • वे एक औपचारिक भाषा में कोड को बदलने में कोड करने के लिए एक और औपचारिक भाषा।
  • वे जितना संभव हो सके इनपुट कोड के अर्थशास्त्र को संरक्षित करने का प्रयास करते हैं।
  • उनके पास एक-दूसरे के सामने एक समान डिजाइन है, फ्रंट-एंड, बैक एंड, और बीच में एक संभावित अनुकूलक (learn more about compiler structure here)। मैंने javac और देशी कंपाइलर्स दोनों के प्रवेश को देखा है और वे अपेक्षाकृत समान हैं।

इसके अलावा, की अपनी परिभाषा "मूल कोड का उत्पादन" समस्याग्रस्त है:

    compilers कि विधानसभा उत्पन्न कर सकते हैं लेकिन यह है कि मशीन कोड को बदलने के लिए परेशान नहीं है के बारे में
  • क्या, एक बाहरी कार्यक्रम को यह छोड़ने (आमतौर पर "असेंबलर" कहा जाता है)? क्या आप उन्हें अंतिम, महत्वहीन-तुलनात्मक चरण के कारण "कंपाइलर्स" की परिभाषा से इनकार कर देंगे?
  • आप "मशीन कोड" को वर्गीकृत कैसे करते हैं? क्या होगा अगर कल a processor which can run Java Bytecode natively is created?

लेकिन ये मेरी राय हैं।

  • संकलन एक निचले स्तर से एक के लिए एक उच्च स्तर की भाषा में कोड बदलाव ला रहा है: मुझे लगता है कि बाहर वहाँ लगता है, व्यापक रूप से स्वीकार्य परिभाषाओं कि कर रहे हैं। उदाहरण: जावा बाइटकोड से जावा, या सी से x86 मशीन कोड।
  • डीकंपिलेशन एक निम्न-स्तर की भाषा में एक कोड को एक उच्च-स्तर पर परिवर्तित कर रहा है - असल में, संकलन के विपरीत। उदाहरण: जावा बाइटकोड जावा में।
  • अनुवाद या स्रोत-से-स्रोत संकलन किसी भाषा में तुलनीय "स्तर" की दूसरी भाषा में कोड बदल रहा है। उदाहरण: एआरएम से x86, या सी से जावा तक। जब दोनों भाषाएं वास्तव में एक ही भाषा के अलग-अलग संस्करण होते हैं (उदाहरण के लिए जावास्क्रिप्ट 6 जावास्क्रिप्ट 5), शब्द ट्रांसलेटर भी उपयोग किया जाता है।
  • असेंबली कुछ असेंबली भाषा में कोड कोड में कोड बदल रहा है।
  • Disassembly या तो संदर्भ के आधार पर विघटन या असेंबली के विपरीत का पर्याय है।

इन परिभाषाओं के तहत, javac निश्चित रूप से एक कंपाइलर के रूप में माना जा सकता है। लेकिन फिर, यह सभी परिभाषाओं में है: एक तकनीकी दृष्टिकोण से, इनमें से कई कार्यों में बहुत आम है।

4

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

+2

2006 के बाद से मैक x86 प्लेटफ़ॉर्म –

+0

का उपयोग क्यों नहीं करते * * सी ++ से x86 तक * अनुवाद * और * x86 से PowerPC मशीन कोड में * संकलित करें? मुझे लगता है कि यह बेहतर है तो बाइटकोड == मशीन कोड डालना। X86 मशीन कोड उसी वर्ग में बाइटकोड के रूप में कैसे हो सकता है ... –

+0

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

1

"एक संकलक एक कंप्यूटर प्रोग्राम (या प्रोग्राम का सेट) जो किसी अन्य कंप्यूटर भाषा (लक्ष्य भाषा में स्रोत कोड एक प्रोग्रामिंग भाषा में लिखा (स्रोत भाषा) बदल देती है, अक्सर एक बाइनरी रूप चल रहा है ऑब्जेक्ट कोड के रूप में जाना जाता है)। "

http://en.wikipedia.org/wiki/Compiler

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

आजकल मुझे कम से कम एनईएससी कंपाइलर पता है जो एक ही प्रक्रिया करता है।

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

http://www.amazon.com/Structured-Computer-Organization-5th-Edition/dp/0131485210

+0

संकलन == अनुवाद? तो, सभी अनुवादकों को इसके बजाय कंपाइलर्स कहा जाना चाहिए? –

+1

अनुवाद अधिक सामान्य है, मैं अंग्रेजी से स्पेनिश में अनुवाद कर सकता हूं, और मैं इसे संकलित नहीं कहूंगा, लेकिन कंप्यूटर भाषाओं के क्षेत्र में, हाँ बिल्कुल। – LtWorf

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