Как java.exe выполняет исходный код Java?

Когда у меня был только HelloWorld.java в каталоге без HelloWorld.class, java HelloWorld в Windows cmd вызвал исключение класса, не найденного. Однако java HelloWorld.java было выполнено правильно, без создания HelloWorld.class.

Насколько я понимаю, JVM читает байт-коды файла с расширением .class, но не может прочитать файл .java. Я понимаю, что java.exe — это всего лишь средство запуска для создания JVM и ее запуска, но теперь я не понимаю, как он может правильно работать с Java-кодом, а не с байт-кодом.

из документации инструмента java : «Если класс идентифицирует существующий файл с расширением .java или если указан параметр --source, то выбирается режим исходного файла. Затем исходный файл компилируется и запускается ... В режиме исходного файла эффект такой, как будто исходный файл скомпилирован в память», (выделено мной)

user85421 15.09.2023 21:19

Написал статью некоторое время назад о попытке опробовать JEP-330 и краткое изложение того, что это могло означать. Открыт для обратной связи, чтобы улучшиться :)

Naman 16.09.2023 02:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
79
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

вр; доктор

В современной Java для удобства начинающих студентов Java-приложение компилирует, а затем запускает файл .java.

Думайте об этом как о том, что Java-приложение обнаруживает файл исходного кода, затем передает работу по компиляции Javac-приложению, кэширует скомпилированный класс в памяти и, наконец, продолжает запускать вновь скомпилированный класс.

Подробности

JDK поставляется в комплекте с несколькими десятками инструментов. Несколько из них имеют решающее значение:

Этапы процесса:

  1. Вы пишете исходный код Java в файле .java, включая метод main внутри определения class.
  2. Вы отправляете этот файл в компилятор, например в приложение Javac, входящее в состав каждого JDK.
  3. Компилятор выводит файл .class.
  4. Вы выполняете (запускаете) метод main, запуская Java-приложение, входящее в состав каждого JDK.

Вы можете пропустить некоторые шаги.

  • Скомпилируйте и запустите один файл:
    Начиная с Java 11, вы можете указать Java-приложению файл .java. Java-приложение сначала автоматически скомпилируется, как если бы от вашего имени вызывался javac. Затем Java-приложение запустит вновь скомпилированный класс.
    • Файл .class не записывается в хранилище. Скомпилированный класс кэшируется в памяти.
    • См. JEP 330: Запуск программ с однофайловым исходным кодом для получения всех подробностей.
    • Вы заметили именно такое поведение: однако java HelloWorld.java был выполнен правильно без создания HelloWorld.class.
  • Упрощенно main
    В качестве функции предварительной версии Java 21 вы можете:

Мотивация

Команда Java прилагает согласованные усилия, чтобы облегчить путь начинающим Java-программистам и сгладить первоначальные препятствия. Они пытаются замаскировать некоторые сложные церемонии и сделать инструменты более дружелюбными и удобными.

Базовые структуры и функции Java по-прежнему сохраняются. Это не «отупление» Java. Эти усилия — всего лишь попытки создать разумные условия для новичков.

Привет, мир

Объединив эти функции, начать работу с приложением Hello World очень просто: достаточно записать следующую команду в файл HelloWorld.java:

void main() {
    System.out.println("Hello, World!");
}

… а затем в командной строке вызовем:

java HelloWorld.java

Результат на консоли:

Привет, мир!

Это огромное сокращение трудозатрат и путаницы для новичка, изучающего Java.


jshell

Кстати... Еще один способ упростить использование Java — это jshell , REPL для Java.

Как новички, так и профессионалы находят jshell удобным для запуска коротких фрагментов Java с немедленной обратной связью.

БлюДжей

Еще один полезный инструмент для начинающих — BlueJ , IDE, предназначенная для студентов.

Как упоминалось в JEP-330, для вашего примера.

java HelloWorld.java

неформально эквивалентно

javac -d <memory> HelloWorld.java
java -cp <memory> hello.World

эквивалентно, если hello.World — это имя первого класса, найденного в файле HelloWorld.java.

user85421 17.09.2023 23:06

Начиная с Java 9, у нас есть jshell инструменты REPL для языка Java (REPL как в Python), интерактивный интерпретатор исходного кода Java.

Начиная с Java 11, вы можете либо выполнять байт-код JVM, либо интерпретировать исходный код Java (режим исходного файла) с помощью команды java (см. https://openjdk.org/jeps/330). Выдержка из этого документа:

Начиная с JDK 10, средство запуска Java работает в трех режимах: запуск файла класса, запуск основного класса файла JAR или запуск основной класс модуля. Здесь мы добавляем новый, четвертый режим: запуск класс, объявленный в исходном файле.

Как работает переводчик? Это (почти) не представляет интереса, но весьма вероятно, что некоторые этапы компиляции выполняются «под капотом».

Другие вопросы по теме