2012-03-19 21 views
16

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

धन्यवाद।

उत्तर

7

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

निष्पादन योग्य कोड पीढ़ी से पार्सर को अलग करना एक प्रोसेसर आर्किटेक्चर से दूसरे में एक कंपाइलर पोर्ट करना अधिक आसान बनाता है।

48

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

आप इसे आगे ले जा सकते हैं, gcc करता है, और सामने/बैकएंड इंटरफ़ेस है जो भाषा-स्वतंत्र है, इसलिए आप एक ही बैकएंड के साथ अलग-अलग भाषा फ्रंट-सिरों का उपयोग कर सकते हैं। पुराने दिनों में इसे एमएक्सएन समस्या कहा जाता था: आप एमएक्सएन कंपाइलर्स लिखना नहीं चाहते हैं जहां आपके पास एम भाषाएं और एन लक्ष्य प्रणाली हैं। विचार केवल एम + एन कंपाइलर्स लिखना है।

+0

क्या आप कृपया मुझे बता सकते हैं कि यह एम + एन कंपाइलर्स कैसा है? मुझे लगता है कि हमारे पास लक्ष्य मशीन कोड में कनवर्ट करने के लिए आईसीजी और एन कोड जेनरेटर में कनवर्ट करने के लिए एम फ्रंट एंड है। क्या आप प्रत्येक फ्रंट एंड और कंपाइलर के रूप में बैक एंड पर विचार कर रहे हैं? – Zephyr

+0

@ ज़ेफिर, एफई/बीई संयोजन के बिना हमें इतने सारे क्रमिक क्रम की आवश्यकता होगी जो अनावश्यक/अनावश्यक है। –

+0

@Zephyr हां, एक फ्रंट एंड/बैक एंड संयोजन एक कंपाइलर है। निश्चित रूप से यह स्पष्ट है? – EJP

4

क्योंकि आप किसी प्रकार के आंतरिक छद्म कोड या तालिकाओं/डेटा संरचनाओं का उपयोग करना चाहते हैं।

a = b + c; 

आपको लगता है कि लेने के लिए और यह एक

load b 
load c 
add b + c 
store a 
एक उदाहरण है, कई समाधान के रूप में

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

मुझे इसके बारे में पर्याप्त जानकारी नहीं है, लेकिन मुझे लगता है कि आपके पास आम तौर पर इस्तेमाल किए जाने वाले पार्सर्स बाइसन/फ्लेक्स भी हैं, जो आपको किसी प्रकार के इंटरमीडिएट कोड/निर्देश सेट में उबालते हैं और फिर आप इसके लिए बैकएंड लिखते हैं।

आपको यह भी लाभ होता है कि उदाहरण के लिए आप बैकएंड को प्रभावित किए बिना सी और सी ++ और अन्य भाषा फ्रंट एंड कर सकते हैं।

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

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