प्रोग्राम बनाने और चलाने की प्रक्रिया
C स्रोत कोड से निष्पादन योग्य मशीन कोड तक 4 मुख्य चरण होते हैं:
- लेखन और संपादन (Writing & Editing)
- संकलन (Compilation)
- लिंकिंग (Linking)
- निष्पादन (Execution)
चरण 1: लेखन और संपादन
- टेक्स्ट एडिटर (VS Code, Vim, Notepad++) में कोड लिखें
- फाइल सहेजें:
.cएक्सटेंशन (स्रोत फाइल) - यह स्रोत कोड (source code) है
चरण 2: संकलन (Compilation)
कंपाइलर (GCC, Clang, MSVC) स्रोत कोड को ऑब्जेक्ट कोड में बदलता है। दो उप-चरण:
2.1 प्रीप्रोसेसर (Preprocessor)
#include,#define,#ifdefआदि प्रोसेस करता है- हेडर फाइल्स सम्मिलित करता है, मैक्रोज़ विस्तारित करता है
- आउटपुट: ट्रांसलेशन यूनिट (translation unit) (.i फाइल)
2.2 ट्रांसलेटर (Translator/Compiler Proper)
- ट्रांसलेशन यूनिट को असेंबली/मशीन कोड में बदलता है
- आउटपुट: ऑब्जेक्ट फाइल (object file) (.o या .obj)
- अभी निष्पादन योग्य नहीं - लाइब्रेरी फंक्शन्स अनसुलझे
चरण 3: लिंकिंग (Linking)
- लिंकर (ld, link.exe) ऑब्जेक्ट फाइल्स और लाइब्रेरीज जोड़ता है
- स्टैंडर्ड लाइब्रेरी (libc), उपयोगकर्ता लाइब्रेरीज
- बाहरी संदर्भ हल करता है (
printfआदि) - आउटपुट: निष्पादन योग्य फाइल (executable) (.exe, a.out, कोई एक्सटेंशन नहीं)
चरण 4: निष्पादन (Execution)
- लोडर (OS भाग) एक्जीक्यूटेबल को मेमोरी में लोड करता है
- प्रोग्राम काउंटर
main()पर सेट - निर्देश निष्पादित होते हैं: इनपुट → प्रोसेसिंग → आउटपुट
कमांड लाइन उदाहरण (GCC)
# सभी चरण एक साथ
gcc program.c -o program
# चरण-दर-चरण
gcc -E program.c -o program.i # केवल प्रीप्रोसेसिंग
gcc -S program.i -o program.s # केवल असेंबली तक
gcc -c program.s -o program.o # केवल ऑब्जेक्ट फाइल
gcc program.o -o program # केवल लिंकिंग
# डीबग जानकारी के साथ
gcc -g -Wall -Wextra program.c -o program
उदाहरण प्रोग्राम
उदाहरण 1: तीन संख्याओं का औसत
#include <stdio.h>
int main() {
int a, b, c, sum;
float avg;
printf("a, b, c के मान दर्ज करें: ");
scanf("%d %d %d", &a, &b, &c);
sum = a + b + c;
avg = sum / 3.0f; // फ्लोट विभाजन
printf("औसत = %.2f\n", avg);
return 0;
}
उदाहरण 2: वृत्त की परिधि
#include <stdio.h>
#define PI 3.14159f
int main() {
float radius, circumference;
printf("त्रिज्या: ");
scanf("%f", &radius);
circumference = 2 * PI * radius;
printf("परिधि = %.4f\n", circumference);
return 0;
}
मेमोरी लेआउट (रनटाइम)
+------------------+ उच्च पता | स्टैक | स्थानीय चर, फंक्शन कॉल्स | ↑ बढ़ता है | | | | ↓ बढ़ता है | | हीप | malloc/free | | | BSS सेगमेंट | अनारंभिकृत ग्लोबल/स्टैटिक | डेटा सेगमेंट | प्रारंभिकृत ग्लोबल/स्टैटिक | टेक्स्ट सेगमेंट | कोड (सिर्फ पढ़ने योग्य) +------------------+ निम्न पता
सामान्य बिल्ड त्रुटियाँ
| चरण | त्रुटि प्रकार | उदाहरण |
|---|---|---|
| प्रीप्रोसेसिंग | हेडर नहीं मिला | fatal error: foo.h: No such file |
| संकलन | सिंटैक्स त्रुटि | error: expected ';' before '}' |
| लिंकिंग | अपरिभाषित संदर्भ | undefined reference to 'func' |
| निष्पादन | रनटाइम त्रुटि | सेगफॉल्ट, शून्य से विभाजन |