Menu
Coddy logo textTech

Co to jest interpreter?

Interpreter to program, który wykonuje kod źródłowy bezpośrednio, realizując jego instrukcje na bieżąco, zamiast najpierw tłumaczyć cały program na osobny plik z kodem maszynowym. Standardowe implementacje Pythona i Ruby to interpretery.

Autor: Kevin Spektor, Współzałożyciel i CTO

Aktualizacja: 24 września 2026

Kod źródłowy
  1. 1print("Hello")
  2. 2total = 2 + 3
  3. 3print(total)
  4. 4print("Done")
Wynik
Przetłumaczone linie0
Uruchomienia0

Każde uruchomienie tłumaczy linie od nowa. Włącz literówkę, a interpreter i tak wyświetli "Hello", zanim dojdzie do linii 3 i się zatrzyma.

Wpisz python3 hello.py, a pojawi się wynik, ale zajrzyj potem do folderu: nie powstał żaden nowy plik z programem. Program, który faktycznie działał, to sam python3, czyli interpreter Pythona. Odczytał hello.py, ustalił, co znaczy każda instrukcja, i ją wykonał. Uruchom skrypt jutro, a interpreter znów przeczyta kod źródłowy od początku.

Jak działa interpreter

Interpreter powtarza jeden cykl, aż program się skończy: weź następną instrukcję, ustal, co znaczy, wykonaj ją, przejdź dalej. Podczas pracy trzyma zmienne programu we własnej pamięci, dlatego total = price * 3 może użyć price ustawionego kilka linii wcześniej.

Najwyraźniej widać to w trybie interaktywnym, nazywanym REPL (read, evaluate, print, loop). Wpisz python3 bez nazwy pliku, a każda linia wykona się w chwili naciśnięcia Enter:

>>> price = 4
>>> price * 3
12

Prawdziwe interpretery dodają krok przygotowawczy. CPython, standardowy interpreter Pythona, najpierw kompiluje cały plik do kodu bajtowego, czyli zwięzłej listy prostych instrukcji, a potem uruchamia pętlę, która wykonuje ten kod bajtowy instrukcja po instrukcji. Możesz wyświetlić kod bajtowy jednej linii:

Python 3.12 wyświetla poniższy wynik (inne wersje różnią się szczegółami):

  0           0 RESUME                   0

  1           2 LOAD_NAME                0 (price)
              4 LOAD_CONST               0 (3)
              6 BINARY_OP                5 (*)
             10 STORE_NAME               1 (total)
             12 RETURN_CONST             1 (None)

Każda z tych linii to jeden krok pętli interpretera: pobierz wartość price, pobierz stałą 3, pomnóż je, zapisz wynik w total. Nic z tego nie jest kodem maszynowym; każdy krok wykonuje interpreter, który sam jest skompilowanym programem w C.

Błędy pojawiają się, gdy linia się wykonuje

Ponieważ interpreter wykonuje kod na bieżąco, program może wykonać prawdziwą pracę, zanim trafi na błąd. Uruchom to, a pierwsze dwie linie wyświetlą się przed awarią:

Step 1: starting
Step 2: still fine
Traceback (most recent call last):
  ...
ZeroDivisionError: division by zero

Błąd składni zachowuje się inaczej, bo CPython kompiluje cały plik do kodu bajtowego, zanim wykona z niego cokolwiek. Zmień linię 3 na print("Step 3:" 10) (brakuje przecinka), a nie wyświetli się nic, nawet Step 1:

SyntaxError: invalid syntax. Perhaps you forgot a comma?

Zatem stwierdzenie "interpreter wykonuje kod linia po linii" jest prawdziwe tylko w połowie. Gramatyka jest sprawdzana najpierw dla całego pliku; wszystko inne, na przykład dzielenie przez zero albo użycie nieistniejącej nazwy, wychodzi na jaw dopiero wtedy, gdy wykona się dana linia. O pierwszym rodzaju przeczytasz na stronie błąd składni.

Kompilator a interpreter

Kompilator tłumaczy cały program na osobny plik, zanim program zostanie uruchomiony. Interpreter za każdym razem sam wykonuje program. Z tego wynikają praktyczne różnice:

KompilatorInterpreter
Kiedy odbywa się pracaRaz, przed uruchomieniem programuPrzy każdym uruchomieniu programu
WynikOsobny plik (wykonywalny albo z kodem bajtowym)Brak osobnego pliku z programem
Co dajesz użytkownikomSkompilowany programKod źródłowy i interpreter zainstalowany na ich komputerze
Sprawdzanie błędówSkładnia oraz, w językach typowanych, błędy typów w całym programie przed uruchomieniemSkładnia zwykle sprawdzana najpierw; inne błędy pojawiają się, gdy wykona się błędna linia
Edycja i uruchomieniePonowna kompilacja po każdej zmianieZapisz i uruchom ponownie
SzybkośćSzybciej, procesor wykonuje kod maszynowy bezpośrednioWolniej, każda instrukcja jest dekodowana w trakcie działania
PrzenośnośćPonowna kompilacja dla każdego procesora i systemu operacyjnegoTen sam kod źródłowy działa wszędzie, gdzie jest interpreter
Typowe językiC, C++, Rust, GoPython, Ruby, PHP, Bash

Różnica w szybkości jest realna w ciasnych pętlach obliczeniowych: ta sama pętla może działać wielokrotnie szybciej jako skompilowany kod C niż w CPythonie. W programach, które głównie czekają na sieć, dysk albo użytkownika, różnica jest często zbyt mała, żeby ją zauważyć.

Kompilowany czy interpretowany to nie cecha języka

Język to zbiór reguł; kompilator albo interpreter to program, który je realizuje. Ten sam język można uruchamiać na oba sposoby, a większość popularnych języków łączy oba podejścia:

  • Python. CPython kompiluje do kodu bajtowego i go interpretuje. PyPy, inna implementacja, dodaje kompilator just-in-time (JIT), który w trakcie działania programu zamienia często wykonywany kod na kod maszynowy.
  • Java. javac kompiluje kod źródłowy do kodu bajtowego z wyprzedzeniem. Wirtualna maszyna Javy następnie interpretuje ten kod bajtowy i kompiluje JIT najczęściej używane metody do kodu maszynowego. Od Javy 11 java Main.java uruchamia pojedynczy plik źródłowy bezpośrednio, najpierw kompilując go w pamięci.
  • JavaScript. Przeglądarki i Node.js używają silników takich jak V8, które zaczynają od interpretowania kodu, a gorące fragmenty kompilują do kodu maszynowego w trakcie działania programu.
  • C i C++. Niemal zawsze kompilowane z wyprzedzeniem przez GCC, Clang albo MSVC.
python3 app.py            # Python: interpreter, bytecode behind the scenes
node app.js               # JavaScript: V8 interprets, then JIT-compiles
javac Main.java           # Java step 1: compile to Main.class
java Main                 # Java step 2: the JVM runs the bytecode

Tak czy inaczej, interpreter albo maszyna wirtualna są częścią środowiska uruchomieniowego programu: muszą być zainstalowane wszędzie tam, gdzie program działa.

Częste nieporozumienia

  • "Interpreter tłumaczy każdą linię na kod maszynowy." Klasyczny interpreter nigdy nie tworzy kodu maszynowego dla twojego programu. Odczytuje instrukcję i wykonuje ją za pomocą kodu, który został już wkompilowany w interpreter. Tworzenie kodu maszynowego w czasie działania to zadanie kompilatora JIT.
  • "Języki interpretowane nie mają etapu kompilacji." CPython, YARV w Ruby i PHP najpierw kompilują do kodu bajtowego. Ten krok jest automatyczny i niewidoczny, więc łatwo go przeoczyć.
  • "Interpretowany znaczy wolny." Kompilacja JIT w dużej mierze zniwelowała tę różnicę. V8 wykonuje JavaScript wystarczająco szybko dla dużych aplikacji, takich jak VS Code, który jest zbudowany na Electronie.
  • "Python to interpreter." Python to język. CPython, PyPy i MicroPython to różne interpretery tego języka i mogą różnić się szybkością oraz tym, jakie biblioteki obsługują.

Co dalej

Drugą połowę porównania znajdziesz na stronie co to jest kompilator, która pokazuje, jak zamienia on kod źródłowy na kod maszynowy. Strona o środowisku uruchomieniowym wyjaśnia, co jeszcze interpreter przynosi ze sobą. Żeby samodzielnie wypróbować interpreter, uruchom skrypt w Pythonie albo otwórz edytor online Pythona.

Najczęściej zadawane pytania

Czy Python to kompilator czy interpreter?
Python to język; program, który go wykonuje, to zwykle CPython, czyli interpreter. CPython najpierw automatycznie kompiluje twój kod do kodu bajtowego, a potem ten kod bajtowy interpretuje. Istnieją też inne implementacje, na przykład PyPy, który dodaje kompilator JIT.
Czy C++ to interpreter czy kompilator?
C++ to język i niemal zawsze kompiluje się go z wyprzedzeniem kompilatorem takim jak GCC, Clang albo MSVC. Wynikiem jest natywny plik wykonywalny dla jednego procesora i systemu operacyjnego. Istnieją interaktywne narzędzia dla C++, ale one w tle kompilują każdy fragment kodu.
Co jest szybsze, interpreter czy kompilator?
Skompilowany program zwykle działa szybciej, bo procesor wykonuje kod maszynowy bezpośrednio, zamiast czekać, aż interpreter zdekoduje każdy krok. Interpreter szybciej startuje, bo nie ma osobnego budowania. Kompilatory JIT, używane przez JVM i V8, zmniejszają tę różnicę, kompilując najczęściej wykonywany kod w trakcie działania programu.
Co to jest REPL?
REPL (read, evaluate, print, loop, czyli wczytaj, oblicz, wyświetl, powtórz) to interaktywny wiersz poleceń, w którym interpreter wykonuje każdą linię zaraz po jej wpisaniu i pokazuje wynik. Wpisanie python3 albo node bez nazwy pliku otwiera taki tryb. Przydaje się do sprawdzenia małego pomysłu bez tworzenia pliku.
Czy język może być jednocześnie kompilowany i interpretowany?
Tak. Kompilowany albo interpretowany opisuje implementację, a nie język. Java jest kompilowana do kodu bajtowego przez javac, a potem interpretowana i kompilowana JIT przez JVM, a dla języków takich jak Python i JavaScript istnieją zarówno interpretery, jak i kompilatory.
Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ