सी में संकलन प्रक्रिया
संकलन क्या है?
संकलन एक प्रक्रिया है जिसमें स्रोत कोड को ऑब्जेक्ट कोड में बदल दिया जाता है। यह कम्पाइलर की मदद से किया जाता है। कम्पाइलर स्रोत कोड में व्याकरणात्मक या संरचनात्मक त्रुटियों की जांच करता है, और अगर स्रोत कोड त्रुटी मुक्त होता है, तो यह ऑब्जेक्ट कोड उत्पन्न करता है।
सी भाषा के संकलन प्रक्रिया में स्रोत कोड को जो इनपुट के रूप में लिया जाता है, उसे ऑब्जेक्ट कोड या मशीन कोड में बदला जाता है। यह संकलन प्रक्रिया चार चरणों में बांटी जा सकती है, यानी प्री-प्रोसेसिंग, संकलन, असेंबलिंग और लिंकेज।
प्री-प्रोसेसर स्रोत कोड को इनपुट के रूप में लेता है और स्रोत कोड से सभी टिप्पणियाँ हटा देता है। प्री-प्रोसेसर प्री-प्रोसेसर निर्देश को लेता है और उसे समझता है। उदाहरण के लिए, अगर <PsaTidiAayaAae.h> इस प्रोग्राम में उपलब्ध है, तो प्री-प्रोसेसर इस निर्देश को समझता है और इसे 'PsaTidiAayaAae.h' फ़ाइल की सामग्री से बदल देता है।
हमारे प्रोग्राम के पास से गुजरने वाले चरण निम्नलिखित हैं, इससे पहले कि इसे एक निष्पादन योग्य रूप में बदला जाए:
preprocessor संकलक कोडांतरक लिंकर
preprocessor
स्रोत कोड वह कोड है जो एक टेक्स्ट संपादक में लिखा जाता है और स्रोत कोड फ़ाइल को ".c" एक्सटेंशन दिया जाता है। इस स्रोत कोड को पहले प्रीप्रोसेसर के पास भेजा जाता है, और फिर प्रीप्रोसेसर इस कोड को विस्तारित करता है। कोड को विस्तारित करने के बाद, विस्तारित कोड को कंपाइलर के पास भेजा जाता है।
संकलक
जो कोड प्री-प्रोसेसर द्वारा विस्तारित किया जाता है, उसे कंपाइलर को दिया जाता है। कंपाइलर इस कोड को असेंबली कोड में बदलता है। या हम कह सकते हैं कि C कंपाइलर प्री-प्रोसेस्ड कोड को असेंबली कोड में बदलता है।
कोडांतरक
असेंबली कोड को ऑब्जेक्ट कोड में एक असेंबलर का उपयोग करके बदल दिया जाता है। असेंबलर द्वारा बनाए गए ऑब्जेक्ट फ़ाइल का नाम स्रोत फ़ाइल के समान होता है। DOS में ऑब्जेक्ट फ़ाइल का एक्सटेंशन '.obj' होता है, और UNIX में, एक्सटेंशन 'o' होता है। यदि स्रोत फ़ाइल का नाम 'hello.c' है, तो ऑब्जेक्ट फ़ाइल का नाम 'hello.obj' होगा।
लिंकर
मुख्य रूप से, C में लिखे गए सभी कार्यक्रम लाइब्रेरी फ़ंक्शंस का उपयोग करते हैं। ये लाइब्रेरी फ़ंक्शंस प्री-कंपाइल होते हैं, और इन लाइब्रेरी फाइलों का ऑब्जेक्ट कोड '.lib' (या '.a') एक्सटेंशन के साथ संग्रहीत होता है। लिंकर का मुख्य कार्य इन लाइब्रेरी फाइलों के ऑब्जेक्ट कोड को हमारे कार्यक्रम के ऑब्जेक्ट कोड के साथ जोड़ना है। कभी-कभी ऐसी स्थिति आती है जब हमारा कार्यक्रम अन्य फाइलों में परिभाषित फ़ंक्शंस का संदर्भ देता है; तब लिंकर इस काम में बहुत महत्वपूर्ण भूमिका निभाता है। यह इन फाइलों के ऑब्जेक्ट कोड को हमारे कार्यक्रम से जोड़ता है। इसलिए, हम निष्कर्ष निकालते हैं कि लिंकर का कार्य हमारे कार्यक्रम के ऑब्जेक्ट कोड को लाइब्रेरी फाइलों और अन्य फाइलों के ऑब्जेक्ट कोड के साथ जोड़ना है। लिंकर का आउटपुट एक कार्यान्वयन योग्य फाइल होती है। कार्यान्वयन योग्य फाइल का नाम स्रोत फाइल के समान होता है, लेकिन उनके एक्सटेंशन में अंतर होता है। DOS में, कार्यान्वयन योग्य फाइल का एक्सटेंशन '.exe' होता है, और UNIX में, कार्यान्वयन योग्य फाइल का नाम 'a.out' रखा जा सकता है। उदाहरण के लिए, यदि हम किसी कार्यक्रम में laiqaiyae() फ़ंक्शन का उपयोग कर रहे हैं, तो लिंकर अपने संबंधित कोड को आउटपुट फ़ाइल में जोड़ता है।
hello.c
#EZstamaalakre <PsaTidiAayaAae.Pca>
paunaZ mauqya()
{
laiqaiyae("namastae jaavaatvaEMT");
vaapasakre 0;
}
पहले, इनपुट फाइल, यानी hello.c, को प्रीप्रोसेसर के पास भेजा जाता है, और प्रीप्रोसेसर स्रोत कोड को विस्तारित स्रोत कोड में बदल देता है। विस्तारित स्रोत कोड का एक्सटेंशन hello.i होगा।
फिर, विस्तारित स्रोत कोड को कंपाइलर के पास भेजा जाता है, और कंपाइलर इस विस्तारित स्रोत कोड को असेंबली कोड में बदल देता है। असेंबली कोड का एक्सटेंशन hello.s होगा।
यह असेंबली कोड फिर असेंबलर के पास भेजा जाता है, जो असेंबली कोड को ऑब्जेक्ट कोड में बदल देता है।
ऑब्जेक्ट कोड बनने के बाद, लिंकर एक एक्सिक्यूटेबल फाइल बनाता है। फिर लोडर इस एक्सिक्यूटेबल फाइल को निष्पादन के लिए लोड करता है।