Compiler

Fra Wikipedia, den frie encyklopædi
Gå til: navigation, søg

En compiler (også kaldet kompiler eller oversætter) er et program, der oversætter et andet program (kaldet kildekoden) til et tredje program.

Sagt på en anden måde er det typisk et transformationsværktøj for programmører der oversætter/transformerer højniveaukode (der kan skrives, læses og forstås af mennesker) til et lavere niveau som f.eks. det sprog en computer forstår (ultimativt binære instruktionssæt). Det behøver ikke nødvendigvis at være fra høj- til lavniveau men kan også være fra eet højniveausprog til et andet (fra java til XML). En javacompiler (javac) oversætter fra programmeringssproget java til java-bytekode, som kan fortolkes/forstås af en java virtuel maskine (JVM).

Et eksempel på en compiler er en java-compiler, der oversætter java-kildekode til java-bytecode (.class fil), der kan udføres af en java-virtual maskine (som er en form for fortolker). Et andet eksempel kunne være en C-compiler, der oversætter C-kildekode til en binær fil, der kan udføres direkte.

Indholdsfortegnelse

[redigér] Teknikken

En compiler oversætter typisk fra kildekode, der kan læses af et menneske, til et binært format, der kun kan læses af andre programmer. En compiler indeholder typisk kontrol af fejl i kildekoden og optimering mht. udførelsestid og lagerforbrug af den resulterende kode. Derfor kan det resulterende binæreprogram typisk udføres hurtigere og med mindre brug af plads. Dette er i modsætning til en fortolker der udføre kildekoden direkte, linje for linje, og derfor ikke kan udføre programmet så hurtigt som hvis det var compileret.

En anden fordel ved at compilere er at man kan nøjes med at give den binære version af programmet til andre så de kun kan udføre programmet, men ikke umiddelbart kan rette i programmet.

Til nogle programmeringssprog, som f.eks. BASIC, findes både compiler og fortolker. Når man udvikler i den slags sprog bruger man typisk en fortolker, mens programmet udvikles (debugger/fejlfinder), og en compiler, når resultatet skal afleveres til kunden.

I C-programmering compilerer man typisk til at binært format der kaldes mellemkode. Det er "byggeklodser" der kan sættes sammen med andre stumper af mellemkode til et endeligt udførbart binært program. Til at konvertere mellemkoden til det endelige program bruges et værktøj der hedder en linker.

En decompiler er en compiler, der ud fra resulterende kode forsøger at genskabe kildekoden.

En compiler, der er beregnet til at køre på én computertype, men som leverer maskinkode beregnet til kørsel på en anden type computer, omtales som en krydsoversætter, (engelsk: cross compiler).

[redigér] Oversættelsesprocessen

Oversættelsen foregår i flere trin.

  • Der kan være en præ-proces, der udvider makroer
  • Kommentarer fjernes fra kildekoden.
  • Der foretages en leksikalsk analyse, der resulterer i en liste af symboler, som kan genkendes af oversætteren.

Eksempelvis gøres en samlet tekststreng:

'abekat=abe+kat;'

til nu delt i flere tekststrenge og evt. i hvert sit objekt:

'abekat', '=', 'abe', '+', 'kat', ';'

Processen håndterer også, at programmeringssprog som C og Java eksempelvis både bruger '+', '++', '+=', '=' og '=='.

  • Der opbygges et parsetræ (Proces: Syntaktisk analyse), ud fra programmeringssprogets grammatik.
  • Der udføres en semantisk analyse, der eksempelvis kan afsløre om variabler, der bliver brugt også er defineret korrekt.
  • Eventuel optimering ved beskæring eller andre transformationsændringer af parsetræet.
  • Generering af assemblerkode ud fra data i parsetræet.

Der dannes en fil med output for hver fil med kildekode, der kan udføres. Kildefiler, der kun indeholder definitioner af konstanter og variabler resulterer ikke i en outputfil.

Kasserne er delprocesserne i oversættelsen. (pt fransk)

Resultatet af oversættelsen skal behandles af en en assembler og siden en linker før der er kommet et færdigt program ud af det.

[redigér] Eksempel på oversættelse - Hello.java

Herunder følger et eksempel på oversættelse af java programmet Hello.java.

public class Hello{
        public static void main(String[] args){
                for(int i=0; i<10; i++)
                        System.out.println("Hallo");
        }
}

Med javac oversættes Hello.java til en såkaldt class-fil, der indeholder det oversatte program i såkaldt bytecode. Denne kode er instruktioner til en java-maskine (evt. en virtuel java-maskine, JVM).

Delen public class Hello extends java.lang.Object{ public Hello(); bliver eksempelvis til...

0:   aload_0
1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
4:   return

... og main-metoden bliver til...

0:   iconst_0
1:   istore_1
2:   iload_1
3:   bipush  10
5:   if_icmpge       22
8:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;
11:  ldc     #3; //String Hallo
13:  invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
16:  iinc    1, 1
19:  goto    2
22:  return

...hvilket en JVM kan forstå og fortolke!

[redigér] Se også

[redigér] Eksterne henvisninger

[redigér] Open source

[redigér] Hele compilere

[redigér] Compiler værktøjer

[redigér] Sproggrammatikker til compilere

Personlige værktøjer
Navnerum

Varianter
Handlinger
Navigation
Deltagelse
Værktøjer
Organisation
Udskriv/eksportér
Andre sprog