Komputery cyfrowe nie rozumieją języków, którymi posługują się ludzie. Zamiast tego używają języka binarnego zwanego kodem maszynowym lub językiem maszynowym. Kod maszynowy składa się z sekwencji prostych instrukcji komputerowych, z których każda jest wyrażona jako ciąg cyfr binarnych lub bitów (tj. 1 i 0). Różne komputery typowo „mówią” lub „rozumieją” różne języki maszynowe. Na przykład jeden komputer może reprezentować operację ADD jako 10011111
, podczas gdy inny może reprezentować te same operacje jako 000110
. Nie tylko wzory bitów są zazwyczaj różne w zależności od rodzaju komputera, ale nawet liczba bitów używanych do reprezentowania operacji może być różna.
Ponadto, gdy program jest uruchamiany, system operacyjny (np. Windows, Linux, OS X, itp.) działa jako środowisko hosta, który zapewnia usługi dla programu.Usługi te obejmują podstawowe wsparcie, takie jak dostęp do klawiatury, ekranu i dysków twardych. Niestety, sposób, w jaki program uzyskuje dostęp do tych usług jest również różny w zależności od systemu operacyjnego. W wyniku różnic między językami maszynowymi a wymaganiami systemu operacyjnego, programy napisane w języku maszynowym są bardziej skoncentrowane na systemie, w którym działa program, niż na tym, jak program rozwiązuje problem. Ponadto oznacza to również, że nie jest możliwe przenoszenie kodu maszynowego między różnymi komputerami bez zapewnienia pewnego rodzaju usługi tłumaczenia – zwykle w postaci maszyny wirtualnej.
Pisanie programów w języku maszynowym jest powolne, żmudne i podatne na błędy. Rozwiązaniem było opracowanie języków programowania wyższego poziomu, które skupiały się bardziej na problemie, a mniej na systemie (sprzęcie i systemie operacyjnym), w którym program jest uruchamiany (patrz rys. 2). Jednak komputery zazwyczaj nie wykonują programów napisanych w językach wysokiego poziomu, więc musi istnieć jakiś sposób na przetłumaczenie programu napisanego w języku wysokiego poziomu na język maszynowy. Dwa rodzaje programów komputerowych dokonują niezbędnego tłumaczenia: kompilatory i interpretery.
Kompilator to program, który tłumaczy inne programy napisane w języku programowania wysokiego poziomu, takim jak C lub C++, na kod maszynowy lub język maszynowy.Inne języki, takie jak Java i C#, wybierają inną drogę: Programy napisane w tych językach są kompilowane do reprezentacji pośredniej (reprezentacji, która leży gdzieś pomiędzy językiem wysokiego poziomu a językiem maszynowym), która jest często nazywana kodem maszyny wirtualnej. Kod maszyny wirtualnej staje się następnie wejściem do innego programu zwanego interpreterem lub maszyną wirtualną (VM, program, który symuluje sprzętowy procesor). Niektóre języki, takie jak Javascript i Perl, są całkowicie interpretowane, to znaczy nie są kompilowane, ale interpretowane bezpośrednio.
Każde podejście do uruchamiania programu napisanego w języku programowania wysokiego poziomu ma zalety i wady. Programy napisane w językach w pełni skompilowanych (np. C i C++) wykonują się szybciej niż programy napisane w językach częściowo skompilowanych (np. Java i C#) i wykonują się znacznie szybciej niż programy napisane w językach w pełni interpretowanych (np. Javascript i Perl). Aby zobrazować różnicę w wydajności, powiedzmy, że program napisany w języku C++, po skompilowaniu, wykonuje się w czasie 1.0. Równoważny program napisany w języku, który jest kompilowany, a następnie interpretowany, będzie zazwyczaj wykonywany w czasie od 3 do 10. Ten sam program wykonany w języku czysto interpretowanym będzie działał w czasie około 100. Współczesne implementacje maszyn wirtualnych Java i C# używają interpretera just in time (JIT), który kompiluje część kodu wirtualnego do kodu maszynowego podczas jego przetwarzania. Procesory JIT skracają czas działania do około 1,5 raza w porównaniu z czysto kompilowanymi systemami językowymi. Język programowania Python jest nieco inny: główna część programu w Pythonie jest interpretowana, ale jest stosunkowo niewielka i ma minimalny wpływ na całkowity czas działania. Większość bibliotek Pythona, w których program spędza większość czasu, jest napisana w C, więc programy Pythona działają prawie tak szybko jak równoważne programy C.
Z drugiej strony, programy wykonywalne wyprodukowane przez czysty kompilator nie mogą być przenoszone między różnymi platformami (np. nie można uruchomić programu Windows na komputerze Apple), podczas gdy programy napisane w językach interpretowanych są łatwiej przenoszone między różnymi komputerami. Przenośność ta jest osiągana poprzez dostarczenie VM lub interpretera dla każdej platformy (kombinacji sprzętu i systemu operacyjnego). Interpretery i maszyny wirtualne są programami napisanymi w czysto skompilowanych językach, więc nie są przenośne, ale programy, które przetwarzają, są.
.