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.
Aktualizacja: 24 września 2026
- 1print("Hello")
- 2total = 2 + 3
- 3print(total)
- 4print("Done")
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:
| Kompilator | Interpreter | |
|---|---|---|
| Kiedy odbywa się praca | Raz, przed uruchomieniem programu | Przy każdym uruchomieniu programu |
| Wynik | Osobny plik (wykonywalny albo z kodem bajtowym) | Brak osobnego pliku z programem |
| Co dajesz użytkownikom | Skompilowany program | Kod źródłowy i interpreter zainstalowany na ich komputerze |
| Sprawdzanie błędów | Składnia oraz, w językach typowanych, błędy typów w całym programie przed uruchomieniem | Składnia zwykle sprawdzana najpierw; inne błędy pojawiają się, gdy wykona się błędna linia |
| Edycja i uruchomienie | Ponowna kompilacja po każdej zmianie | Zapisz i uruchom ponownie |
| Szybkość | Szybciej, procesor wykonuje kod maszynowy bezpośrednio | Wolniej, każda instrukcja jest dekodowana w trakcie działania |
| Przenośność | Ponowna kompilacja dla każdego procesora i systemu operacyjnego | Ten sam kod źródłowy działa wszędzie, gdzie jest interpreter |
| Typowe języki | C, C++, Rust, Go | Python, 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.
javackompiluje 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 11java Main.javauruchamia 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?
Czy C++ to interpreter czy kompilator?
Co jest szybsze, interpreter czy kompilator?
Co to jest REPL?
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?
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.