क्या एक कंपाइलर और एक असेंबलर के बीच कोई वास्तविक अंतर है?


15

क्या दोनों में कोई अंतर है? उल्मन की पुस्तक के अनुसार , कंपाइलर एक भाषा को दूसरी (आमतौर पर निम्न स्तर की) भाषा में परिवर्तित करते हैं, और ऐसा एक असेंबलर करता है। दोनों अलग कैसे हैं?


1
एक कोडांतरक है एक संकलक जो कार्यों की एक विशिष्ट सेट करता है। शब्द व्यवहार में कुछ हद तक बदल गए हैं, लेकिन "संकलक" (भाषाओं के बीच अनुवाद) की मूल परिभाषा लागू होती है।
राफेल

सभी असेंबलर (सरल) संकलक हैं, क्योंकि वे एक भाषा को दूसरी में बदलते हैं। सभी कंपाइलर असेंबलर नहीं होते हैं।
user253751

जवाबों:


16

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


2
अनुवाद केवल एक ही तरीके से क्यों किया जा सकता है? क्या इसका मतलब यह है कि किसी दिए गए मशीन कोड (और लक्ष्य वास्तुकला) के लिए उत्पन्न करने वाला asm कोड उत्पन्न नहीं किया जा सकता है? यह मेरे लिए सहज ज्ञान युक्त लगता है। क्योंकि यदि कोई दिया गया मशीन कोड निर्देश कई asm निर्देशों के लिए मैप कर सकता है, तो मशीन किस तरह के निर्देशों को निष्पादित करने का निर्णय लेती है? क्या मैं कुछ भूल रहा हूँ?
Utku

3
टी()

धन्यवाद, मैं यह भी देखता हूं कि उलेमान की पुस्तक में, एक संकलक के सामने का छोर और एक बैकएंड है। यदि मैं सही हूं, तो बैकएंड एक मध्यवर्ती भाषा में अनुकूलन, मशीन कोड की पीढ़ी, और मशीन कोड का अनुकूलन करता है, और तीन कार्यों में से प्रत्येक एक से अधिक तरीकों से किया जा सकता है। "बैकएंड" एक कोडांतरक है? मध्यवर्ती भाषा एक विधानसभा भाषा है? मुझे लगता है हाँ, लेकिन आपके उत्तर में उल्लेख है कि एक कोडांतरक केवल एक ही तरीके से अपना काम करता है।
टिम

मैंने इसे यहाँ cs.stackexchange.com/questions/98854/…
Tim

मध्यवर्ती भाषा आमतौर पर एक ऐसी भाषा को संदर्भित करती है जो मशीन स्वतंत्र है।
युवल फिल्मस

11

लब्बोलुआब यह है कि एक कोडांतरक की तुलना में एक कंपाइलर लिखना अधिक मजेदार है। असेंबली भाषाओं को आमतौर पर पार्स और चेक टाइप करने के लिए लगभग तुच्छ डिज़ाइन किया जाता है और इसमें बहुत सारे टेबल-चालित जनरेटर शामिल होते हैं ("ऐडकोड के लिए ओपोड 01110 है", "लोड निर्देशों के लिए गंतव्य ऑपरेंड रजिस्टर बिट्स द्वारा 17 से 21 तक निर्दिष्ट किया गया है" ")। आमतौर पर एक कोडांतरक का सबसे दिलचस्प हिस्सा वह हिस्सा होता है जो सांकेतिक लेबल को संख्याओं में हल करता है।

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

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

भेद आगे के कुछ लोगों द्वारा धुंधली होती नॉर्मन रैमसे विशेष उसकी में, के काम C-- पोर्टेबल विधानसभा भाषा। (संबंधित पेपर रामसे और पेटन जोन्स है, "एक एकल मध्यवर्ती भाषा जो अपवादों के कई कार्यान्वयनों का समर्थन करती है", प्रॉप लैंग। इम्प्लांट और डीएसएनजीएन। (PLDI-21): 285–298, 2000। और अंत में, वहाँ। डेविड वॉकर और ग्रेग मॉरिसेट की असेंबली के साथ एक टाइप असेंबली लैंग्वेज भी है जो मेमोरी सुरक्षा की गारंटी दे सकती है।


0

यहां थोड़ा सा सरलीकृत उत्तर, वास्तविकता अधिक जटिल है। मैं अन्य चीजों के बीच एक असेंबलर (A) और एक कंपाइलर (C) के बीच अंतर की उम्मीद करूंगा:

  1. स्रोत कोड की एक पंक्ति सीधे एक सीपीयू ओपोड (ए) या नहीं (सी) से संबंधित है
  2. वास्तविक सीपीयू (ए) या मशीन इंडिपेंडेंट (सी) पर अत्यधिक निर्भर

हम असेंबली भाषा को "निम्न स्तर" कहते हैं और स्रोत भाषा एक संकलक "उच्च स्तर" को समझता है (यह सकल सरलीकरण है, लेकिन अभी भी)।

असेंबली लैंग्वेज में आप उदाहरण के तौर पर एक ऐड ऑपरेशन कह सकते हैं:

  • जोड़ें, बी (एक विशिष्ट सीपीयू के लिए)
  • R5, R6 (एक अलग सीपीयू के लिए) जोड़ें
  • जोड़ें (ए 5), डी 2 (एक अलग सीपीयू के लिए)

उच्च स्तरीय भाषा में आप लिख सकते हैं:

  • x = y + z;

और यह कई परिस्थितियों के आधार पर एक निर्देश या सैकड़ों निर्देशों के परिणामस्वरूप हो सकता है, एक वह है जो सीपीयू संकलक के लिए निर्देश बनाता है।

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

आज एक संकलक में अक्सर कई अलग-अलग चरण होते हैं। उन्हें फ्रंटेंड / बैकएंड या मधुमक्खी का नाम दिया जा सकता है जिन्हें अन्य चीजें कहा जाता है। मैं आमतौर पर उन्हें चार चरणों के रूप में देखता हूं:

  1. पहला चरण वास्तविक स्रोत कोड पढ़ता है और एक आंतरिक प्रतिनिधित्व बनाता है। यह चरण वास्तविक स्रोत भाषा जानता है।
  2. दूसरा चरण आंतरिक प्रतिनिधित्व को देखता है और कई अनुकूलन करता है। आजकल, कंपाइलर आमतौर पर प्रोग्राम को तेज बनाने के लिए देखता है और अगर यह बड़ा हो जाता है तो उसकी देखभाल नहीं करता है। अनुकूलन आंतरिक प्रतिनिधित्व पर किया जाता है। दिलचस्प यह है कि इसके कुछ हिस्से कई अलग-अलग भाषाओं के लिए सामान्य हो सकते हैं।
  3. तीसरा चरण आंतरिक प्रतिनिधित्व लेता है और चयनित सीपीयू के लिए वास्तविक कोड बनाता है। इस चरण के कई अलग-अलग संस्करण हो सकते हैं, जो अलग-अलग सीपीयू-एस को लक्षित कर रहे हैं। वास्तव में आप एक बार स्रोत कोड लिख सकते हैं और फिर इसे अलग-अलग CPUS-s के लिए संकलित कर सकते हैं।
  4. कार्यक्रम "पैकेजिंग" के लिए अंतिम तैयारी (यह चरण एक लिंकर हो सकता है)।

अच्छा संकलक लिखना एक अत्यधिक कुशल पेशा है - एक खिलौना भाषा संकलक एक दोपहर में एक एमुटर (या अच्छी तरह से, थोड़ा लंबा) द्वारा किया जा सकता है।

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