C ++ प्रोग्राम के संकलन में तीन चरण शामिल हैं:
प्रीप्रोसेसिंग: प्रीप्रोसेसर एक सी ++ स्रोत कोड फ़ाइल लेता है और #include
एस, #define
एस और अन्य प्रीप्रोसेसर निर्देशों से संबंधित होता है। इस चरण का आउटपुट प्री-प्रोसेसर निर्देशों के बिना "शुद्ध" C ++ फ़ाइल है।
संकलन: कंपाइलर प्री-प्रोसेसर के आउटपुट को लेता है और उससे एक ऑब्जेक्ट फाइल तैयार करता है।
लिंकिंग: लिंकर कंपाइलर द्वारा निर्मित ऑब्जेक्ट फाइल्स को लेता है और एक लाइब्रेरी या एक एक्जीक्यूटेबल फाइल बनाता है।
preprocessing
प्रीप्रोसेसर पूर्वप्रक्रमक निर्देशों को पसंद करता है, जैसे #include
और #define
। यह C ++ के सिंटैक्स का अज्ञेय है, यही कारण है कि इसका उपयोग सावधानी से किया जाना चाहिए।
यह एक समय में एक सी ++ स्रोत फ़ाइल पर #include
संबंधित फाइलों की सामग्री के साथ निर्देशन की जगह (जो आमतौर पर सिर्फ घोषणाएं होती है) पर काम करता है, मैक्रोज़ के प्रतिस्थापन ( #define
), और पाठ के विभिन्न भागों का चयन करता है #if
, #ifdef
और #ifndef
निर्देशों के आधार पर ।
प्रीप्रोसेसर टोकन के प्रीप्रोसेसिंग की एक धारा पर काम करता है। मैक्रो प्रतिस्थापन को अन्य टोकन के साथ टोकन की जगह के रूप में परिभाषित किया गया है (ऑपरेटर ##
समझ में आने पर दो टोकन को विलय करने में सक्षम बनाता है)।
इस सब के बाद, प्रीप्रोसेसर एक एकल आउटपुट का उत्पादन करता है जो ऊपर वर्णित परिवर्तनों के परिणामस्वरूप टोकन की एक धारा है। यह कुछ विशेष मार्करों को भी जोड़ता है जो संकलक को बताते हैं कि प्रत्येक पंक्ति कहाँ से आई है ताकि यह उन लोगों का उपयोग कर सकता है जो समझदार त्रुटि संदेश उत्पन्न करते हैं।
इस चरण में कुछ त्रुटियों का उत्पादन किया जा सकता है, जिनके उपयोग #if
और #error
निर्देशों का चतुराई से उपयोग किया जा सकता है ।
संकलन
संकलन कदम प्रीप्रोसेसर के प्रत्येक आउटपुट पर किया जाता है। संकलक शुद्ध C ++ स्रोत कोड (अब बिना किसी पूर्वप्रक्रमक निर्देश) को पार्स करता है और इसे विधानसभा कोड में परिवर्तित करता है। फिर अंतर्निहित बैक-एंड (टूलचैन में कोडांतरक) को इनवॉइस करता है जो उस कोड को मशीन कोड में कोडित करता है जो वास्तविक बाइनरी फ़ाइल को कुछ प्रारूप (ELF, COFF, a.out, ...) में कोड करता है। इस ऑब्जेक्ट फ़ाइल में इनपुट में परिभाषित प्रतीकों का संकलित कोड (बाइनरी फॉर्म में) है। ऑब्जेक्ट फ़ाइलों में प्रतीकों को नाम से संदर्भित किया जाता है।
ऑब्जेक्ट फ़ाइलें उन प्रतीकों का उल्लेख कर सकती हैं जो परिभाषित नहीं हैं। यह वह स्थिति है जब आप किसी घोषणा का उपयोग करते हैं, और इसके लिए कोई परिभाषा नहीं देते हैं। कंपाइलर को इससे कोई आपत्ति नहीं है, और जब तक स्रोत कोड अच्छी तरह से नहीं बन जाता है तब तक वह खुशी से ऑब्जेक्ट फाइल का उत्पादन करेगा।
कंपाइलर आमतौर पर आपको इस बिंदु पर संकलन बंद करने देते हैं। यह बहुत उपयोगी है क्योंकि इसके साथ आप प्रत्येक स्रोत कोड फ़ाइल को अलग से संकलित कर सकते हैं। इससे जो लाभ मिलता है, वह यह है कि अगर आपको केवल एक ही फाइल बदलनी है तो आपको हर चीज को फिर से खोलने की जरूरत नहीं है ।
उत्पादित वस्तु फ़ाइलों को बाद में आसानी से पुन: उपयोग करने के लिए, स्थिर पुस्तकालयों नामक विशेष अभिलेखागार में रखा जा सकता है।
यह इस स्तर पर है कि "नियमित" संकलक त्रुटियां, जैसे सिंटैक्स त्रुटियां या विफल अधिभार संकल्प त्रुटियां, रिपोर्ट की जाती हैं।
लिंक करना
लिंकर वह है जो ऑब्जेक्ट से अंतिम संकलन आउटपुट का उत्पादन करता है जो संकलित फाइल का उत्पादन करता है। यह आउटपुट या तो साझा (या डायनामिक) लाइब्रेरी हो सकता है (और नाम समान होने पर, वे पहले बताई गई स्टैटिक लाइब्रेरीज़ के साथ बहुत आम नहीं हैं) या एक निष्पादन योग्य है।
यह सही पते के साथ अपरिभाषित प्रतीकों के संदर्भों को प्रतिस्थापित करके सभी ऑब्जेक्ट फ़ाइलों को जोड़ता है। इन प्रतीकों में से प्रत्येक को अन्य ऑब्जेक्ट फ़ाइलों या पुस्तकालयों में परिभाषित किया जा सकता है। यदि उन्हें मानक पुस्तकालय के अलावा अन्य पुस्तकालयों में परिभाषित किया गया है, तो आपको उनके बारे में लिंकर को बताना होगा।
इस स्तर पर सबसे आम त्रुटियां परिभाषाएं या डुप्लिकेट परिभाषाएं गायब हैं। पूर्व का मतलब है कि या तो परिभाषाएं मौजूद नहीं हैं (अर्थात वे लिखित नहीं हैं), या कि ऑब्जेक्ट फ़ाइल या लाइब्रेरी जहां वे रहते हैं, उन्हें लिंकर को नहीं दिया गया था। उत्तरार्द्ध स्पष्ट है: एक ही प्रतीक को दो अलग-अलग ऑब्जेक्ट फ़ाइलों या पुस्तकालयों में परिभाषित किया गया था।