Ответ
Компиляция Java — это многоэтапный процесс преобразования исходного кода (.java файлы) в байт-код (.class файлы), который затем выполняется виртуальной машиной Java (JVM).
Основные этапы компиляции (выполняются javac):
- Лексический анализ (Lexical Analysis / Scanning): Исходный код разбивается на лексемы (токены) — ключевые слова, идентификаторы, операторы, литералы.
- Синтаксический анализ (Parsing): Поток токенов преобразуется в Абстрактное синтаксическое дерево (AST), которое отражает грамматическую структуру программы.
- Семантический анализ: Компилятор проверяет корректность программы с точки зрения языка: типы данных, область видимости переменных, наличие методов и классов.
- Генерация байт-кода: AST преобразуется в инструкции байт-кода для JVM — платформо-независимый, низкоуровневый набор команд.
- Оптимизация (базовая):
javacвыполняет ограниченные оптимизации (например, свертку константfinal), основные оптимизации происходят во время выполнения (JIT-компиляция в JVM).
Пример и результат:
// Main.java
public class Main {
public static void main(String[] args) {
int result = 2 + 3;
System.out.println(result);
}
}
# Компиляция
javac Main.java
# Создается файл Main.class, содержащий байт-код.
Отличие от нативных компиляторов (C/C++):
- Java:
.java→ (компиляцияjavac) →.class(байт-код) → (интерпретация/JIT JVM) → Машинный код. - C++:
.cpp→ (компиляцияg++) → Объектный файл → (компоновкаld) → Исполняемый файл (нативный машинный код).
Роль JVM: JVM загружает .class файлы, проверяет байт-код (верификатор), интерпретирует его или компилирует «на лету» в машинный код с помощью JIT-компилятора (Just-In-Time) для повышения производительности.