logo

Procesul de compilare în c

Ce este o compilație?

Compilarea este un proces de conversie a codului sursă în cod obiect. Se face cu ajutorul compilatorului. Compilatorul verifică codul sursă pentru erorile sintactice sau structurale, iar dacă codul sursă nu conține erori, atunci generează codul obiect.

Procesul de compilare în c

Procesul de compilare c convertește codul sursă luat ca intrare în codul obiect sau codul mașinii. Procesul de compilare poate fi împărțit în patru pași, și anume, preprocesare, compilare, asamblare și legare.

Preprocesorul ia codul sursă ca intrare și elimină toate comentariile din codul sursă. Preprocesorul ia directiva de preprocesor și o interpretează. De exemplu, dacă , directiva este disponibilă în program, apoi preprocesorul interpretează directiva și înlocuiește această directivă cu conținutul „stdio.h” fişier.

codul numărului aleatoriu c

Următoarele sunt fazele prin care trece programul nostru înainte de a fi transformat într-o formă executabilă:

    Preprocesor Compilator Asamblator Linker
Procesul de compilare în c

Preprocesor

Codul sursă este codul care este scris într-un editor de text și fișierului cu codul sursă i se dă extensia „.c”. Acest cod sursă este mai întâi transmis preprocesorului, iar apoi preprocesorul extinde acest cod. După extinderea codului, codul extins este transmis compilatorului.

Compilator

Codul care este extins de preprocesor este transmis compilatorului. Compilatorul convertește acest cod în cod de asamblare. Sau putem spune că compilatorul C convertește codul preprocesat în cod de asamblare.

Asamblator

Codul de asamblare este convertit în cod obiect folosind un asamblator. Numele fișierului obiect generat de asamblator este același cu fișierul sursă. Extensia fișierului obiect în DOS este „.obj”, iar în UNIX, extensia este „o”. Dacă numele fișierului sursă este 'buna', atunci numele fișierului obiect ar fi „hello.obj”.

Linker

În principal, toate programele scrise în C folosesc funcții de bibliotecă. Aceste funcții de bibliotecă sunt pre-compilate, iar codul obiect al acestor fișiere de bibliotecă este stocat cu extensia „.lib” (sau „.a”). Funcția principală a linkerului este de a combina codul obiect al fișierelor de bibliotecă cu codul obiect al programului nostru. Uneori apare situația când programul nostru se referă la funcțiile definite în alte fișiere; atunci linkerul joacă un rol foarte important în acest sens. Leagă codul obiect al acestor fișiere la programul nostru. Prin urmare, concluzionăm că sarcina linkerului este de a lega codul obiect al programului nostru cu codul obiect al fișierelor bibliotecii și al altor fișiere. Ieșirea linkerului este fișierul executabil. Numele fișierului executabil este același cu fișierul sursă, dar diferă doar prin extensiile acestora. În DOS, extensia fișierului executabil este „.exe”, iar în UNIX, fișierul executabil poate fi numit „a.out”. De exemplu, dacă folosim funcția printf() într-un program, atunci linkerul adaugă codul asociat într-un fișier de ieșire.

Să înțelegem printr-un exemplu.

buna

 #include int main() { printf('Hello javaTpoint'); return 0; } 

Acum, vom crea o diagramă de flux a programului de mai sus:

Procesul de compilare în c

În diagrama de flux de mai sus, se parcurg următorii pași pentru a executa un program:

  • În primul rând, fișierul de intrare, adică buna, este transmis preprocesorului, iar preprocesorul convertește codul sursă în cod sursă extins. Extensia codului sursă extins ar fi buna eu.
  • Codul sursă extins este transmis compilatorului, iar compilatorul convertește acest cod sursă extins în cod de asamblare. Extinderea codului de asamblare ar fi salut.s.
  • Acest cod de asamblare este apoi trimis la asamblator, care convertește codul de asamblare în cod obiect.
  • După crearea unui cod obiect, linkerul creează fișierul executabil. Încărcătorul va încărca apoi fișierul executabil pentru execuție.