Hva er en kodekompilator, og hva gjør den?

EN kompilatoren er en program som oversetter menneskelig lesbar kildekode til datamaskin-kjørbar maskinkode. For å gjøre dette med hell, må den menneskelige lesbare koden være i samsvar med syntaks regler for hvilket programmeringsspråk det er skrevet på. Kompilatoren er bare et program og kan ikke fikse koden din for deg. Hvis du gjør en feil, må du rette syntaksen, ellers vil den ikke kompilere.

Hva skjer når du sammenstiller kode?

En kompilators kompleksitet avhenger av syntaks for språket og hvor mye abstraksjon det programmeringsspråket gir. En C-kompilator er mye enklere enn en kompilator for C ++ eller C #.

Leksikalsk analyse

Når du sammenstiller, leser kompilatoren først en strøm av tegn fra en kildekodefil og genererer en strøm av leksikalske symboler. For eksempel C ++ -koden:

int C = (A * B) +10;

kan bli analysert som disse symbolene:

  • skriv "int"
  • variabel "C"
  • er lik
  • leftbracket
  • variabel "A"
  • ganger
  • variabel "B"
  • rightbracket
  • Plus
  • bokstavelig "10"

Syntaktisk analyse

Den leksikale utgangen går til den syntaktiske analysatordelen av kompilatoren, som bruker grammatikkreglene for å avgjøre om inngangen er gyldig eller ikke. Med mindre

instagram viewer
variabler A og B ble tidligere erklært og var i omfang, kan kompilatoren si:

  • 'A': ikke-erklært identifikator.

Hvis de ble erklært, men ikke initialisert. kompilatoren gir en advarsel:

  • lokal variabel 'A' brukt uten å bli initialisert.

Du bør aldri ignorere advarsler om kompilatoren. De kan knekke koden din på rare og uventede måter. Fix alltid advarsler om kompilatoren.

Ett pass eller to?

Noen programmeringsspråk er skrevet slik at en kompilator kan lese kildekoden bare en gang og generere maskinkoden. Pascal er et slikt språk. Mange kompilatorer krever minst to pasninger. Noen ganger skyldes det fremtidige erklæringer av funksjoner eller klasser.

I C ++ kan en klasse erklæres, men ikke defineres før senere. Kompilatoren klarer ikke å finne ut hvor mye minne klassen trenger før den sammenstiller kroppen til klassen. Den må lese kildekoden på nytt før den genererer riktig maskinkode.

Genererer maskinkode

Forutsatt at kompilatoren fullfører de leksikale og syntaktiske analysene, genererer sluttfasen maskinkode. Dette er en komplisert prosess, spesielt med moderne CPU-er.

Hastigheten til kompilert kjørbar koden skal være så rask som mulig og kan variere enormt etter kvaliteten på den genererte koden og hvor mye optimalisering som ble bedt om.

De fleste kompilatorer lar deg spesifisere mengden optimalisering - vanligvis kjent for hurtig feilsøkingskompileringer og full optimalisering for den utgitte koden.

Kodegenerering er utfordrende

Kompilatorforfatteren står overfor utfordringer når han skriver en kodegenerator. Mange prosessorer fremskynder behandlingen ved bruk

  • Rørledning i instruksjon
  • Innvendig cacher.

Hvis alle instruksjonene i en kode Løkke kan holdes i prosessor cache, så løper den løkken mye raskere enn når CPU-en må hente instruksjoner fra hoved-RAM-en. CPU-hurtigbufferen er en hukommelsesblokk som er innebygd i CPU-brikken som du får tilgang til mye raskere enn data i hoved RAM.

Buffer og køer

De fleste CPU-er har en forhåndshentet kø der CPU leser instruksjoner i hurtigbufferen før de kjøres. Hvis det skjer en betinget gren, må CPU-en laste inn køen på nytt. Koden bør genereres for å minimere dette.

Mange CPU-er har separate deler for:

  • Heltalsregning (hele tall)
  • Aritmetisk flytende punkt (brøknummer)

Disse operasjonene kan ofte løpe parallelt for å øke hastigheten.

Kompilatorer genererer vanligvis maskinkode til objektfiler som er knyttet sammen av et linker-program.