संकलन चरण बहुत गहराई से और gcc कमांड उपयोगिता।9 min read

यह ट्यूटोरियल बहुत ही आकर्षक और ज्ञानवर्धक है। इसमें समाधान के साथ कई प्रश्न हैं। जैसे, असेंबली के निर्देश C से निम्न स्तर के क्यों हैं? क्या आप जानते हैं कि gcc कंपाइलर को gcc कमांड के अलावा भी एक्सेस किया जा सकता है? प्रत्येक संकलन चरणों द्वारा उत्पन्न आउटपुट फ़ाइलों तक कैसे पहुंचें। और बहुत सारे। इसके अलावा, यह ट्यूटोरियल व्यक्तिगत संकलन चरण के विस्तृत विवरण से युक्त है।

To read this document in English click here!

C प्रोग्राम के निष्पादन (execution) में शामिल कदम।

  1. प्रोग्राम निर्माण (Creation)
  2. प्रोग्राम संकलन (Compilation)
  3. प्रोग्राम निष्पादन (Execution)

प्रोग्राम निर्माण (Creation)

कार्यक्रम निर्माण का मतलब है, जहां हम स्रोत (source) कोड लिख रहे हैं।

लिनक्स में, संपादकों के लिए कई विकल्प हैं। जैसे कि vim, nano, Geany, Sublime text editor, Eclipse, और कई।

ऐसे महान संपादक विकल्पों में से, हम विम संपादक का उपयोग करने जा रहे हैं। पिछले व्याख्यान में, हमने पहले ही सभी आवश्यक आदेशों के साथ गहराई से संपादक के बारे में सीखा। विम के संशोधन के लिए यहां क्लिक करें।


प्रोग्राम संकलन (Compilation)

कार्यक्रम निर्माण के बाद, अगला चरण प्रोग्राम संकलन है। जिसमें संकलक उपयोगकर्ता-पठनीय (पाठ) कोड को मशीन-पठनीय (बाइनरी) कोड में बदल देगा

संकलन के लिए, हमारे पास एक इनबिल्ट कंपाइलर है। जिसे जीसीसी (GCC) के नाम से जाना जाता है।

अधिक जानकारी:

टर्मिनल में दो मोड होते हैं।

  1. ‘$’: नियमित उपयोगकर्ता। (Regular user)
  2. ‘#’: रूट उपयोगकर्ता। (Root user)

विंडोज में, इसे आमतौर पर एक प्रशासन मोड (an Administration mode) के रूप में संदर्भित किया जाता है। जबकि लिनक्स / यूनिक्स में इसे रूट (Root) कहा जाता है।

gcc कमांड

gcc एक “GNU संकलक संग्रह” है। जिसमें C, C ++, Objective C और इसमें कई और भाषाएं शामिल हैं। आप इसके बारे में यहां और अधिक पढ़ सकते हैं!

संक्षेप में, फ़ाइल संकलित करने के लिए gcc का उपयोग किया जाता है।

नोट: gcc का उपयोग cc कमांड के रूप में भी किया जा सकता है।

// यह vim एडिटर में बनाई गई एक prog.c फाइल है।

#include <stdio.h>

int main(void)
{
     printf("Welcome to Electronics1010.com \n");

     return 0;
}

सिंटेक्स:

$ gcc <फ़ाइल का नाम>

उदाहरण के लिए:

$ gcc prog.c

या

$ cc <फ़ाइल का नाम>

उदाहरण के लिए:

$ cc prog.c

टर्मिनल पर इस कमांड को लिखने के बाद एंटर पर क्लिक करें।


प्रोग्राम निष्पादन (Execution)

जब gcc कमांड prog.c पर उपयोग किया जाता है। तभ वह एक निष्पादन योग्य फ़ाइल (Executable) बनाता है। जो a.out फ़ाइल है।

नोट: डिफ़ॉल्ट रूप से, यह एक “a.out” निष्पादन योग्य (executable) फ़ाइल का उत्पादन करता है।

a.out में हमारे द्वारा दी गई फ़ाइल के बाइनरी समतुल्य है (यहाँ prog.c)

compiling c file and giving executable file

प्रत्येक gcc संकलन के लिए, हमें a.out नामक एक निष्पादन योग्य (executable) फ़ाइल मिलेगी। लेकिन यह उस फ़ोल्डर में पिछली फाइल को बदल देता है। संक्षेप में, उस फ़ोल्डर में केवल एक निष्पादन योग्य फ़ाइल होगी।

multiple time execution of gcc will produce same named executabled file

नोट: लगभग सभी कमांड निष्पादन योग्य फाइलें हैं।

उदाहरण के लिए:

  1. date  :   जो bin फोल्डर में मौजूद है।
  2. cal    :   जो usr फोल्डर में है।
date and cal command execution in linux

अब आइए हमारी नई बिल्ड एक्जीक्यूटेबल फ़ाइल को निष्पादित (execute) करने का प्रयास करें।

$ a.out
direct execution of a.out is  not possible  it will throw an error

टर्मिनल को “कमांड नहीं मिली: a.out” (command not found: a.out) नामक त्रुटि हुई

कारण यह है कि निष्पादन फ़ाइल में संलग्न पथ नहीं है। तो, आइए a.out की शुरुआत में एक वर्तमान निर्देशिका पथ जोड़कर इसे फिर से आज़माएँ

/* मेरे मामले में पथ नीचे दिए गए जैसा दिखता है, लेकिन आप pwd कमांड का उपयोग करके अपने वर्तमान निर्देशिका पथ की जांच कर सकते हैं। */

$ /Users/--------/Documents/Tutorial/a.out
execution with path

हर बार एक रास्ता लिखना बहुत कठिन काम है। वर्तमान निर्देशिका पथ के समाधान के रूप में, हम “.” का उपयोग कर सकते हैं।


नोट: “.” का अर्थ है वर्तमान फ़ोल्डर पथ और “..” का अर्थ पिछले फ़ोल्डर पथ

हम नीचे दिखाए गए अनुसार किसी भी डायरेक्टरी से कमांड निष्पादित कर सकते हैं।

$ ./a.out
file execution by the best way

क्या होगा अगर हम एक कस्टम नाम के साथ एक निष्पादन योग्य फ़ाइल चाहते हैं?

उसके लिए gcc कमांड में “-o” कुंजी का उपयोग किया जाता है।

नोट: -o (यह हाइफ़न o है) (अंग्रेजी वर्णमाला छोटा ओ)

$ gcc <फ़ाइल का नाम> -o <निष्पादन योग्य फ़ाइल का नाम . <एक्सटेंशन यदि चाहें>>

उदाहरण के लिए:

$ gcc prog.c -o prog.exe
$ gcc prog.c -o prog

सी भाषा का संकलन चरण।

प्रत्येक प्रोग्राम निम्न प्रक्रिया से गुजरता है।

Compilation stage of C language with keys and commands

हमारा सोर्स कोड नीचे इमेज में दिखाया गया है। फ़ाइल का नाम “prog.c” है।

source code for example

प्रीप्रोसेसर स्टेज (Preprocessor stage)

टेक्स्ट एडिटर में हमने जो सोर्स कोड लिखा है, उसे इनपुट के रूप में दिया गया है, इसका फाइल एक्सटेंशन “.c” है।

प्रीप्रोसेसर का आउटपुट “.i” एक्सटेंशन है। जो शुद्ध C कोड है।

शुद्ध c कोड: यह वह कोड है जो अनुवाद चरण (translator) के लिए जा रहा है न कि डेवलपर (test.c) द्वारा लिखा गया कोड

प्रीप्रोसेसर स्रोत कोड के हेडर फ़ाइल का विस्तार करता है और इसे अनुवादक (translator) को भेजता है।

प्रीप्रोसेसर में “-E” नाम की कुंजी है।

सिंटेक्स:

$ gcc -E <.c एक्सटेंशन वाली इनपुट फ़ाइल> -o <.i एक्सटेंशन वाली आउटपुट फ़ाइल>

उदाहरण के लिए:

$ gcc -E prog.c -o prog.i
expanded c code by preprocessor

यह निकाला गया स्रोत कोड कैसा दिखता है, प्रीप्रोसेसर शीर्ष लेख फ़ाइलों को निकालता है और सभी मैक्रो संचालन करता है। हां, इस तरह फ़ाइल का आकार भी अधिक है। उपरोक्त छवि “prog.i” फ़ाइल है।


अनुवादक / संकलक चरण (Translator / compiler stage)

अनुवादक, मशीन की असेंबली भाषा में दिए गए शुद्ध c कोड का अनुवाद करता है।

अनुवादक का इनपुट फ़ाइल एक्सटेंशन “.i” है और यह “.s” एक्सटेंशन के साथ आउटपुट फाइल बनाता है।

अनुवादक (translator) के पास “-S” नाम की एक कुंजी है।

सिंटेक्स:

$ gcc -S <.i एक्सटेंशन वाली इनपुट फ़ाइल> -o <.s एक्सटेंशन वाली आउटपुट फ़ाइल>

उदाहरण के लिए:

$ gcc -S prog.i -o prog.s
assembly code generated by compiler/ translator

उपरोक्त छवि “prog.s” का फ़ाइल है।


असेंबलर स्टेज (Assembler stage)

अनुवादक द्वारा जनरेट किया गया यह असेंबली लैंग्वेज कोड असेंबलर द्वारा ऑब्जेक्ट फ़ाइल में परिवर्तित हो जाता है।

DOS सिस्टम ऑब्जेक्ट फ़ाइल में “.obj” एक्सटेंशन है और UNIX सिस्टम ऑब्जेक्ट फाइल एक्सटेंशन में “.o” है।

असेंबलर का इनपुट फ़ाइल एक्सटेंशन “.s” है और आउटपुट फ़ाइल एक्सटेंशन “.o” है

असेंबलर में “-c” नाम की एक चाबी होती है।

सिंटेक्स:

$ gcc -c <.s एक्सटेंशन वाली इनपुट फ़ाइल> -o <.o एक्सटेंशन वाली आउटपुट फ़ाइल>

उदाहरण के लिए:

$ gcc -c prog.s -o prog.o
assembler converts code into object and how its looks like.

ऊपर की छवि “prog.o” फ़ाइल की है।


लिंकर स्टेज (Linker stage)

आमतौर पर C भाषा में लिखे गए सभी प्रोग्राम लाइब्रेरी फ़ंक्शंस का उपयोग करते हैं।

लाइब्रेरी फ़ाइलों को प्री-कम्पाइल किया जाता है और उनके ऑब्जेक्ट कोड को “.lib” या “.a” एक्सटेंशन के साथ लाइब्रेरी फ़ाइलों में संग्रहीत किया जाता है।

लिंकर का कार्य हमारे स्रोत कोड की ऑब्जेक्ट फ़ाइलों को उपयोग की गई लाइब्रेरी फ़ाइल और अन्य उपयोग किए गए कार्यों के ऑब्जेक्ट कोड के साथ जोड़ना है

लिंकर का इनपुट ऑब्जेक्ट फ़ाइल है और आउटपुट फ़ाइल एक निष्पादन योग्य (executable) फ़ाइल है।

DOS प्रणाली में, निष्पादन योग्य फ़ाइल का नाम “.exe” के विस्तार के साथ “स्रोत कोड फ़ाइल का नाम” है। लेकिन UNIX निष्पादन योग्य फ़ाइल नाम “a.out” है।

लिंकर के पास कोई कुंजी नहीं है।

सिंटेक्स:

$ gcc <.o एक्सटेंशन वाली इनपुट फ़ाइल> -o <उपयोगकर्ता के अनुसार फ़ाइल नाम>

उदाहरण के लिए:

$ gcc prog.o -o prog
this is how executable file looks like

ऊपर की छवि एक निष्पादन योग्य (executable) फ़ाइल है।


compilation stages with result

व्यक्तिगत चरण (individual stage) आधारित संकलन करने के बाद यह अंतिम परिणाम है।

महत्वपूर्ण सवाल:

असेंबली के निर्देश C से निम्न स्तर के क्यों हैं?

समाधान: असेंबली भाषा मशीन विशिष्ट है। इसलिए, असेंबली भाषा मशीन भाषा के करीब है। (मशीन असेंबली लैंग्वेज को नहीं समझ सकती। बस यह मशीन लैंग्वेज के करीब है)


असाइनमेंट

  1. संकलन चरणों की मूल बातें संशोधित करें। यहाँ क्लिक करें!

Leave a Comment