Разница между командами 'java' и 'javac': компиляция Java
Быстрый ответ
Команда java
не компилирует исходные файлы на Java. Для преобразования файлов .java
в байт-код, который находится в файлах .class
, используйте команду javac
. Затем уже готовый байт-код запускается с помощью команды java
.
Используйте для компиляции следующим образом:
javac MyClass.java
И для запуска так:
java MyClass
Не забывайте: javac
— это ваш ассистент в компилировании, а java
— это инструмент для запуска исполняемого кода.
Усовершенствование запуска с Java 11
С появлением Java 11 появилась возможность непосредственного запуска исходных файлов Java, что позволяет обойти этап компиляции с использованием javac
. Данная инновация представлена в JEP 330, и она направлена на облегчение процесса обучения и разработки несложных программ. Однако стоит иметь в виду, что при этом файлы .class
не создаются, а значит, для распространения исполняемого кода потребуется воспользоваться javac
.
Визуализация
Процесс работы с Java состоит из нескольких этапов:
Шаг 1: Кодирование 📝 ➡️ Сохранение в файл `.java`
Шаг 2: Компиляция 🛠️ (с помощью javac) ➡️ Получение файла `.class` с байт-кодом
Шаг 3: Запуск программы 🏃♂️ (при помощи java) ➡️ Исполнение интерпретированного байт-кода из файла `.class`
Справедливо будет утверждать, что команда java
— это не завод по производству кода, а скорее двигатель машины, которых ставит в действие готовую конструкцию.
JEP 330: Упрощение запуска однофайловых приложений
Благодаря JEP 330 программисты теперь могут сразу запускать однофайловые приложения, минуя этап компиляции. Однако, это возможно только в случае, если имя файла совпадает с именем публичного класса. Таким образом, команда java
способна напрямую интерпретировать и выполнить исходный код, что обеспечивает гладкую интеграцию с привычными процедурами и значительное облегчение начального обучения.
Выполнение вашего кода на Java: Взгляд изнутри
Когда рассматривается процесс исполнения кода Java, важно различать интерпретацию байт-кода и JIT-компиляцию (Just-In-Time). Современные среды Java используют JIT для преобразования кода в оптимизированные машинные инструкции, учитывая особенности окружения выполнения.
Байт-код: Ключ к универсальности
Байт-код, записанный в файлах .class
, созданных средствами javac
, можно сравнить с машинным кодом, но предназначенным для Java-машин (JVM). Именно этот код работает независимо от платформы, в результате чего возникает уверенность в его исполнении на любом оборудовании, поддерживающем JVM.
JIT-компиляция: Улучшение производительности
Во время работы команды java
происходит JIT-компиляция: часто используемые участки кода переводятся в машинный язык. Такое динамическое преобразование ускоряет работу Java-приложений при каждом последующем запуске.
Реальная оптимизация: Умная JVM
Java-среды способны выбирать между интерпретацией и JIT-компиляцией кода в зависимости от его важности для производительности. Такой баланс — это часть стратегии оптимизации, которая постоянно в поиске наилучшего сочетания между скоростью исполнения и затратами ресурсов.
Запуск без предварительной компиляции
Начиная с версии Java 11, стало возможным запускать приложения с помощью java ClassName
, минуя этап компиляции javac
. Это дает возможность исполнять либо ранее скомпилированные .class
файлы, либо интерпретировать исходный код однофайлового приложения, если соблюдены правила именования.