Что такое интерпретатор?
Интерпретатор представляет собой программу, которая выполняет исходный код напрямую, исполняя инструкции по ходу дела, вместо того чтобы сначала переводить всю программу в отдельный файл с машинным кодом. Стандартные реализации Python и Ruby являются интерпретаторами.
Обновлено 24 сентября 2026 г.
- 1print("Hello")
- 2total = 2 + 3
- 3print(total)
- 4print("Done")
При каждом запуске строки переводятся заново. Включи опечатку, и интерпретатор всё равно выведет "Hello", прежде чем дойдёт до строки 3 и остановится.
Набери python3 hello.py, и появится вывод, но загляни потом в папку: нового файла программы там нет. На самом деле работала программа python3, то есть интерпретатор Python. Он прочитал hello.py, разобрался, что означает каждая инструкция, и выполнил её. Запусти скрипт завтра, и интерпретатор снова прочитает исходный код с самого начала.
Как работает интерпретатор
Интерпретатор повторяет один цикл, пока программа не закончится: взять следующую инструкцию, понять, что она значит, выполнить её, перейти дальше. Пока он работает, переменные программы хранятся в его собственной памяти, поэтому total = price * 3 может использовать price, заданную несколькими строками выше.
Нагляднее всего это видно в интерактивном режиме, который называется REPL (read, evaluate, print, loop: прочитать, вычислить, вывести, повторить). Набери python3 без имени файла, и каждая строка будет выполняться, как только ты нажмёшь Enter:
>>> price = 4
>>> price * 3
12
Настоящие интерпретаторы добавляют подготовительный шаг. CPython, стандартный интерпретатор Python, сначала компилирует весь файл в байт-код, компактный список простых инструкций, а затем в цикле выполняет этот байт-код по одной инструкции. Байт-код одной строки можно вывести на экран:
Python 3.12 выводит следующее (в других версиях детали отличаются):
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)
Каждая из этих строк является одним шагом цикла интерпретатора: получить значение price, получить константу 3, перемножить их, сохранить результат в total. Машинного кода здесь нет; каждый шаг выполняет интерпретатор, который сам является скомпилированной программой на C.
Ошибки проявляются, когда выполняется строка
Интерпретатор выполняет программу по ходу, поэтому она может успеть сделать настоящую работу, прежде чем наткнётся на ошибку. Запусти этот код, и первые две строки выведутся до сбоя:
Step 1: starting
Step 2: still fine
Traceback (most recent call last):
...
ZeroDivisionError: division by zero
С синтаксической ошибкой всё иначе, потому что CPython компилирует весь файл в байт-код, прежде чем выполнить хоть что-то. Замени строку 3 на print("Step 3:" 10) (пропущена запятая), и ничего не выведется, даже Step 1:
SyntaxError: invalid syntax. Perhaps you forgot a comma?
Так что фраза «интерпретатор выполняет код построчно» верна лишь наполовину. Грамматика сначала проверяется для всего файла; всё остальное, например деление на ноль или использование несуществующего имени, обнаруживается только когда выполняется эта строка. Про первый вид ошибок читай на странице синтаксическая ошибка.
Компилятор и интерпретатор
Компилятор переводит всю программу в отдельный файл до её запуска. Интерпретатор сам выполняет программу, каждый раз. Практические различия следуют из этого:
| Компилятор | Интерпретатор | |
|---|---|---|
| Когда выполняется работа | Один раз, до запуска программы | При каждом запуске программы |
| Результат | Отдельный файл (исполняемый или байт-код) | Отдельного файла программы нет |
| Что получают пользователи | Скомпилированную программу | Исходный код и установленный на их компьютере интерпретатор |
| Проверка ошибок | Синтаксис, а в типизированных языках и ошибки типов, для всей программы до запуска | Синтаксис обычно проверяется заранее; остальные ошибки появляются, когда выполняется ошибочная строка |
| Правка и запуск | Перекомпилировать после каждого изменения | Сохранить и запустить снова |
| Скорость | Выше, процессор выполняет машинный код напрямую | Ниже, каждая инструкция разбирается во время работы программы |
| Переносимость | Перекомпилировать для каждого процессора и каждой операционной системы | Тот же исходный код работает везде, где есть интерпретатор |
| Типичные языки | C, C++, Rust, Go | Python, Ruby, PHP, Bash |
Разница в скорости реальна для плотных циклов с арифметикой: тот же цикл на скомпилированном C может работать во много раз быстрее, чем в CPython. Для программ, которые в основном ждут сеть, диск или пользователя, разница часто слишком мала, чтобы её заметить.
Компилируемость не является свойством языка
Язык представляет собой набор правил; компилятор или интерпретатор является программой, которая их реализует. Один и тот же язык можно выполнять обоими способами, и большинство популярных языков сочетают их:
- Python. CPython компилирует в байт-код и интерпретирует его. PyPy, другая реализация, добавляет JIT-компилятор (just-in-time), который превращает часто выполняемый код в машинный прямо во время работы программы.
- Java.
javacзаранее компилирует исходный код в байт-код. Затем виртуальная машина Java интерпретирует этот байт-код и JIT-компилирует самые загруженные методы в машинный код. Начиная с Java 11,java Main.javaзапускает один исходный файл напрямую, сначала компилируя его в памяти. - JavaScript. Браузеры и Node.js используют движки вроде V8, которые сначала интерпретируют код, а горячие участки компилируют в машинный код по ходу работы программы.
- C и C++. Почти всегда компилируются заранее с помощью GCC, Clang или 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
В любом случае интерпретатор или виртуальная машина являются частью среды выполнения программы: они должны быть установлены везде, где программа запускается.
Распространённые заблуждения
- «Интерпретатор переводит каждую строку в машинный код». Классический интерпретатор никогда не создаёт машинный код для твоей программы. Он читает инструкцию и выполняет её с помощью кода, который уже скомпилирован внутри самого интерпретатора. Создавать машинный код во время выполнения умеет JIT-компилятор.
- «У интерпретируемых языков нет шага компиляции». CPython, YARV в Ruby и PHP сначала компилируют в байт-код. Этот шаг автоматический и незаметный, поэтому его легко упустить.
- «Интерпретируемый значит медленный». JIT-компиляция во многом сократила разрыв. V8 выполняет JavaScript достаточно быстро для больших приложений вроде VS Code, построенного на Electron.
- «Python и есть интерпретатор». Python является языком. CPython, PyPy и MicroPython представляют собой разные интерпретаторы для него, и они могут отличаться скоростью и набором поддерживаемых библиотек.
Что изучить дальше
Чтобы разобраться со второй половиной сравнения, прочитай, что такое компилятор и как он превращает исходный код в машинный. На странице среда выполнения объясняется, что ещё интерпретатор приносит с собой. Чтобы попробовать интерпретатор самому, запусти скрипт Python или открой песочницу Python.
Часто задаваемые вопросы
Python является компилятором или интерпретатором?
C++ использует интерпретатор или компилятор?
Что быстрее, интерпретатор или компилятор?
Что такое REPL?
python3 или node без имени файла. Это удобно, чтобы проверить небольшую идею, не создавая файл.Может ли язык быть одновременно компилируемым и интерпретируемым?
javac, а затем JVM интерпретирует его и JIT-компилирует, а для таких языков, как Python и JavaScript, существуют и интерпретаторы, и компиляторы.