En kompilator er et dataprogram som oversetter en serie instruksjoner skrevet på et bestemt programmeringsspråk ( kildekode ) til instruksjoner på et annet språk ( objektkode ) : oversettelsesprosessen kalles kompilering mens den omvendte aktiviteten - det vil si går fra objektkode til kildekode - kalles dekompilering og gjøres ved hjelp av en dekompilator .
Hvis alle kompilatorer holdt seg nøyaktig til språkspesifikasjonen , kunne det samme programmet kompileres uendret av hver kompilator, og produsere semantisk de samme resultatene, dvs. programmer som produserer det samme resultatet når de blir utsatt for de samme inngangsdataene . I virkeligheten implementerer mange kompilatorer språket ufullstendig eller legger til proprietære utvidelser, og skaper dermed dialekter av hovedspråket. For språk som tar i bruk en standard i symboldekorasjon , kan objektkode generert av forskjellige kompilatorer kobles sammen i en enkelt kjørbar fil.
Fra og med 1950 ble flere eksperimentelle kompilatorer utviklet (inkludert Grace Hoppers A - 0 System ), men i 1957 var Fortran -teamet ved IBM , ledet av John Backus , det første som bygde en komplett kompilator mens COBOL i 1960 var et av de første språkene som ble kompilert på flere arkitekturer . [1]
Ideen om kompilering slo raskt fast og mange av kompilatorens designprinsipper ble utviklet på 1960-tallet. En kompilator er i seg selv et program skrevet på et eller annet språk, og den første av dem ble skrevet i Assembly . Den første selvkompilerte kompilatoren, i stand til å kompilere sin egen kode, ble laget for Lisp -språket av Hart og Levin ved MIT i 1962 . [2] Bruken av høynivåspråk for å skrive kompilatorer akselererte på begynnelsen av 1970-tallet da Pascal- og C -språkene ble brukt til å skrive kompilatorer for seg selv: det vil si for eksempel kompilatorer for C skrevet i sin tur i C.
Når et programmeringsspråk defineres for første gang, oppstår problemet med hvordan man lager kompilatoren. I dette tilfellet er det to mulige tilnærminger:
Kompilatoren tar inn et program , kildekoden, som den utfører en rekke operasjoner på for å oppnå, i fravær av feil , objektkoden. Generelt er kompilatorer i stand til å gjenkjenne noen klasser av feil som finnes i programmet, og i noen tilfeller foreslå hvordan de kan rettes opp.
Gjeldende kompilatorer deler kompileringsoperasjonen inn i to hovedtrinn, frontenden og bakenden . I frontend -stadiet oversetter kompilatoren kilden til et mellomspråk (vanligvis internt i kompilatoren); i det bakre sluttstadiet skjer genereringen av objektkoden.
Dette stadiet er delt inn i flere faser:
Baksluttstadiet er også delt inn i flere faser:
Strømme | Aktiviteter |
---|---|
Kildekode | Redigering |
Leksikalsk analysator | Leksikalsk analyse |
Token | |
Parser | Syntaktisk analyse |
Syntakstre | |
Semantisk analysator | Semantisk analyse |
Abstrakt syntakstre | |
Mellomkodegenerator | |
mellomkode | |
Intermediate Code Optimizer | |
mellomkode | |
Målkodegenerator | |
målkode |