क्या दोनों में कोई अंतर है? उल्मन की पुस्तक के अनुसार , कंपाइलर एक भाषा को दूसरी (आमतौर पर निम्न स्तर की) भाषा में परिवर्तित करते हैं, और ऐसा एक असेंबलर करता है। दोनों अलग कैसे हैं?
क्या दोनों में कोई अंतर है? उल्मन की पुस्तक के अनुसार , कंपाइलर एक भाषा को दूसरी (आमतौर पर निम्न स्तर की) भाषा में परिवर्तित करते हैं, और ऐसा एक असेंबलर करता है। दोनों अलग कैसे हैं?
जवाबों:
एक कोडांतरक असेंबली कोड को मशीन कोड में बदल देता है। अनुवाद यांत्रिक है, और केवल एक ही तरीके से किया जा सकता है। इसके विपरीत, एक संकलक को अधिक स्वतंत्रता होती है जब वह संबंधित प्रोग्रामिंग भाषा को संकलित करता है - यह अनुकूलन कर सकता है, उदाहरण के लिए, और यहां तक कि गैर-अनुकूलन वाले संकलक अलग कोड का उत्पादन करते हैं। साथ ही, कंपाइलरों को इस तरह से लिखा जा सकता है जो "फ्रंट-एंड" (प्रोग्रामिंग भाषा के अनुरूप) और "बैक-एंड" (कंप्यूटर आर्किटेक्चर के अनुरूप) को अलग करता है, जबकि कोडांतरकों के साथ दोनों हमेशा समान होते हैं।
लब्बोलुआब यह है कि एक कोडांतरक की तुलना में एक कंपाइलर लिखना अधिक मजेदार है। असेंबली भाषाओं को आमतौर पर पार्स और चेक टाइप करने के लिए लगभग तुच्छ डिज़ाइन किया जाता है और इसमें बहुत सारे टेबल-चालित जनरेटर शामिल होते हैं ("ऐडकोड के लिए ओपोड 01110 है", "लोड निर्देशों के लिए गंतव्य ऑपरेंड रजिस्टर बिट्स द्वारा 17 से 21 तक निर्दिष्ट किया गया है" ")। आमतौर पर एक कोडांतरक का सबसे दिलचस्प हिस्सा वह हिस्सा होता है जो सांकेतिक लेबल को संख्याओं में हल करता है।
हालांकि , अधिकांश असेंबलर अंकगणित की एक छोटी राशि (उदाहरण के लिए, छोटे स्थिरांक के साथ प्रतीकात्मक लेबल को एक साथ जोड़कर) कर सकते हैं और अधिकांश कोडांतरक या तो मैक्रो प्रसंस्करण सुविधा के साथ एकीकृत होते हैं या होते हैं। (अधिकांश यूनिक्स प्रणालियों पर मैक्रो सुविधा वास्तव में असेंबली को उचित तरीके से पारित करने से पहले विधानसभा पर सी प्री-प्रोसेसर को चलाकर प्रदान की जाती है।)
एमआइपीएस असेम्बलर को इससे भी आगे जाना था और कुछ दिलचस्प कोड जनरेशन निर्णय लेने थे और थोड़ी मात्रा में ऑप्टिमाइज़ेशन किया। MIPS मशीन की भाषा के लिए अलग-अलग स्थिरांक को लोड करने के लिए अलग-अलग कोड अनुक्रम की आवश्यकता होती है, उदाहरण के लिए, और इसलिए कोडांतरक को निरंतर निर्माण के बाद कोड अनुक्रम चुनना पड़ता था । इसके अलावा, MIPS मशीन कोड में देरी स्लॉट्स की धारणा थी , लेकिन यह कोडांतरक की जिम्मेदारी थी कि वे इन को दूर करें और संकलक को अधिक "सामान्य" सार विधानसभा भाषा प्रस्तुत करें। तो एमआइपीएस असेंबलर को कुछ स्थानीय अनुदेश शेड्यूलिंग करने की आवश्यकता होती है।
भेद आगे के कुछ लोगों द्वारा धुंधली होती नॉर्मन रैमसे विशेष उसकी में, के काम C-- पोर्टेबल विधानसभा भाषा। (संबंधित पेपर रामसे और पेटन जोन्स है, "एक एकल मध्यवर्ती भाषा जो अपवादों के कई कार्यान्वयनों का समर्थन करती है", प्रॉप लैंग। इम्प्लांट और डीएसएनजीएन। (PLDI-21): 285–298, 2000। और अंत में, वहाँ। डेविड वॉकर और ग्रेग मॉरिसेट की असेंबली के साथ एक टाइप असेंबली लैंग्वेज भी है जो मेमोरी सुरक्षा की गारंटी दे सकती है।
यहां थोड़ा सा सरलीकृत उत्तर, वास्तविकता अधिक जटिल है। मैं अन्य चीजों के बीच एक असेंबलर (A) और एक कंपाइलर (C) के बीच अंतर की उम्मीद करूंगा:
हम असेंबली भाषा को "निम्न स्तर" कहते हैं और स्रोत भाषा एक संकलक "उच्च स्तर" को समझता है (यह सकल सरलीकरण है, लेकिन अभी भी)।
असेंबली लैंग्वेज में आप उदाहरण के तौर पर एक ऐड ऑपरेशन कह सकते हैं:
उच्च स्तरीय भाषा में आप लिख सकते हैं:
और यह कई परिस्थितियों के आधार पर एक निर्देश या सैकड़ों निर्देशों के परिणामस्वरूप हो सकता है, एक वह है जो सीपीयू संकलक के लिए निर्देश बनाता है।
जैसा कि आप देख सकते हैं विधानसभा स्रोत भाषा सबसे अधिक बार होती है: (ए) स्रोत कोड की एक पंक्ति सीपीयू ऑपकोड की एक पंक्ति देती है और यह बहुत निर्भर करता है कि आप किस सीपीयू को लक्षित कर रहे हैं। एक उच्च स्तरीय भाषा (C) संकलक आपके लिए इन सभी विवरणों को संभालता है - स्रोत कोड की एक पंक्ति शून्य हो सकती है, एक या कई सीपीयू ऑपकोड और कंपाइलर सीपीयू क्या कर सकता है इसका विवरण संभालता है।
आज एक संकलक में अक्सर कई अलग-अलग चरण होते हैं। उन्हें फ्रंटेंड / बैकएंड या मधुमक्खी का नाम दिया जा सकता है जिन्हें अन्य चीजें कहा जाता है। मैं आमतौर पर उन्हें चार चरणों के रूप में देखता हूं:
अच्छा संकलक लिखना एक अत्यधिक कुशल पेशा है - एक खिलौना भाषा संकलक एक दोपहर में एक एमुटर (या अच्छी तरह से, थोड़ा लंबा) द्वारा किया जा सकता है।