Compiler
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.
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
- Vejviser: Compilers
[redigér] Open source
[redigér] Hele compilere
- GCC, the GNU Compiler Collection, includes front ends for C, C++, Objective-C, Fortran, Java, and Ada, as well as libraries for these languages (libstdc++, libgcj,...), This file documents the internals of the GNU compilers
[redigér] Compiler værktøjer
- ANTLR Parser Generator, history
- Primært om Bison og Flex:
- Using Flex and Bison by Aaron Montgomery Citat: "...Scanners, Parsers and Abstract Syntax Trees, oh my! What Are Flex and Bison (And, Why Do I Need Them)..."
- Meet lex, yacc, flex, and bison
- Flex and Bison for Metrowerks CodeWarrior
- flex++/bison++ for Win32
- Welcome to BtYacc -- BackTracking Yacc
- Ældre:
- Andet:
- My research centers on parsers and compiler technology for object-oriented languages