- Kompileerimine muudab lähtekoodi käivitatavaks masinkoodiks.
- Kompilaator teostab leksikaalset, süntaktilist ja semantilist analüüsi.
- On olemas AOT, JIT, ristkompilaatorid ja transpileerijad.
- Kompileeritud kood on kiirem kui tõlgendatud kood.

Kui oled programmeerimise maailma sattunud, oled ilmselt kuulnud terminit " kompileerima ". See kontseptsioon on tarkvaraarenduse alus, kuna see määratleb protsessi, mille käigus programmeerimiskeeles kirjutatud lähtekood teisendatakse arvuti poolt käivitatavaks vorminguks.
Mõistmine, mida tähendab kompileerimine ja kuidas kompilaator töötab, on oluline iga programmeerija jaoks, kes soovib oma koodi optimeerida ja programmeerimiskeelte toimimist paremini mõista. Allpool selgitame üksikasjalikult, mida see protsess endast kujutab, olemasolevaid kompilaatorite tüüpe ning peamisi erinevusi kompileeritud ja tõlgendatud koodi vahel.
Mis on koostamine?
Kompileerimine on protsess, mille käigus tõlgitakse kõrgetasemelise programmeerimiskeele (näiteks C++, Java või Rust) lähtekood kahendkoodiks või masinkoodiks, mida arvuti protsessor saab otse käivitada.
Lähtekood on kirjutatud keeles, mida inimesed saavad lugeda ja mõista, kuid arvutid saavad tõlgendada ainult binaarkoodi. Seetõttu on lähtekoodi käivitatavaks koodiks teisendamiseks vaja spetsiaalset programmi, mida nimetatakse kompilaatoriks . Kui soovite selle teema kohta rohkem teada saada, saate tutvuda meie juhendiga kompilaatorite ja interpretaatorite kontseptsioonide ja erinevuste kohta.
Mis on kompilaator ja kuidas see töötab?
Kompilaator on programm , mis on spetsialiseerunud lähtekoodi teisendamisele objektkoodiks või käivitatavaks koodiks. See teisendusprotsess koosneb mitmest etapist:
1. Eeltöötlus
Enne kompileerimist läbib lähtekood eeltöötlusfaasi, kus makrosid laiendatakse, vajalikud failid kaasatakse ja tehakse muid muudatusi enne tegelikult kompileeritava koodi genereerimist.
2. Leksikaalne analüüs
Kompilaator skaneerib lähtekoodi ja jagab selle token'iteks , mis on programmeerimiskeele väikseimad tähendusühikud, näiteks märksõnad, identifikaatorid ja operaatorid.
3. Süntaktiline analüüs
Selles faasis kontrollitakse koodi struktuuri õigsust vastavalt programmeerimiskeele grammatikale. Kui esineb süntaksivigu, tuvastab kompilaator need ja teatab programmeerijale nende asukoha, et neid saaks parandada.
4. Semantiline analüüs
Kompilaator kontrollib, kas koodis olevad toimingud ja avaldised on loogiliselt mõistlikud. See veendub, et muutujad ja funktsioonid on täpselt määratletud ning et sooritatakse kehtivaid toiminguid. See on ülioluline, et tagada koodi probleemideta kompileerimine.
5. Vahepealne koodi genereerimine
Pärast koodi süntaksi ja semantika kontrollimist genereerib kompilaator vahekoodi , lihtsustatud esituse, mida saab enne masinkoodi lõplikku tõlkimist optimeerida.
6. Koodi optimeerimine
Selles etapis täiustab kompilaator genereeritud koodi, et muuta see tõhusamaks ning vähendada mälu tarbimist ja töötlemisaega.
7. Masinakoodi genereerimine
Lõpuks teisendatakse vahekood arvuti protsessori arhitektuurile omasteks masinkoodi juhisteks . See protsessi osa on ülioluline, et tagada programmi korrektne toimimine riistvaral.
8. Linkimine
Genereeritud objektkood kombineeritakse teekide ja muude moodulitega, mis on vajalikud lõpliku käivitatava faili loomiseks. Nende teekide haldamine on huvitav ja selleks võib olla kasulik spetsiaalne kompilaator, näiteks need, mida leiate meie C-keele kompilaatorite jaotisest.
Kompilaatorite tüübid
Olenevalt nende tööst ja eesmärgist on erinevaid kompilaatoreid:
- AOT (Ahead-Of-Time) koostajad: nad kompileerivad kogu koodi enne selle käivitamist. Näited: GCC, Clang.
- JIT (Just-In-Time) kompilaatorid: nad kompileerivad koodi täitmise ajal, et parandada jõudlust. Näited: JVM Java jaoks, V8 JavaScripti jaoks. Selle tüübi sügavamaks mõistmiseks soovitame meie juhendit Just-In-Time kompilaatorid.
- Ristkoostajad: nad loovad käivitatava koodi muule platvormile kui see, mida nad kasutavad. Kui olete huvitatud, võite lugeda Ristkoostajad üksikasjalikult.
- Transpilaatorid: nad teisendavad koodi ühest kõrgetasemelisest keelest teise, näiteks TypeScripti JavaScriptiks.
Kompileeritud kood vs tõlgendatud kood
Üks peamisi erinevusi programmi täitmisel on see, kas kood kompileeritakse või interpreteeritakse :
- Koostatud kood: See tõlgitakse täielikult enne jooksmist ja on tavaliselt kiirem. Näide: C, C++.
- Tõlgendatud kood: tõlgitakse rea haaval käitusajal, hõlbustades teisaldatavust, kuid vähendades jõudlust. Näide: Python, JavaScript.
Praktiline koostamise näide
Oletame, et kirjutate programmi C keeles:
#kaasa int main() { printf("Tere, maailm!\n"); tagasi 0; }
Selle koodi kompileerimiseks terminalis GCC-ga käivitage:
gcc programm.c -o programm
Kogu artikli jooksul oleme põhjalikult uurinud kompileerimisprotsessi, alates selle määratlusest kuni selle tähtsuseni tarkvaraarenduses. Kuigi tõlgitud keeled pakuvad paindlikkust, on koostatud keeled silmapaistvad oma tõhususe poolest. Kompilaatori tööpõhimõtte ja protsessi etappide mõistmine on meie kui programmeerijate oskuste parandamise võti.