Menu
Coddy logo textTech

Что такое интерпретатор?

Интерпретатор представляет собой программу, которая выполняет исходный код напрямую, исполняя инструкции по ходу дела, вместо того чтобы сначала переводить всю программу в отдельный файл с машинным кодом. Стандартные реализации Python и Ruby являются интерпретаторами.

Автор: Kevin Spektor, Сооснователь и CTO

Обновлено 24 сентября 2026 г.

Исходный код
  1. 1print("Hello")
  2. 2total = 2 + 3
  3. 3print(total)
  4. 4print("Done")
Вывод
Переведено строк0
Запусков0

При каждом запуске строки переводятся заново. Включи опечатку, и интерпретатор всё равно выведет "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, GoPython, 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 является компилятором или интерпретатором?
Python является языком; программа, которая его выполняет, обычно CPython, а это интерпретатор. CPython сначала автоматически компилирует твой код в байт-код, а затем интерпретирует этот байт-код. Есть и другие реализации, например PyPy, в которой есть JIT-компилятор.
C++ использует интерпретатор или компилятор?
C++ является языком, и его почти всегда заранее компилируют компилятором вроде GCC, Clang или MSVC. Результатом становится нативный исполняемый файл для одного процессора и одной операционной системы. Интерактивные инструменты для C++ существуют, но и они незаметно компилируют каждый фрагмент кода.
Что быстрее, интерпретатор или компилятор?
Скомпилированная программа обычно работает быстрее, потому что процессор выполняет машинный код напрямую, а интерпретатору приходится разбирать каждый шаг. Интерпретатор быстрее стартует, так как отдельной сборки нет. JIT-компиляторы, которые используют JVM и V8, сокращают разрыв, компилируя самый загруженный код во время работы программы.
Что такое REPL?
REPL (read, evaluate, print, loop: прочитать, вычислить, вывести, повторить) представляет собой интерактивную оболочку, где интерпретатор выполняет каждую строку сразу после ввода и показывает результат. Её открывают команды python3 или node без имени файла. Это удобно, чтобы проверить небольшую идею, не создавая файл.
Может ли язык быть одновременно компилируемым и интерпретируемым?
Да. Компилируемость или интерпретируемость описывает реализацию, а не язык. Java компилируется в байт-код с помощью javac, а затем JVM интерпретирует его и JIT-компилирует, а для таких языков, как Python и JavaScript, существуют и интерпретаторы, и компиляторы.
Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ