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.

En illustration som visar en kompilator som läser en C++-källkodsfil, översätter C++-koden till maskinkod och skriver ut maskinkoden till en körbar fil.
Översättning eller konvertering av ett program skrivet i ett kompilerat språk till maskinkod. Kompilatorn läser C++-källkoden från en fil som slutar med .cpp och producerar en maskinkodfil som är exekverbar. På Windows-datorer slutar körbara filer som produceras av C++-kompilatorn med .exe; andra operativsystem följer andra namnkonventioner. Operativsystemen kan köra körbara filer utan ytterligare bearbetning.
En illustration av en kompilator som läser en Javakällkodsfil och översätter Javakoden till virtuell maskinkod, som sparas i en ny fil. Den virtuella maskinen, ett annat program, läser den virtuella maskinkoden från den nya filen och tolkar den för att utföra de operationer som anges i den virtuella maskinkoden.
Kompilera och köra ett program som är skrivet i ett språk som producerar virtuell maskinkod. Språk som Java och C# kompileras först till virtuell maskinkod, det vill säga till en maskinkod för en virtuell dator – en dator som egentligen inte existerar. När källkoden har kompilerats utför ett program som kallas virtuell maskin (VM) koden genom att simulera en riktig dators handlingar. Operativsystemet kör den virtuella maskinen.
Bilden illustrerar en Javascript-källkodsfil som läses och bearbetas av en tolk.
Körning av ett program som är skrivet i ett rent tolkat språk. Språk som Javascript och Perl kompileras inte alls. Ett program som kallas tolk läser källkodsfilen ett uttalande i taget och utför eller tolkar varje uttalande som det läses utan att översätta det till något annat språk. Javascript-tolken är inbyggd i de flesta webbläsare som operativsystemet kör. För andra tolkade språk kör operativsystemet tolken som ett tillämpningsprogram.

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.

Lämna ett svar

Din e-postadress kommer inte publiceras.