Mis on koodikompilaator ja mida see teeb?

A koostaja on programmi mis tõlgib inimesele loetavaks lähtekood arvutisse käivitatavasse masinkoodi. Edukaks toimimiseks peab inimloetav kood vastama koodile süntaks reeglid, olenemata sellest, millises programmeerimiskeeles see on kirjutatud. Kompilaator on ainult programm ja ei saa teie koodi teie jaoks parandada. Kui teete vea, peate süntaksi parandama, vastasel juhul see ei kompileeru.

Mis juhtub, kui koodi kompileeritakse?

Kompilaatori keerukus sõltub keele süntaksist ja abstraktsusest see programmeerimiskeel pakub. C-kompilaator on palju lihtsam kui C ++ või C # kompilaator.

Leksikaalne analüüs

Kompileerimisel loeb kompilaator kõigepealt lähtekoodifailist tähemärkide voo ja genereerib leksikaalsete märkide voo. Näiteks C ++ kood:

int C = (A * B) +10;

võidakse analüüsida järgmiste märkidena:

  • kirjuta "int"
  • muutuja "C"
  • võrdub
  • vasakpoolne sulg
  • muutuja "A"
  • korda
  • muutuja "B"
  • parempoolne sulg
  • pluss
  • sõnasõnaline "10"

Süntaktiline analüüs

Leksikaalne väljund läheb kompilaatori süntaktilise analüsaatori ossa, mis kasutab grammatikareegleid, et otsustada, kas sisend sobib või mitte. Kui ei

instagram viewer
muutujad A ja B olid varem deklareeritud ja ulatusega, võiks koostaja öelda:

  • 'A': deklareerimata tunnus.

Kui need kuulutati välja, kuid neid ei initsialiseerita. koostaja annab hoiatuse:

  • kohalikku muutujat A kasutatakse ilma seda lähtestamata.

Te ei tohiks kunagi ignoreerida kompilaatori hoiatusi. Nad võivad teie koodi imelikul ja ootamatul moel rikkuda. Parandage alati kompilaatori hoiatused.

Üks pass või kaks?

Mõni programmeerimiskeel on kirjutatud nii, et kompilaator saab lähtekoodi lugeda ainult üks kord ja genereerida masinkoodi. Pascal on üks selline keel. Palju koostajad nõuda vähemalt kaks läbimist. Mõnikord on selle põhjuseks: funktsioonid või klassid.

C ++ puhul saab klassi deklareerida, kuid määratleda alles hiljem. Kompilaator ei suuda välja töötada, kui palju mälu klass vajab, kuni see komplekteerib klassi teksti. Enne õige masinkoodi genereerimist peab see uuesti lähtekoodi lugema.

Masinkoodi genereerimine

Eeldusel, et kompilaator on leksikaalse ja süntaktilise analüüsi edukalt lõpule viinud, genereerib viimane etapp masinkoodi. See on keeruline protsess, eriti kaasaegsete protsessorite puhul.

Koostatud kiirus käivitatav kood peaks olema võimalikult kiire ja see võib varieeruda tohutult sõltuvalt genereeritud koodi kvaliteedist ja sellest, kui palju optimeerimist taotleti.

Enamik kompilaatoritest laseb teil täpsustada optimeerimise mahu - tavaliselt tuntud kompilatsioonide kiire silumise ja vabastatud koodi täieliku optimeerimise jaoks.

Koodide genereerimine on keeruline

Koodigeneraatori kirjutamisel seisavad koostajad kirjutaja ees väljakutsetega. Paljud protsessorid kiirendavad töötlemist kasutades

  • Juhend torujuhtmete paigaldamine
  • Sisemine vahemälud.

Kui kõik juhised kood silmus saab pidada Protsessor vahemälu, siis töötab see silmus palju kiiremini kui siis, kui keskseade peab juhtnööre tooma peamisest RAM-ist. CPU vahemälu on CPU-kiipi sisseehitatud mäluplokk, millele pääseb juurde palju kiiremini kui põh RAM-is sisalduvatel andmetel.

Vahemälud ja järjekorrad

Enamikul protsessoritel on eeltoomise järjekord, kus protsessor loeb juhised vahemällu enne nende täitmist. Tingimusliku hargnemise korral peab CPU järjekorda uuesti laadima. Selle minimeerimiseks tuleks kood luua.

Paljudel protsessoritel on eraldi osad:

  • Täisarv aritmeetiline (täisarvud)
  • Ujukoma aritmeetiline (murdarv)

Need toimingud võivad kiiruse suurendamiseks sageli toimuda paralleelselt.

Tavaliselt genereerivad kompilaatorid masinkoodi objektifailidesse, mis on siis seotud koos linkerprogrammi poolt.