Hvad er en kodekompilator, og hvad gør den?

EN compiler er en program der oversætter menneskeligt læsbar kildekode til computer-eksekverbar maskinkode. For at gøre dette med succes skal den menneskelige læselige kode være i overensstemmelse med syntaks regler for hvilket programmeringssprog det er skrevet på. Kompilatoren er kun et program og kan ikke rette din kode til dig. Hvis du laver en fejl, skal du rette syntaksen, ellers bliver den ikke kompileret.

Hvad sker der, når du udarbejder kode?

En kompilators kompleksitet afhænger af syntaks for sproget og hvor meget abstraktion det programmeringssprog giver. En C-kompilator er meget enklere end en kompilator til C ++ eller C #.

Leksikalsk analyse

Ved kompilering læser kompilatoren først en strøm af tegn fra en kildekodefil og genererer en strøm af leksikale tokens. For eksempel C ++ -koden:

int C = (A * B) +10;

kan blive analyseret som disse symboler:

  • skriv "int"
  • variabel "C"
  • lige med
  • leftbracket
  • variabel "A"
  • gange
  • variabel "B"
  • rightbracket
  • plus
  • bogstavelig "10"

Syntaktisk analyse

Den leksikale output går til den syntaktiske analysatordel af kompilatoren, der bruger grammatiske regler til at beslutte, om input er gyldigt eller ej. Med mindre

instagram viewer
variabler A og B var tidligere erklæret og var i omfang, kompilatoren kunne sige:

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

Hvis de blev erklæret, men ikke initialiseret. kompilatoren udsender en advarsel:

  • lokal variabel 'A' brugt uden at blive initialiseret.

Du skal aldrig ignorere kompilatoradvarsler. De kan bryde din kode på underlige og uventede måder. Fix altid compileradvarsler.

Et pas eller to?

Nogle programmeringssprog er skrevet, så en compiler kan læse kildekoden kun en gang og generere maskinkoden. Pascal er et sådant sprog. Mange compilere kræver mindst to pas. Nogle gange skyldes det fremsendte erklæringer af funktioner eller klasser.

I C ++ kan en klasse erklæres, men først defineres. Kompilatoren er ikke i stand til at finde ud af, hvor meget hukommelse klassen har brug for, indtil den samler klassen. Den skal genlæse kildekoden, før den genererer den rigtige maskinkode.

Generering af maskinkode

Hvis man antager, at kompilatoren med succes afslutter de leksikale og syntaktiske analyser, genererer det sidste trin maskinkode. Dette er en kompliceret proces, især med moderne CPU'er.

Hastigheden på den kompilerede eksekverbar kode skal være så hurtig som muligt og kan variere enormt afhængigt af kvaliteten af ​​den genererede kode og hvor meget optimering der blev anmodet om.

De fleste compilere lader dig angive mængden af ​​optimering - typisk kendt for hurtig debugging-kompileringer og fuld optimering af den frigivne kode.

Kodegenerering er udfordrende

Kompilatorforfatteren står over for udfordringer, når man skriver en kodegenerator. Mange processorer fremskynder behandlingen ved hjælp af

  • Rørledning i instruktion
  • Indre caches.

Hvis alle instruktioner inden for en kode loop kan afholdes i CPU cache, kører løkken så meget hurtigere end når CPU'en skal hente instruktioner fra hoved RAM. CPU-cachen er en hukommelsesblok, der er indbygget i CPU-chippen, hvor der er adgang hurtigere end data i hoved RAM.

Cacher og køer

De fleste CPU'er har en forudgående hentningskø, hvor CPU'en læser instruktioner i cachen, inden de udføres. Hvis der sker en betinget gren, skal CPU'en genindlæse køen. Koden skal genereres for at minimere dette.

Mange CPU'er har separate dele til:

  • Heltalsaritmetik (hele tal)
  • Flydende aritmetisk (fraktionstal)

Disse operationer kan ofte køre parallelt for at øge hastigheden.

Kompilatorer genererer typisk maskinkode til objektfiler, der er knyttet sammen af ​​et linker-program.

instagram story viewer