Processo di compilazione in c
Che cos’è una compilazione?
La compilazione è un processo di conversione del codice sorgente in codice oggetto. È fatto con l’aiuto del compilatore. Il compilatore controlla il codice sorgente per gli errori sintattici o strutturali, e se il codice sorgente è privo di errori, quindi genera il codice oggetto.
Il processo di compilazione c converte il codice sorgente preso come input nel codice oggetto o nel codice macchina. Il processo di compilazione può essere suddiviso in quattro fasi, vale a dire, Pre-elaborazione, 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 <stdio.h>, la direttiva è disponibile nel programma, quindi il preprocessore interpreta la direttiva e sostituisce questa direttiva con il contenuto dell ‘stdio.h ‘ file.
Di seguito sono riportate le fasi attraverso le quali il nostro programma passa prima di essere trasformato in un modulo eseguibile:
- Preprocessore
- Compilatore
- Assembler
- Linker
Preprocessore
Il codice sorgente è il codice che è scritto in un editor di testo e il file di codice sorgente è data una proroga “.C”. Questo codice sorgente viene prima passato al preprocessore e quindi il preprocessore espande questo codice. Dopo aver ampliato il codice, il codice espanso viene passato al compilatore.
Compilatore
Il codice che viene 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.
Assembler
Il codice assembly viene convertito in codice oggetto utilizzando un assembler. Il nome del file oggetto generato dall’assemblatore è 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 è ‘ hello.c’, quindi il nome del file oggetto sarebbe ‘ hello.obj’.
Linker
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 viene memorizzato con’.lib’ (o ‘.a’) estensione. Il lavoro principale del linker è quello di combinare il codice oggetto dei file di libreria con il codice oggetto del nostro programma. A volte la situazione si verifica quando il nostro programma si riferisce alle funzioni definite in altri file; quindi linker svolge un ruolo molto importante in questo. Collega il codice oggetto di questi file al nostro programma. Pertanto, concludiamo che il lavoro del linker è quello di collegare il codice oggetto del nostro programma con il codice oggetto dei file di libreria e altri file. L’output del linker è il file eseguibile. Il nome del file eseguibile è lo stesso del file sorgente, ma differisce solo nelle loro estensioni. In DOS, l’estensione del file eseguibile è’.exe’, e in UNIX, il file eseguibile può essere chiamato come ‘a. out’. Ad esempio, se stiamo usando la funzione printf() in un programma, il linker aggiunge il codice associato in un file di output.
Capiamo attraverso un esempio.
ciao.c
Ora, creeremo un diagramma di flusso del programma di cui sopra:
Nel diagramma di flusso di cui sopra, i seguenti passi sono presi per eseguire un programma:
- In primo luogo, il file di input, cioè, ciao.c, viene passato al preprocessore e il preprocessore converte il codice sorgente in codice sorgente espanso. L’estensione del codice sorgente espanso sarebbe hello.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 hello.s.
- Questo codice assembly viene quindi inviato all’assemblatore, 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.