Narzędzia programistyczne służące do tłumaczenia kodu źródłowego do postaci zrozumiałej dla komputera dzielą się na dwie grupy. Pierwsza z nich to interpretery. Moduły tego typu wchodzą na przykład w skład Basica i innych prostych języków programowania przeznaczonych dla początkujących programistów.
Interpreter zamienia tekst źródłowy napisanego programu wiersz po wierszu w kod maszynowy. Z jednej strony oznacza to duże ułatwienie podczas pisania programu - nie musi być ukończony, aby można go było wystartować.
Dzięki temu na bieżąco możemy kontrolować efekty pracy. Z drugiej jednak strony do uruchamiania programów niezbędne jest wcześniejsze załadowanie do pamięci środowiska programistycznego, w którym dany program został napisany. Powód jest prosty: w przypadku języków używających interpretera program jest wykonywany tylko na bieżąco, ponieważ nie jest możliwe utworzenie uruchomieniowego pliku z rozszerzeniem EXE czy tez kiedyś COM. W trakcie pisania dobrze od czasu do czasu uruchomić go, aby sprawdzić, czy nie zawiera błędów. Kiedy interpreter napotka błąd, przerywa wykonywanie programu w miejscu, w którym wystąpił i wyświetla odpowiedni komunikat.
Programiści używają języków programowania, w których do tłumaczenia kodu źródłowego do postaci gotowego programu wykorzystywany jest tak zwany kompilator.
Jest to specjalne narzędzie, które nie zamienia napisanego programu wiersz po wierszu, lecz najpierw sprawdza wszystkie funkcje, instrukcje i zmienne, czy nie występują w nich błędy, a następnie zamienia całość w wykonywalny moduł EXE.
W rezultacie na dysku zostaje zapisany plik stanowiący gotowy program. Do jego uruchamiania nie potrzebujemy otoczenia programistycznego, w którym został napisany. Możemy go skopiować na dyskietkę i po przeniesieniu wystartować na przykład na komputerze znajomego. Najlepiej otworzyć okno Eksploratora i dwukrotnie kliknąć dany plik myszą.
Jest to możliwe dzięki temu, że kompilator zawiera w końcowym pliku wszystkie zasoby niezbędne do jego uruchomienia. Program otrzymany w ten sposób jest znacznie szybszy niż tłumaczony przez interpreter. Jeżeli jednak utracimy w jakiś sposób jego kod źródłowy, praktycznie nie będzie możliwe poddanie go dalszym modyfikacjom.