Digitale computere forstår ikke de sprog, som mennesker taler. I stedet bruger de et binært sprog kaldet maskinkode eller maskinsprog. maskinkode består af en sekvens af simple computerinstruktioner, hvor hver instruktion er udtrykt som en række binære cifre eller bits (dvs. 1’er og 0’er). Forskellige computere “taler” eller “forstår” typisk forskellige maskinsprog. F.eks. kan en computer repræsentere ADD-operationen som 10011111, mens en anden computer kan repræsentere de samme operationer som 000110. Ikke alene er bitmønstrene typisk forskellige fra den ene type computer til den anden, men selv antallet af bits, der bruges til at repræsentere en operation, kan være forskelligt.

Dertil kommer, at når et program kører, fungerer operativsystemet (f.eks. Windows, Linux, OS X osv.) som et værtsmiljø, der leverer tjenester til programmet, herunder væsentlig støtte som f.eks. adgang til tastatur, skærm og harddiske. Desværre er det også forskelligt fra styresystem til styresystem, hvordan programmet får adgang til disse tjenester. Som følge af forskellene mellem maskinsprog og operativsystemkrav er programmer, der er skrevet i maskinsprog, mere fokuseret på det system, der kører programmet, end på, hvordan programmet løser et problem. Endvidere betyder det også, at det ikke er muligt at flytte maskinkode mellem forskellige computere uden at stille en eller anden form for oversættelsestjeneste til rådighed – normalt i form af en virtuel maskine.

At skrive programmer i maskinsprog er langsomt, besværligt og fejlbehæftet. Løsningen var at udvikle programmeringssprog på højere niveau, der fokuserede mere på problemet og mindre på det system (hardwaren og operativsystemet), der kører programmet (se figur 2). Men computere udfører typisk ikke programmer, der er skrevet i højniveausprog, så der må være en måde at oversætte et program, der er skrevet i et højniveausprog, til maskinsprog på. To typer computerprogrammer udfører den nødvendige oversættelse: compilere og fortolkere.

En compiler er et program, der oversætter andre programmer skrevet i et programmeringssprog på højt niveau som C eller C++ til maskinkode eller maskinsprog.

Andre sprog som Java og C# tager en anden vej: Programmer, der er skrevet i disse sprog, kompileres til en mellemliggende repræsentation (en repræsentation, der ligger et sted mellem højniveausprog og maskinsprog), som ofte kaldes virtuel maskinkode. Den virtuelle maskinkode bliver derefter input til et andet program, der kaldes en fortolker eller en virtuel maskine (VM, et program, der simulerer en hardware-CPU). Nogle sprog, f.eks. Javascript og Perl, er fuldstændig fortolkede, dvs. de kompileres ikke, men fortolkes direkte.

En illustration, der viser en compiler, der læser en C++-kildekodefil, oversætter C++-koden til maskinkode og skriver maskinkoden ud til en eksekverbar fil.
Oversættelse eller konvertering af et program skrevet i et kompileret sprog til maskinkode. Compileren læser C++-kildekoden fra en fil, der slutter med .cpp, og producerer en maskinkodefil, der er eksekverbar. På Windows-computere slutter de eksekverbare filer, der produceres af C++-kompileren, med .exe; andre styresystemer følger andre navngivningskonventioner. Operativsystemer er i stand til at køre eksekverbare filer uden yderligere behandling.
En illustration af en compiler, der læser en Java-kildekodefil og oversætter Java-koden til virtuel maskinkode, som gemmes i en ny fil. Den virtuelle maskine, et andet program, læser den virtuelle maskinkode fra den nye fil og fortolker den for at udføre de operationer, der er angivet i den virtuelle maskinkode.
Kompilering og kørsel af et program, der er skrevet i et sprog, der producerer virtuel maskinkode. Sprog som Java og C# kompileres først til virtuel maskinkode, dvs. til en maskinkode til en virtuel computer – en computer, der ikke eksisterer i virkeligheden. Når kildekoden er kompileret, udfører et program, der kaldes en virtuel maskine (VM), koden ved at simulere en rigtig computers handlinger. Operativsystemet kører VM’en.
Billedet illisterer en Javascript-kildekodefil, der bliver læst og behandlet af en fortolker.
Kørsel af et program, der er skrevet i et rent fortolket sprog. Sprog som Javascript og Perl er slet ikke kompileret. Et program kaldet en fortolker læser kildekodefilen et udsagn ad gangen og udfører eller fortolker hvert udsagn, efterhånden som det læses, uden at oversætte det til et andet sprog. Javascript-fortolkeren er indbygget i de fleste webbrowsere, som styresystemet kører. For andre fortolkede sprog kører operativsystemet fortolkeren som et applikationsprogram.

Hver tilgang til at køre et program, der er skrevet i et programmeringssprog på højt niveau, har fordele og ulemper. Programmer, der er skrevet i fuldt kompilerede sprog (f.eks. C og C++), udføres hurtigere end programmer, der er skrevet i delvist kompilerede sprog (f.eks. Java og C#), og de udføres meget hurtigere end programmer, der er skrevet i fuldt fortolkede sprog (f.eks. Javascript og Perl). For at give et indtryk af forskellen i ydeevne kan vi sige, at et C++-program, når det er kompileret, udføres på tid 1,0. Et tilsvarende program, der er skrevet i et sprog, som er kompileret og derefter fortolket, vil generelt køre på en tid på 3 til 10. Det samme program, der udføres som et rent fortolket sprog, vil køre i en tid på omkring 100. Moderne implementeringer af Java og C# VM’er anvender en Just in Time (JIT)-fortolker, der kompilerer noget af den virtuelle kode til maskinkode, mens den behandles. JIT-processorer reducerer køretiden til ca. 1,5 gange så lang som for rent kompilerede sprogsystemer. Programmeringssproget Python er lidt anderledes: Hovedparten af et Python-program er fortolket, men er relativt lille og har derfor minimal indvirkning på den samlede køretid. De fleste af Python-bibliotekerne, hvor programmet bruger det meste af sin tid, er skrevet i C, så Python-programmer kører næsten lige så hurtigt som et tilsvarende C-program.

På den anden side kan de eksekverbare programmer, der produceres af en ren compiler, ikke overføres mellem forskellige platforme (man kan f.eks. ikke køre et Windows-program på en Apple-computer), mens programmer, der er skrevet i fortolkede sprog, lettere kan flyttes mellem forskellige computere. Denne portabilitet opnås ved at stille en VM eller fortolker til rådighed for hver platform (hardware- og operativsystemkombination). Fortolkere og VM’er er programmer, der er skrevet i rent kompilerede sprog, så de er ikke bærbare, men det er de programmer, de behandler, derimod.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.