Транслятор, компилятор, интерпретатор и байт-код
В этой статье разберём ключевые понятия, которые объясняют, как код программы превращается в работающее приложение: транслятор, компилятор, интерпретатор и байт-код. Начнём с транслятора.
Транслятор
Транслятор — это программа, которая переводит код, написанный на одном языке, в код на другом языке. Чаще всего исходный код на языке программирования транслируется в машинный код, понятный процессору. Трансляторы условно делятся на два вида: компиляторы и интерпретаторы.
Компилятор
Компилятор берёт исходный код целиком, проверяет его на ошибки и, если их нет, полностью преобразует в машинный код. Получившуюся программу затем выполняет процессор. Благодаря этому выполнение происходит быстро, и компилятор не нужен на компьютере пользователя. Но есть и обратная сторона: программа становится привязанной к конкретной операционной системе и архитектуре процессора, а любое изменение кода требует повторной компиляции.
Схема работы компилятора:

Достоинства:
- высокая скорость выполнения программы;
- компилятор не нужен на компьютере пользователя.
Недостатки:
- программа зависит от ОС и процессора, под которые скомпилирована;
- при изменении кода требуется перекомпиляция.
Интерпретатор
Интерпретатор читает исходный код и выполняет его построчно, по мере чтения. Такой подход даёт гибкость: код не привязан к конкретной операционной системе и легко переносится между платформами, а при изменениях не нужна перекомпиляция. Плата за эту гибкость — обычно более низкая скорость выполнения, поскольку код разбирается заново при каждом запуске.
Схема работы интерпретатора:

Достоинства:
- независимость от операционной системы;
- при изменении кода не требуется перекомпиляция.
Недостатки:
- более низкая скорость выполнения;
- для запуска программы нужен интерпретатор.
Байт-код
Java использует третий подход, объединяющий достоинства компилятора и интерпретатора, — байт-код.

Процесс начинается с исходного кода на Java в файле с расширением .java. Этот код проходит через компилятор (javac), который проверяет его на ошибки и преобразует не в машинный код конкретного процессора, а в байт-код — промежуточное платформонезависимое представление. При этом создаётся файл с расширением .class.
Байт-код не привязан к конкретной платформе: его может выполнить любое устройство, на котором установлена виртуальная машина Java (JVM). Именно JVM запускает байт-код на конкретной системе.
При этом современная JVM не просто интерпретирует байт-код. Она сочетает интерпретацию с JIT-компиляцией (Just-In-Time): наиболее часто выполняемые («горячие») участки байт-кода компилируются в нативный машинный код прямо во время работы программы. Благодаря этому Java получает и переносимость байт-кода, и скорость, близкую к скомпилированным языкам.
Важно
Из-за байт-кода Java часто называют «интерпретируемым языком», но это неточно. Современная JVM (например, HotSpot) сочетает интерпретацию с JIT-компиляцией в нативный код, а в ряде сценариев применяется и опережающая AOT-компиляция (GraalVM).
Сравнение подходов
| Подход | Как обрабатывает код | Скорость | Переносимость |
|---|---|---|---|
| Компилятор | Преобразует весь код в машинный код заранее | Высокая | Привязан к ОС и процессору |
| Интерпретатор | Выполняет код построчно во время работы | Низкая | Не зависит от ОС |
| Байт-код (Java) | Компилируется в .class, затем JVM интерпретирует и JIT-компилирует | Высокая (за счёт JIT) | Выполняется на любой JVM |
Часто задаваемые вопросы
Чем отличается компилятор от интерпретатора?
Компилятор преобразует весь исходный код целиком в машинный код до выполнения, а интерпретатор читает и выполняет код построчно во время работы. Компиляция даёт скорость, интерпретация — гибкость и независимость от платформы.
Что такое байт-код в Java?
Байт-код — это промежуточное платформонезависимое представление программы, которое создаёт компилятор javac из .java-файла. Он хранится в файлах .class и выполняется виртуальной машиной Java (JVM).
Java — компилируемый или интерпретируемый язык?
И то, и другое. Исходный код компилируется в байт-код, а затем JVM выполняет его, сочетая интерпретацию и JIT-компиляцию в нативный машинный код. Поэтому называть Java «чисто интерпретируемой» некорректно.
Что такое JIT-компиляция?
JIT (Just-In-Time) — это компиляция «горячих» участков байт-кода в нативный машинный код прямо во время выполнения программы. Благодаря ей Java сочетает переносимость байт-кода с высокой производительностью.
Зачем Java использует байт-код, а не машинный код напрямую?
Чтобы обеспечить переносимость: один и тот же байт-код выполняется на любой платформе с установленной JVM, без перекомпиляции под каждый процессор и операционную систему.
Видео объяснение
Предпочитаете видеоформат? Посмотрите этот урок с примерами и объяснениями.
Комментарии