Hvad er en compiler?

En compiler er et stykke software, der oversætter fra et stykke kode skrevet i ét sprog (source language) til et andet (target language).

Figur 3.1 (36 kb)
Figur 3-1: Blok diagram for en compiler

Source language: Det sprog man arbejder med, fx et programmeringssprog som C++ eller Pascal. Dette sprog kan sjældent "forstås" af computeren. I vores tilfælde, skal der oversættes fra sproget Svendsk.

Target language: Det sprog man oversætter til, fx. maskinkode eller assembler. I vores tilfælde bliver der oversat til Java-kode (som derefter skal fortolkes).

Derudover bliver der under oversættelsen produceret diverse errors og warnings. Errors ved fejl og Warnings ved tvetydigheder, dvs. steder hvor source-koden kan betyde to forskellige ting ifølge grammatikken. Hvis det er direkte fejl, dvs. hvis koden ikke giver nogen mening inden for grammatikken, bliver koden ikke oversat. Dette ville ikke give nogen mening, da koden alligevel ikke kan eksekveres. De fleste compilere fortsætter dog oversættelsen, for at se efter andre errors/warnings.

De mest almindelige compilere oversætter til maskinkode eller assembler, og bruges for at lette programmørens opgave. Ydermere nedsættes fejl-procenten, da abstraktions-niveauet bliver højere. Nutildags er det yderst sjældent man programmerer i direkte maskinkode.


Historie

Da maskinerne og programmerne blev større, blev de sidstnævnte så komplicerede, at de blev for svære at skrive som binære filer. Derfor valgte man at lægge et niveau over maskinlaget, nemlig maskinkoden. Med dette skridt abstraherede man væk fra maskinens binære opbygning. Derefter kom assembler, som lå på et endnu højere abstraktionsniveau, og i dag har vi højniveau-sprogene, der ligger abstraktionsmæssigt langt fra computerens binære et og nul.

I starten var maskinerne meget betydende for sprogenes opbygning, da de ofte var designet til en bestemt maskine. Dette kunne så give visse begrænsninger for hvad sproget accepterede, fx mht. max dimensioner på et array.

Efterhånden begyndte man at lave sprogene uden at tænke på en bestemt maskine. Man kan sige at sprogene blev mere frigjort fra én bestemt maskine, og det blev nu compilerens opgave at få sprog og maskine til at hænge sammen.


Struktur for compiler

En compiler består af en front end og en back end.

Front end sørger for selve analysen af source koden, mht om den er fejlfri og utvetydig. Hvis dette ikke er tilfældet genereres der errors/warnings. Front end består af tre trin:

Back end genererer compilerens kode-output, og består af yderligere to trin:

Det sidste har vi dog ikke med i vores compiler, hvorfor forklares i kodegenereringen.

Figur 3.2 (54 kb)
Figur 3-2: Struktur for compiler

Læs desuden nærmere om de enkelte dele af compileren, i de respektive afsnit.