logo

Processo di compilazione in c

Cos'è una compilazione?

La compilazione è un processo di conversione del codice sorgente in codice oggetto. Viene fatto con l'aiuto del compilatore. Il compilatore controlla il codice sorgente per eventuali errori sintattici o strutturali e, se il codice sorgente è privo di errori, genera il codice oggetto.

Processo di compilazione in c

Il processo di compilazione c converte il codice sorgente preso in input nel codice oggetto o nel codice macchina. Il processo di compilazione può essere suddiviso in quattro fasi, ovvero preelaborazione, compilazione, assemblaggio e collegamento.

Il preprocessore prende il codice sorgente come input e rimuove tutti i commenti dal codice sorgente. Il preprocessore prende la direttiva del preprocessore e la interpreta. Ad esempio, se , la direttiva è disponibile nel programma, quindi il preprocessore interpreta la direttiva e sostituisce questa direttiva con il contenuto di 'stdio.h' file.

saltare l'elenco

Di seguito le fasi attraverso le quali passa il nostro programma prima di essere trasformato in forma eseguibile:

    Preprocessore Compilatore Assemblatore Collegamento
Processo di compilazione in c

Preprocessore

Il codice sorgente è il codice scritto in un editor di testo e al file del codice sorgente viene data l'estensione '.c'. Questo codice sorgente viene prima passato al preprocessore, quindi il preprocessore espande questo codice. Dopo aver espanso il codice, il codice espanso viene passato al compilatore.

Compilatore

Il codice espanso dal preprocessore viene passato al compilatore. Il compilatore converte questo codice in codice assembly. Oppure possiamo dire che il compilatore C converte il codice pre-elaborato in codice assembly.

Assemblatore

Il codice assembly viene convertito in codice oggetto utilizzando un assembler. Il nome del file oggetto generato dall'assembler è lo stesso del file sorgente. L'estensione del file oggetto in DOS è '.obj' e in UNIX l'estensione è 'o'. Se il nome del file sorgente è 'Ciao C', quindi il nome del file oggetto sarebbe 'ciao.obj'.

Collegamento

Principalmente tutti i programmi scritti in C utilizzano funzioni di libreria. Queste funzioni di libreria sono precompilate e il codice oggetto di questi file di libreria è memorizzato con l'estensione '.lib' (o '.a'). Il funzionamento principale del linker è combinare il codice oggetto dei file di libreria con il codice oggetto del nostro programma. A volte capita che il nostro programma faccia riferimento a funzioni definite in altri file; quindi il linker gioca un ruolo molto importante in questo. Collega il codice oggetto di questi file al nostro programma. Pertanto, concludiamo che il compito del linker è collegare il codice oggetto del nostro programma con il codice oggetto dei file di libreria e di altri file. L'output del linker è il file eseguibile. Il nome del file eseguibile è lo stesso del file sorgente ma differisce solo per le estensioni. In DOS, l'estensione del file eseguibile è '.exe', mentre in UNIX il file eseguibile può essere denominato 'a.out'. Ad esempio, se utilizziamo la funzione printf() in un programma, il linker aggiunge il codice associato in un file di output.

Capiamolo attraverso un esempio.

Ciao C

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

Ora creeremo un diagramma di flusso del programma sopra:

Processo di compilazione in c

Nel diagramma di flusso sopra, vengono eseguiti i seguenti passaggi per eseguire un programma:

  • Innanzitutto, il file di input, ovvero Ciao C, viene passato al preprocessore e il preprocessore converte il codice sorgente in codice sorgente espanso. L'estensione del codice sorgente espanso sarebbe ciao.i.
  • Il codice sorgente espanso viene passato al compilatore e il compilatore converte questo codice sorgente espanso in codice assembly. L'estensione del codice assembly sarebbe ciao.s.
  • Questo codice assembly viene quindi inviato all'assembler, che converte il codice assembly in codice oggetto.
  • Dopo la creazione di un codice oggetto, il linker crea il file eseguibile. Il caricatore caricherà quindi il file eseguibile per l'esecuzione.