Digitální počítače nerozumějí jazykům, kterými mluví lidé. Místo toho používají binární jazyk nazývaný strojový kód nebo strojový jazyk. strojový kód se skládá z posloupnosti jednoduchých počítačových instrukcí, přičemž každá instrukce je vyjádřena jako řetězec binárních číslic nebo bitů (tj. jedniček a nul). Různé počítače obvykle „mluví“ nebo „rozumí“ různým strojovým jazykům. Například jeden počítač může operaci ADD reprezentovat jako 10011111
, zatímco jiný může tytéž operace reprezentovat jako 000110
. Nejenže se bitové vzory obvykle liší od jednoho druhu počítače k druhému, ale dokonce i počet bitů použitých k reprezentaci operace se může lišit.
Při spuštění programu navíc operační systém (např. Windows, Linux, OS X atd.) funguje jako hostitelské prostředí, které programu poskytuje služby. tyto služby zahrnují základní podporu, jako je přístup ke klávesnici, obrazovce a pevným diskům. Bohužel způsob, jakým program k těmto službám přistupuje, se v jednotlivých operačních systémech liší. V důsledku rozdílů mezi strojovými jazyky a požadavky operačních systémů se programy napsané ve strojovém jazyce více zaměřují na systém, ve kterém program běží, než na to, jak program řeší problém. Navíc to také znamená, že není možné přenášet strojový kód mezi různými počítači bez poskytnutí nějaké překladatelské služby – obvykle v podobě virtuálního stroje.
Psaní programů ve strojovém jazyce je pomalé, zdlouhavé a náchylné k chybám. Řešením bylo vyvinout programovací jazyky vyšší úrovně, které se více soustředily na problém a méně na systém (hardware a operační systém), na kterém program běží (viz obrázek 2). Počítače však obvykle neprovádějí programy napsané v jazycích vyšší úrovně, takže musí existovat nějaký způsob, jak program napsaný v jazyce vyšší úrovně převést do strojového jazyka. Potřebný překlad provádějí dva druhy počítačových programů: překladače a interprety.
Překladač je program, který překládá jiné programy napsané ve vysokoúrovňovém programovacím jazyce, jako je C nebo C++, do strojového kódu nebo strojového jazyka. jiné jazyky, jako je Java a C#, jdou jinou cestou: Programy napsané v těchto jazycích se kompilují do mezilehlé reprezentace (reprezentace, která leží někde mezi jazykem vysoké úrovně a strojovým jazykem), která se často nazývá virtuální strojový kód. Kód virtuálního stroje se pak stává vstupem pro jiný program nazývaný interpret nebo virtuální stroj (VM, program, který simuluje hardwarový procesor). Některé jazyky, například Javascript a Perl, jsou zcela interpretované, to znamená, že se nekompilují, ale přímo interpretují.
Každý přístup ke spouštění programu napsaného ve vysokoúrovňovém programovacím jazyce má své výhody a nevýhody. Programy napsané v plně kompilovaných jazycích (např. C a C++) se spouštějí rychleji než programy napsané v částečně kompilovaných jazycích (např. Java a C#) a spouštějí se mnohem rychleji než programy napsané v plně interpretovaných jazycích (např. Javascript a Perl). Pro představu o rozdílu ve výkonu řekněme, že program v jazyce C++ se po zkompilování vykoná za čas 1,0 min. Ekvivalentní program napsaný v jazyce, který je zkompilován a následně interpretován, se zpravidla spustí v čase 3 až 10. Stejný program spuštěný jako čistě interpretovaný jazyk poběží v čase kolem 100. Současné implementace virtuálních strojů Java a C# používají interpreter JIT (just in time), který část virtuálního kódu kompiluje do strojového kódu během jeho zpracování. Procesory JIT zkracují dobu běhu přibližně na 1,5násobek doby běhu čistě kompilovaných jazykových systémů. Programovací jazyk Python je trochu jiný: hlavní část programu v jazyce Python je interpretovaná, ale je relativně malá, a tak má minimální vliv na celkovou dobu běhu. Většina knihoven jazyka Python, v nichž program tráví většinu času, je napsána v jazyce C, takže programy v jazyce Python běží téměř stejně rychle jako ekvivalentní program v jazyce C.
Na druhou stranu spustitelné programy vytvořené čistě kompilátorem nelze přenášet mezi různými platformami (např. program pro Windows nelze spustit na počítači Apple), zatímco programy napsané v interpretovaných jazycích lze mezi různými počítači přenášet snadněji. Této přenositelnosti je dosaženo tím, že pro každou platformu (kombinaci hardwaru a operačního systému) je k dispozici virtuální počítač nebo interpret. Interpretery a virtuální počítače jsou programy napsané v čistě kompilovaných jazycích, takže nejsou přenositelné, ale programy, které zpracovávají, ano.