Digitala datorer förstår inte de språk som människor talar. I stället använder de ett binärt språk som kallas maskinkod eller maskinspråk. maskinkod består av en sekvens av enkla datorinstruktioner där varje instruktion uttrycks som en sträng av binära siffror eller bitar (dvs. 1:or och 0:or). Olika datorer ”talar” eller ”förstår” typiskt sett olika maskinspråk. Till exempel kan en dator representera ADD-operationen som 10011111
medan en annan dator kan representera samma operation som 000110
. Det är inte bara bitmönstren som skiljer sig åt mellan olika typer av datorer, utan även antalet bitar som används för att representera en operation kan skilja sig åt.
När ett program körs fungerar operativsystemet (t.ex. Windows, Linux, OS X osv.) som en värdmiljö som tillhandahåller tjänster till programmet, bl.a. viktigt stöd som tillgång till tangentbord, skärm och hårddiskar. Tyvärr skiljer sig också hur programmet får tillgång till dessa tjänster från ett operativsystem till ett annat. Som ett resultat av skillnaderna mellan maskinspråk och krav på operativsystem är program som skrivs på maskinspråk mer inriktade på det system som kör programmet än på hur programmet löser ett problem. Vidare innebär det också att det inte är möjligt att flytta maskinkod mellan olika datorer utan att tillhandahålla någon form av översättningstjänst – vanligen i form av en virtuell maskin.
Att skriva program i maskinspråk är långsamt, omständligt och felbenäget. Lösningen var att utveckla programmeringsspråk på högre nivå som fokuserade mer på problemet och mindre på systemet (maskinvaran och operativsystemet) som körde programmet (se figur 2). Men datorer utför vanligtvis inte program som är skrivna i högnivåspråk, så det måste finnas något sätt att översätta ett program som är skrivet i ett högnivåspråk till maskinspråk. Två typer av datorprogram utför den nödvändiga översättningen: kompilatorer och tolkar.
En kompilator är ett program som översätter andra program som är skrivna i ett högnivåprogrammeringsspråk som C eller C++ till maskinkod eller maskinspråk.
Andra språk, till exempel Java och C#, tar en annan väg: Program som skrivs i dessa språk kompileras till en mellanliggande representation (en representation som ligger någonstans mellan högnivåspråket och maskinspråket) som ofta kallas virtuell maskinkod. Den virtuella maskinkoden blir sedan indata till ett annat program som kallas tolk eller virtuell maskin (VM, ett program som simulerar en hårdvaruprocessor). Vissa språk, till exempel Javascript och Perl, är helt tolkade, det vill säga de kompileras inte utan tolkas direkt.
Varje tillvägagångssätt för att köra ett program skrivet i ett högnivåprogrammeringsspråk har för- och nackdelar. Program som är skrivna i helt kompilerade språk (t.ex. C och C++) exekveras snabbare än program som är skrivna i delvis kompilerade språk (t.ex. Java och C#) och exekveras mycket snabbare än program som är skrivna i helt tolkade språk (t.ex. Javascript och Perl). För att ge en uppfattning om skillnaden i prestanda, låt oss säga att ett C++-program, när det har kompilerats, exekveras på tid 1,0. Ett motsvarande program som skrivs i ett språk som kompileras och sedan tolkas körs i allmänhet på tiden 3 till 10. Samma program som exekveras som ett rent tolkat språk kommer att köras i en tid på cirka 100. Moderna implementeringar av virtuella maskiner i Java och C# använder en JIT-tolkare (Just in Time) som kompilerar en del av den virtuella koden till maskinkod samtidigt som den bearbetas. JIT-processorer minskar körtiden till ungefär 1,5 gånger den för rent kompilerade språksystem. Programmeringsspråket Python är lite annorlunda: huvuddelen av ett Pythonprogram är tolkad men är relativt liten och har därför minimal inverkan på den totala körtiden. De flesta av Pythonbiblioteken, där programmet tillbringar den största delen av sin tid, är skrivna i C, så Pythonprogrammen körs nästan lika snabbt som ett motsvarande C-program.
Å andra sidan kan de exekverbara program som produceras av en ren kompilator inte överföras mellan olika plattformar (man kan t.ex. inte köra ett Windows-program på en Apple-dator), medan program som är skrivna i tolkade språk är lättare att flytta mellan olika datorer. Denna portabilitet uppnås genom att tillhandahålla en virtuell dator eller tolk för varje plattform (kombination av maskinvara och operativsystem). Tolkar och virtuella maskiner är program som är skrivna i rent kompilerade språk, så de är inte portabla, men de program som de behandlar är det.