kompajler je program što u prijevodu znači ljudsko razumljivo izvorni kod u računalni izvršni stroj. Da bi se to postiglo uspješno, ljudski čitljiv kôd mora biti u skladu s sintaksa pravila u kojem god programskom jeziku napisan. Kompajler je samo program i ne može popraviti vaš kod. Ako pogriješite, morate ispraviti sintaksu ili se ona neće kompilirati.
Što se događa kada sastavite kod?
Složenost prevoditelja ovisi o sintaksi jezika i koliko apstrakcije taj programski jezik pruža. Kompajler za C mnogo je jednostavniji od prevoditelja za C ++ ili C #.
Leksička analiza
Prilikom sastavljanja, prevoditelj prvo čita niz znakova iz datoteke izvornog koda i generira tok leksičkih znakova. Na primjer, C ++ kod:
int C = (A * B) +10;
mogu se analizirati kao sljedeći znakovi:
- upišite "int"
- varijabla "C"
- jednaki
- leftbracket
- varijabla "A"
- puta
- varijabla "B"
- rightbracket
- plus
- doslovno "10"
Sintaktička analiza
Leksički izlaz ide u dio sintaktičkog analizatora sastavljača, koji koristi gramatička pravila da odluči je li unos valjan ili ne. Osim ako
varijable A i B su prethodno deklarirani i bili su u dosegu, prevoditelj bi mogao reći:- 'A': neprijavljeni identifikator.
Ako su deklarirani, ali nisu inicijalizirani. sastavljač izdaje upozorenje:
- lokalna varijabla 'A' koristi se bez inicijalizacije.
Nikada ne smijete zanemariti upozorenja prevoditelja. Mogu vam razbiti kôd na čudne i neočekivane načine. Uvijek ispravite upozorenja prevoditelja.
Jedan prolaz ili dva?
Neki su programski jezici napisani tako da prevodilac može pročitati izvorni kod samo jednom i generirati strojni kod. paskal jedan je takav jezik. Puno Sastavljači zahtijevaju najmanje dva prolaza. Ponekad je to zbog prosljeđenih deklaracija funkcije ili nastave.
U C ++, klasa se može deklarirati, ali ne i definirati do kasnije. Prevoditelj ne može dokučiti koliko memorije treba razredu dok ne sastavi tijelo klase. Prije generiranja ispravnog strojnog koda mora pročitati izvorni kod.
Stvaranje strojne šifre
Pod pretpostavkom da prevodilac uspješno dovrši leksičke i sintaktičke analize, u posljednjoj je fazi generiranje strojnog koda. Ovo je složen proces, posebno s modernim procesorima.
Brzina sastavljenog izvršna kôd treba biti što brži i može se uvelike razlikovati ovisno o kvaliteti generiranog koda i o tome koliko je zahtjevalo optimizaciju.
Većina prevoditelja vam omogućuje da odredite količinu optimizacije - obično poznatu po brzom uklanjanju pogrešaka i potpunoj optimizaciji za objavljeni kod.
Generacija koda je izazovna
Pisci prevoditelja sastavljaju se izazovima pri pisanju generatora koda. Mnogi procesori ubrzavaju obradu upotrebom
- Uputstvo o cjevovodu
- interni sprema.
Ako su sve upute unutar koda petlja može se održati u CPU cache, onda ta petlja radi mnogo brže nego kad CPU mora dohvaćati upute iz glavnog RAM-a. CPU cache memorija je blok memorije ugrađene u CPU čip kojem se pristupa mnogo brže nego podacima u glavnom RAM-u.
Predmemorije i redovi
Većina CPU-a ima redoslijed prije preuzimanja gdje CPU čita upute u predmemoriju prije nego što ih izvrši. Ako se dogodi uvjetna grana, CPU mora ponovno učitati red. Kôd treba generirati da se to svede na najmanju moguću mjeru.
Mnogi CPU-ovi imaju zasebne dijelove za:
- Aritmetika cijelih brojeva (cijeli brojevi)
- Aritmetika s pomičnim zarezom (frakcijski brojevi)
Ove se operacije često mogu izvoditi paralelno kako bi se povećala brzina.
Kompilatori obično generiraju strojni kod u objektne datoteke koje su tada povezan zajedno programom za povezivanje.