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.
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.