- Prevođenje pretvara izvorni kod u izvršni strojni kod.
- Prevodilac izvodi leksičku, sintaktičku i semantičku analizu.
- Postoje AOT, JIT, unakrsni kompajleri i transpileri.
- Prevedeni kod je brži od interpretiranog koda.
Ako ste se ikada upustili u svijet programiranja, vjerojatno ste čuli izraz " kompiliranje ". Ovaj koncept je temeljan za razvoj softvera, jer definira proces kojim se izvorni kod napisan u programskom jeziku pretvara u format koji računalo može izvršiti.
Razumijevanje što znači kompajlirati i kako kompajler radi bitno je za svakog programera koji želi optimizirati svoj kod i bolje razumjeti kako rade programski jezici. U nastavku detaljno objašnjavamo što ovaj proces uključuje, vrste kompajlera koji postoje i ključne razlike između kompajliranog i interpretiranog koda.
Što je sastavljanje?
Kompiliranje je proces prevođenja izvornog koda iz programskog jezika visoke razine (kao što su C++, Java ili Rust) u binarni kod ili strojni kod, koji procesor računala može izravno izvršiti.
Izvorni kod je napisan jezikom koji ljudi mogu čitati i razumjeti, ali računala mogu interpretirati samo binarni kod. Stoga je za pretvaranje izvornog koda u izvršni kod potreban poseban program koji se naziva kompajler . Ako želite saznati više o ovoj temi, možete se obratiti našem vodiču o konceptima i razlikama između kompajlera i interpretera.
Što je kompajler i kako radi?
Kompajler je program specijaliziran za pretvaranje izvornog koda u objektni kod ili izvršni kod. Ovaj proces pretvorbe sastoji se od nekoliko faza:
1. Predprocesiranje
Prije kompilacije, izvorni kod prolazi kroz fazu predprocesiranja u kojoj se makronaredbe proširuju, uključuju potrebne datoteke i rade druge izmjene prije generiranja koda koji se zapravo kompilira.
2. Leksička analiza
Kompajler skenira izvorni kod i dijeli ga na tokene , koji su najmanje jedinice značenja u programskom jeziku, kao što su ključne riječi, identifikatori i operatori.
3. Sintaktička analiza
U ovoj fazi provjerava se ispravnost strukture koda prema gramatici programskog jezika. Ako postoje sintaktičke pogreške, kompajler će ih otkriti i reći programeru gdje se nalaze kako bi se mogle ispraviti.
4. Semantička analiza
Kompajler provjerava imaju li operacije i izrazi u kodu logičan smisao. Provjerava jesu li varijable i funkcije dobro definirane i izvode li se valjane operacije. To je ključno kako bi se osiguralo da se vaš kod kompajlira bez problema.
5. Međugeneracija koda
Nakon provjere sintakse i semantike koda, kompajler generira međukod , pojednostavljeni prikaz koji se može optimizirati prije konačnog prevođenja u strojni kod.
6. Optimizacija koda
U ovoj fazi, kompajler poboljšava generirani kod kako bi ga učinio učinkovitijim i smanjio potrošnju memorije i vrijeme obrade.
7. Generiranje strojnog koda
Konačno, međukod se pretvara u instrukcije strojnog koda specifične za arhitekturu procesora računala. Ovaj dio procesa je ključan kako bi se osiguralo da će program ispravno funkcionirati na hardveru.
8. Povezivanje
Generirani objektni kod kombinira se s bibliotekama i drugim modulima potrebnim za izradu konačne izvršne datoteke. Zanimljivo je kako se te biblioteke upravljaju, a za to može biti koristan specijalizirani kompajler, poput onih koje možete pronaći u našem odjeljku o kompajlerima za jezik C.
Vrste kompilatora
Postoje različite vrste kompilatora ovisno o njihovom radu i namjeni:
- AOT (Ahead-Of-Time) prevoditelji: Oni kompajliraju sav kod prije nego što ga izvrše. Primjeri: GCC, Clang.
- JIT (Just-In-Time) prevoditelji: Prevode kod tijekom izvođenja kako bi poboljšali izvedbu. Primjeri: JVM za Javu, V8 za JavaScript. Za dublje razumijevanje ove vrste, predlažemo naš vodič o Just-In-Time prevoditelji.
- Unakrsni kompajleri: Generiraju izvršni kod za platformu koja nije ona koju pokreću. Ako vas zanima, možete pročitati o Unakrsni kompajleri u detaljima.
- Transpileri: Oni transformiraju kod iz jednog jezika visoke razine u drugi, kao što je TypeScript u JavaScript.
Prevedeni kod naspram interpretiranog koda
Jedna od glavnih razlika u izvršavanju programa je u tome da li se kod kompajlira ili interpretira :
- Sastavljeni kod: Potpuno se prevodi prije pokretanja i obično je brži. Primjer: C, C++.
- Interpretirani kod: Prevedeno redak po redak tijekom izvođenja, olakšavajući prenosivost, ali smanjujući performanse. Primjer: Python, JavaScript.
Praktičan primjer kompilacije
Pretpostavimo da napišete program u C-u:
#uključi int main() { printf("Zdravo, svijete!\n"); povratak 0; }
Da biste kompajlirali ovaj kod s GCC-om u terminalu, trebali biste pokrenuti:
gcc program.c -o program
Kroz članak smo detaljno istražili proces kompilacije, od njegove definicije do njegove važnosti u razvoju softvera. Dok interpretirani jezici nude fleksibilnost, kompilirani jezici su poznati po svojoj učinkovitosti. Razumijevanje načina na koji prevodilac radi i faza procesa ključno je za poboljšanje naših vještina programera.