Vad är en kodkompilerare och vad gör den?

EN kompilator är en program som översätter mänsklig läsbar källkod till datorkörbar maskinkod. För att göra detta framgångsrikt måste den mänskliga läsbara koden följa syntax regler för vilket programmeringsspråk det är skrivet på. Kompilatorn är bara ett program och kan inte fixa din kod för dig. Om du gör ett misstag måste du korrigera syntaxen, annars kommer den inte att kompilera.

Vad händer när du sammanställer kod?

En kompilators komplexitet beror på språkets syntax och hur mycket abstraktion det programmeringsspråket ger. En C-kompilator är mycket enklare än en kompilator för C ++ eller C #.

Lexikalisk analys

Vid sammanställning läser kompilatorn först en ström av tecken från en källkodfil och genererar en ström av lexikala token. Till exempel C ++ -koden:

int C = (A * B) +10;

kan analyseras som dessa symboler:

  • skriv "int"
  • variabel "C"
  • jämlikar
  • leftbracket
  • variabel "A"
  • gånger
  • variabel "B"
  • rightbracket
  • plus
  • bokstavlig "10"

Syntaktisk analys

Den leksikala utgången går till den syntaktiska analysatordelen av kompilatorn, som använder grammatikreglerna för att avgöra om ingången är giltig eller inte. Såvida inte

instagram viewer
variabler A och B har tidigare deklarerats och var inom räckvidd, kompilatorn kan säga:

  • 'A': odeklarerad identifierare.

Om de deklarerades men inte initialiserades. kompilatorn ger en varning:

  • lokal variabel 'A' används utan att initialiseras.

Du bör aldrig ignorera kompilatorvarningar. De kan bryta din kod på konstiga och oväntade sätt. Fixa alltid kompilatorvarningar.

Ett pass eller två?

Vissa programmeringsspråk är skrivna så att en kompilator kan läsa källkoden bara en gång och generera maskinkoden. Pascal är ett sådant språk. Många kompilatorer kräver minst två pass. Ibland beror det på framtida förklaringar av funktioner eller klasser.

I C ++ kan en klass deklareras men inte definieras förrän senare. Kompilatorn kan inte räkna ut hur mycket minne klassen behöver förrän den sammanställer klassen. Den måste läsa om källkoden innan den skapar rätt maskinkod.

Generera maskinkod

Förutsatt att kompilatorn framgångsrikt slutför de leksikala och syntaktiska analyserna, genererar det sista steget maskinkod. Detta är en komplicerad process, särskilt med moderna CPU: er.

Kompilatorns hastighet exekverbar koden ska vara så snabb som möjligt och kan variera enormt beroende på kvaliteten på den genererade koden och hur mycket optimering som begärdes.

De flesta kompilatorer låter dig ange mängden optimering - vanligtvis känd för snabb felsökningskompileringar och full optimering för den släppta koden.

Kodgenerering är utmanande

Kompilatorförfattaren står inför utmaningar när man skriver en kodgenerator. Många processorer påskyndar behandlingen med hjälp av

  • Instruktioner rörledning
  • Inre cachar.

Om alla instruktioner i en kod slinga kan hållas i CPU cache, då går den slingan mycket snabbare än när CPU måste hämta instruktioner från huvud RAM. CPU-cachen är ett minnesblock inbyggt i CPU-chipet som åtkomst mycket snabbare än data i huvud RAM.

Cachar och köer

De flesta CPU: er har en förhämtningskö där CPU: n läser instruktioner i cachen innan de körs. Om en villkorad gren inträffar måste CPU ladda om kön. Koden bör genereras för att minimera detta.

Många processorer har separata delar för:

  • Heltalsaritmetik (heltal)
  • Flytande aritmetik (fraktionella tal)

Dessa operationer kan ofta köras parallellt för att öka hastigheten.

Kompilatorer genererar vanligtvis maskinkod i objektfiler som då är länkad tillsammans av ett länkprogram.

instagram story viewer