Просто уточняющая заметка:
То, что в Java называется «байт-кодом», это то, что в вашем первоначальном описании «создает машинный язык (двоичный), который может быть запущен»
Таким образом, ответ на то, как запустить байт-код Java:
Вы создаете процессор, который может обрабатывать байт-код Java, точно так же, как если вы хотите выполнить обычный код x86, вы создаете процессор для его обработки.
Двоичный машинный язык Javas практически не отличается от двоичного формата команд других процессоров, таких как x86 или powerpc. И существует процессор, который может выполнять байт-код Java напрямую. (Это был бы нормальный процессор Intel / Amd).
Другой пример: как бы вы запускали код powerpc на обычном процессоре Intel? Вы бы создали программный продукт, который во время выполнения преобразовывал бы двоичный код powerpc в код x86. Случай с Java не так уж и отличается. Таким образом, чтобы запустить код Java на процессоре x86, вам нужна программа, которая переводит двоичный код Java (он же байт-код) в двоичный код x86. Это то, что делает JVM *. И он делает это либо путем интерпретации Java-инструкций по одной, либо путем перевода огромного куска инструкций за один раз (называется jit). То, как jvm обрабатывает перевод, зависит от того, какую реализацию jvm вы используете, и от ее настроек (существует несколько независимых реализаций java jvms, которые по-разному реализуют свой перевод).
Но есть одна вещь, которая делает Java немного другим. В отличие от других форматов бинарных инструкций, таких как x86, java был более новым, действительно предназначенным для работы непосредственно на процессоре. Его двоичный формат разработан таким образом, чтобы его было легко перевести в двоичный код для «нормальных» процессоров, таких как x86 или powerpc.
* JVM на самом деле обрабатывает больше, чем просто перевод двоичного кода Java в код, зависящий от процессора. Он также управляет распределением памяти для Java-программ и взаимодействует между Java-программой и пользовательской операционной системой. Это сделано для того, чтобы сделать Java-программу относительно независимой от операционной системы пользователя и сведений о платформе.