- Kompilering transformerer kildekoden til kjørbar maskinkode.
- En kompilator utfører leksikalsk, syntaktisk og semantisk analyse.
- Det er AOT, JIT, krysskompilatorer og transpilatorer.
- Kompilert kode er raskere enn tolket kode.
Hvis du har begitt deg ut i programmeringens verden, har du sannsynligvis hørt begrepet « kompilere ». Dette konseptet er grunnleggende for programvareutvikling, ettersom det definerer prosessen der kildekode skrevet i et programmeringsspråk transformeres til et format som en datamaskin kan kjøre.
Å forstå hva det betyr å kompilere og hvordan en kompilator fungerer er avgjørende for enhver programmerer som ønsker å optimalisere koden sin og bedre forstå hvordan programmeringsspråk fungerer. Nedenfor forklarer vi i detalj hva denne prosessen innebærer, hvilke typer kompilatorer som finnes, og de viktigste forskjellene mellom kompilert og tolket kode.
Hva er kompilering?
Kompilering er prosessen med å oversette kildekode fra et høynivåspråk (som C++, Java eller Rust) til binærkode eller maskinkode, som datamaskinens prosessor kan kjøre direkte.
Kildekode er skrevet på et språk som mennesker kan lese og forstå, men datamaskiner kan bare tolke binærkode. Derfor kreves et spesifikt program kalt en kompilator for å konvertere kildekoden til kjørbar kode. Hvis du vil lære mer om dette emnet, kan du se vår veiledning om konseptene og forskjellene mellom kompilatorer og tolker.
Hva er en kompilator og hvordan fungerer den?
En kompilator er et program som spesialiserer seg på å transformere kildekode til objektkode eller kjørbar kode. Denne konverteringsprosessen består av flere faser:
1. Forbehandling
Før kompilering går kildekoden gjennom en forbehandlingsfase hvor makroer utvides, nødvendige filer inkluderes og andre modifikasjoner gjøres før koden som faktisk kompileres genereres.
2. Leksikalsk analyse
Kompilatoren skanner kildekoden og deler den inn i tokens , som er de minste meningsenhetene i programmeringsspråket, for eksempel nøkkelord, identifikatorer og operatorer.
3. Syntaktisk analyse
I denne fasen verifiseres strukturen til koden til å være korrekt i henhold til grammatikken til programmeringsspråket. Hvis det er syntaksfeil, vil kompilatoren oppdage dem og fortelle programmereren hvor de er slik at de kan korrigeres.
4. Semantisk analyse
Kompilatoren sjekker at operasjonene og uttrykkene i koden gir logisk mening. Den bekrefter at variabler og funksjoner er veldefinerte og at gyldige operasjoner utføres. Dette er avgjørende for å sikre at koden din kompileres uten problemer.
5. Mellomkodegenerering
Etter å ha verifisert syntaksen og semantikken til koden, genererer kompilatoren mellomkode , en forenklet representasjon som kan optimaliseres før den endelige oversettelsen til maskinkode.
6. Kodeoptimalisering
På dette stadiet forbedrer kompilatoren den genererte koden for å gjøre den mer effektiv og redusere minneforbruk og behandlingstid.
7. Generering av maskinkode
Til slutt konverteres mellomkoden til maskinkodeinstruksjoner som er spesifikke for datamaskinens prosessorarkitektur. Denne delen av prosessen er viktig for å sikre at programmet fungerer riktig på maskinvaren.
8. Kobling
Den genererte objektkoden kombineres med biblioteker og andre moduler som kreves for å produsere den endelige kjørbare filen. Hvordan disse bibliotekene administreres er interessant, og for dette kan en spesialisert kompilator være nyttig, slik som de du finner i vår seksjon om kompilatorer for C-språket.
Typer kompilatorer
Det finnes forskjellige typer kompilatorer avhengig av deres drift og formål:
- AOT (Ahead-Of-Time) kompilatorer: De kompilerer all koden før de kjører den. Eksempler: GCC, Clang.
- JIT (Just-In-Time) kompilatorer: De kompilerer koden under kjøring for å forbedre ytelsen. Eksempler: JVM for Java, V8 for JavaScript. For en dypere forståelse av denne typen, foreslår vi vår guide på Just-In-Time-kompilatorer.
- Krysskompilatorer: De genererer kjørbar kode for en annen plattform enn den de kjører. Hvis du er interessert kan du lese om Krysskompilatorer i detalj.
- Transpilere: De transformerer kode fra ett høynivåspråk til et annet, for eksempel TypeScript til JavaScript.
Kompilert kode vs tolket kode
En av hovedforskjellene i programutførelse er om koden kompileres eller tolkes :
- Kompilert kode: Den er fullstendig oversatt før løping og er vanligvis raskere. Eksempel: C, C++.
- Tolket kode: Oversatt linje for linje ved kjøretid, noe som letter portabiliteten, men reduserer ytelsen. Eksempel: Python, JavaScript.
Praktisk kompileringseksempel
Anta at du skriver et program i C:
#inkludere int main() { printf("Hei, verden!\n"); returner 0; }
For å kompilere denne koden med GCC i en terminal, vil du kjøre:
gcc program.c -o program
Gjennom hele artikkelen har vi utforsket kompileringsprosessen i dybden, fra definisjonen til dens betydning i programvareutvikling. Mens tolkede språk tilbyr fleksibilitet, er kompilerte språk kjent for sin effektivitet. Å forstå hvordan en kompilator fungerer og fasene i prosessen er nøkkelen til å forbedre ferdighetene våre som programmerere.