Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> सी प्रोग्रामिंग

C प्रोग्राम को मशीन कोड में बदलने के 4 चरण


प्रोग्राम बनाने और चलाने की प्रक्रिया

C स्रोत कोड से निष्पादन योग्य मशीन कोड तक 4 मुख्य चरण होते हैं:

  1. लेखन और संपादन (Writing & Editing)
  2. संकलन (Compilation)
  3. लिंकिंग (Linking)
  4. निष्पादन (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'
निष्पादनरनटाइम त्रुटिसेगफॉल्ट, शून्य से विभाजन
  1. C में टोकन क्या हैं? C में टोकन क्या हैं?

    एक टोकन एक प्रोग्राम का सबसे छोटा तत्व है जो कंपाइलर के लिए सार्थक है। कंपाइलर जो एक प्रोग्राम को सबसे छोटी इकाइयों में तोड़ता है, उन्हें टोकन कहा जाता है और ये टोकन संकलन के विभिन्न चरणों में आगे बढ़ते हैं।प्रकारटोकन विभिन्न प्रकारों में वर्गीकृत हैं, जिनका उल्लेख नीचे किया गया है:कीवर्ड्सआइडेंटिफा

  1. C भाषा में क्यू में एलिमेंट्स इन्सर्ट करना C भाषा में क्यू में एलिमेंट्स इन्सर्ट करना

    डेटा स्ट्रक्चर संरचित तरीके से व्यवस्थित डेटा का संग्रह है। इसे दो प्रकारों में विभाजित किया गया है: लीनियर डेटा स्ट्रक्चर - डेटा लीनियर फैशन में व्यवस्थित है। उदाहरण: ऐरे, स्ट्रक्चर्स, स्टैक्स, क्यूज, लिंक्ड लिस्ट। नॉन-लीनियर डेटा स्ट्रक्चर - डेटा हायरार्किकल तरीके से व्यवस्थित है। उदाहरण: ट्रीज,

  1. C भाषा में शिफ्ट ऑपरेशन क्या हैं? C भाषा में शिफ्ट ऑपरेशन क्या हैं?

    समस्या C भाषा का उपयोग करके किसी संख्या के बाएं शिफ्ट, दाएं शिफ्ट और कॉम्प्लीमेंट को दिखाने का सरल प्रोग्राम क्या है? समाधान बाएं शिफ्ट (Left Shift) यदि किसी वेरिएबल का मान एक बार बाएं शिफ्ट किया जाता है, तो उसका मान दोगुना हो जाता है। उदाहरण के लिए, a = 10, तो a<<1 = 20 दाएं शिफ्ट (Right Sh