कंपाइलर कैसे काम करता है? [बन्द है]


17

नोट: मुझे आश्चर्य है कि यह पहले नहीं पूछा गया है, और अगर यह मेरे पास है तो मैं इसे एक खोज में नहीं पा सकता हूं।

मैं वेबसाइटों के टन पर रहा हूँ, मैं लेख के टन पढ़ा है, और मैं स्पष्टीकरण के टन सुना है। उनमें से ज्यादातर अच्छे थे, लेकिन वे सभी या तो व्यापक थे या बहुत जटिल या सिर्फ सादे बुरे थे। तो मेरा सवाल है, एक संकलक कैसे काम करता है?

यदि यह एक कठिन, व्यापक प्रश्न है, तो कृपया मुझे बताएं। लेकिन यदि नहीं, तो कृपया प्रश्न का उत्तर दें।


4
बहुत व्यापक, कम से कम "यह कैसे काम करता है" भाग। उस विषय पर पूरी किताबें लिखी गई हैं।
Oded

1
en.wikipedia.org/wiki/Compiler विकिपीडिया लिंक होगा जो खोजने के लिए तुच्छ है, विशेष रूप से आप क्या सोच रहे हैं? यह प्रश्न पर्याप्त व्यापक है कि मुझे स्मार्ट एलेक का जवाब देने के लिए लुभाया जाएगा, "कंपाइलर एक भाषा से दूसरी भाषा में कोड का अनुवाद करते हैं," जैसा कि सामान्य विचार है कि इसके भीतर बहुत सारी बारीकियां हैं जो एक बार देखने के लिए शुरू होती है। वास्तव में क्या शामिल है
जेबी किंग

1
हाँ और मुझे लगता है कि इसका उत्तर बहुत अच्छी तरह से दिया गया है।
जेरेमी

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

1
@ निश्चित रूप से संकलक जटिल हैं, और आप सभी विवरण नहीं बता सकते हैं कि वे यहाँ कैसे काम करते हैं। हालाँकि, मुझे यकीन है कि आपके कंपाइलर कोर्स करने से पहले आपको यह समझने की बुनियादी उच्च-स्तरीय समझ थी कि कंपाइलर क्या है या कैसे काम करता है।
दिमा

जवाबों:


24

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

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

संक्षेप में, एक कंपाइलर एक प्रोग्राम को मानव-पठनीय प्रारूप से मशीन-पठनीय प्रारूप में परिवर्तित करता है।

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

  1. लेक्सिंग - कार्यक्रम के पाठ को "टोकन" में तोड़ दें। टोकन प्रोग्रामिंग भाषा के "शब्द" हैं, जैसे कि पहचानकर्ता (कीवर्ड, चर नाम, फ़ंक्शन नाम, आदि) या ऑपरेटर (=, *, &, आदि)।
  2. पार्सिंग - टोकन के अनुक्रम को एक पार्स ट्री में परिवर्तित करें, जो एक डेटा संरचना है जो विभिन्न भाषा निर्माणों का प्रतिनिधित्व करता है: प्रकार की घोषणाएं, चर घोषणाएं, फ़ंक्शन परिभाषाएं, लूप, सशर्तियां, भाव, आदि।
  3. अनुकूलन - निरंतर अभिव्यक्तियों का मूल्यांकन करें, अप्रयुक्त चर या अगम्य कोड का अनुकूलन करें, यदि संभव हो तो लूप को अनियंत्रित करें, आदि।
  4. मशीन निर्देश (या JVM बाइट कोड) में पार्स ट्री का अनुवाद करें।

फिर से, मैं इस बात पर जोर देता हूं कि यह बहुत संक्षिप्त विवरण है। आधुनिक कंपाइलर बहुत स्मार्ट हैं, और, परिणामस्वरूप, बहुत जटिल हैं।


2
दरअसल, यह एक भाषा को दूसरे में बदल देता है। प्रारंभिक C ++ कंपाइलर ने C को संकलित किया। वही Vala संकलक के लिए जाता है। जावा कंपाइलर बायटेकोड में संकलित करता है जो जेवीएम के जेआईटी संकलक के बिना निष्पादन योग्य नहीं है।

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

1
@ दायमा, इसे गैर-निष्पादन योग्य कोड से निष्पादन योग्य कोड तक नहीं होना चाहिए। उदाहरण के लिए आप JVM बाइट कोड को सीधे विंडोज़ मशीनों पर निष्पादित नहीं कर सकते।

1
@ Thorbjørn Ravn Andersen: लेकिन बाइट कोड JVM द्वारा निष्पादन योग्य है। प्रोग्रामर को वास्तविक मशीन की तरह देखने के लिए "वर्चुअल मशीन" का पूरा बिंदु नहीं है?
दिमा

2
मैं तर्क दूंगा कि पारंपरिक रूप से एक कंपाइलर ने मानव-पठनीय प्रारूप से एक प्रोग्राम को मशीन-पठनीय प्रारूप में परिवर्तित कर दिया, जैसा कि रीमा ने कहा था। Cfront को C ++ में परिवर्तित करने या जावा को bytecode में परिवर्तित करने जैसे बदलाव अधिक उन्नत विषय हैं, जिन्हें मूल, पारंपरिक अवधारणा से अपरिचित किसी व्यक्ति को समझाने के बाद तक छोड़ दिया जाना चाहिए।
कार्सन 63000 3

5

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

कंपाइलर अंतर्निहित हार्डवेयर के साथ उच्च-स्तरीय भाषाओं में पुल स्रोत कार्यक्रम करते हैं। एक कंपाइलर की आवश्यकता होती है:

  1. कार्यक्रमों के वाक्य रचना की शुद्धता का निर्धारण
  2. सही और कुशल वस्तु कोड बनाना
  3. रन-टाइम संगठन
  4. कोडांतरक और / या लिंकर सम्मेलनों के अनुसार आउटपुट स्वरूपण।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.