Kompileringen er prosessen med å konvertere kildekoden til C-språket til maskinkode. Siden C er et mellomnivåspråk, trenger det en kompilator for å konvertere det til en kjørbar kode slik at programmet kan kjøres på maskinen vår.
C-programmet går gjennom følgende faser under kompilering:

Kompileringsprosess i C
Hvordan kompilerer og kjører vi et C-program?
Vi trenger først en kompilator og en kodeeditor for å kompilere og kjøre et C-program. Eksempelet nedenfor er en Ubuntu-maskin med GCC-kompilator.
Trinn 1: Opprette en C-kildefil
Vi lager først et C-program ved hjelp av en editor og lagrer filen som filnavn.c
unix toppkommando
$ vi filename.c>
Vi kan skrive et enkelt hello world-program og lagre det.
Trinn 2: Kompilering ved hjelp av GCC-kompilator
Vi bruker følgende kommando i terminalen for å kompilere vår filename.c kildefil
$ gcc filename.c –o filename>
Vi kan sende mange instruksjoner til GCC-kompilatoren til forskjellige oppgaver som:
- Alternativet -Wall aktiverer alle kompilatorens advarselsmeldinger. Dette alternativet anbefales for å generere bedre kode.
- Alternativet -o brukes til å spesifisere utdatafilnavnet. Hvis vi ikke bruker dette alternativet, genereres en utdatafil med navnet a.out.
Hvis det ikke er noen feil i C-programmet vårt, vil den kjørbare filen til C-programmet bli generert.
c struktur i struktur
Trinn 3: Kjøring av programmet
Etter kompilering genereres kjørbar fil og vi kjører den genererte kjørbare ved å bruke kommandoen nedenfor.
$ ./filename>
Programmet vil bli utført og utgangen vil vises i terminalen.
påskeegg i Android
Hva skjer i kompileringsprosessen?
En kompilator konverterer et C-program til en kjørbar fil. Det er fire faser for et C-program for å bli en kjørbar:
- Forbearbeiding av sammenstillingssammenkobling
Ved å utføre kommandoen nedenfor får vi alle mellomfiler i gjeldende katalog sammen med den kjørbare.
$gcc -Wall -save-temps filename.c –o filename>
Følgende skjermbilde viser alle genererte mellomfiler.
Mellomliggende filer
La oss en etter en se hva disse mellomfilene inneholder.
1. Forbehandling
Dette er den første fasen som kildekoden sendes gjennom. Denne fasen inkluderer:
- Fjerning av kommentarer
- Utvidelse av makroer
- Utvidelse av de inkluderte filene.
- Betinget kompilering
Den forhåndsbehandlede utgangen lagres i filnavn.i . La oss se hva som er inne i filename.i: ved å bruke $vi filnavn.i
I utgangen ovenfor er kildefilen fylt med massevis av informasjon, men til slutt er koden vår bevart.
- printf inneholder nå a + b i stedet for add(a, b), det er fordi makroer har utvidet seg.
- Kommentarer fjernes. #include mangler i stedet ser vi massevis av kode. Så header-filer har blitt utvidet og inkludert i kildefilen vår.
2. Kompilering
Det neste trinnet er å kompilere filnavn.i og produsere en; mellomliggende kompilerte utdatafil filnavn.s . Denne filen er i instruksjoner på monteringsnivå. La oss se gjennom denne filen ved å bruke $nano filnavn.s terminalkommando.
sharwanand
Monteringskodefil
Øyeblikksbildet viser at det er på assemblerspråk, som assembleren kan forstå.
3. Montering
I denne fasen blir filnavnet.s tatt som input og omgjort til filnavn.o av montøren. Denne filen inneholder instruksjoner på maskinnivå. I denne fasen blir bare eksisterende kode konvertert til maskinspråk, og funksjonskall som printf() løses ikke. La oss se denne filen ved å bruke $vi filnavn.o
java sammenligning
Binær kode
4. Kobling
Dette er den siste fasen der all kobling av funksjonskall med deres definisjoner er gjort. Linker vet hvor alle disse funksjonene er implementert. Linker gjør litt ekstra arbeid også, den legger til litt ekstra kode til programmet vårt som kreves når programmet starter og slutter. For eksempel er det en kode som kreves for å sette opp miljøet som å sende kommandolinjeargumenter. Denne oppgaven kan enkelt verifiseres ved å bruke $størrelse filnavn.o og $size filnavn . Gjennom disse kommandoene vet vi hvordan utdatafilen øker fra en objektfil til en kjørbar fil. Dette er på grunn av den ekstra koden som Linker legger til programmet vårt.
Merk: GCC gjør som standard dynamisk kobling, så printf() er dynamisk koblet i programmet ovenfor. Se dette, dette og dette for flere detaljer om statisk og dynamisk kobling.