Что интерпретирует байт-код Java - PullRequest
3 голосов
/ 05 января 2012

Мне было интересно, собран ли Java get, и в своих чтениях я обнаружил, что компилятор создает байт-код, который затем запускается на виртуальной машине Java. Интерпретирует ли JVM байт-код и выполняет его?

Вот почему я запутался. Сегодня в классе профессор сказал: «Компилятор берет язык высокого уровня, создает язык ассемблера, затем ассемблер берет язык ассемблера и создает машинный язык (бинарный), который можно запустить». Так что, если Java компилируется в байт-код, как его можно запустить?

Ответы [ 4 ]

9 голосов
/ 05 января 2012

Существует стандартная настройка компилятора, например, которая будет использоваться для языка C, а затем есть Java, который существенно отличается.

Стандартный компилятор C компилирует (через несколько внутренних фаз) в "машинные инструкции, "которые непосредственно понимаются процессором x86 или чем-то другим.

Компилятор Java, с другой стороны, компилируется в так называемые" байт-коды ".Это машинные инструкции, но для воображаемой машины, виртуальной машины Java.Таким образом, JVM интерпретирует байт-коды так же, как «настоящая» машина обрабатывает свои машинные инструкции.(Основным преимуществом этого является то, что программа, скомпилированная в байт-коды, будет работать на любой JVM, будь то в системе x86, IBM RISC или процессоре ARM в Android - до тех пор, покаесть JVM, в которой будет выполняться код.)

(Исторически существовало несколько «виртуальных машин», похожих на Java, система «P-code» UCSD Pascal - одна из наиболее успешных).

Но все становится сложнее -

Интерпретация "байт-кодов" довольно медленная и неэффективная, поэтому в большинстве реализаций Java есть какая-то схема для преобразования байт-кодов в "реальные" машинные инструкции.В некоторых случаях это делается статически, на отдельном этапе компиляции, но чаще всего это делается с помощью компилятора «точно в срок» (JITC), который преобразует небольшие части байтовых кодов в машинные инструкции во время работы приложения.Они должны быть достаточно сложными, со сложными схемами, позволяющими решить, какие сегменты кода получат наибольшую выгоду от перевода на аппаратные машинные инструкции.Но все они, по большей части, делают свое дело без необходимости знать о происходящем и без необходимости компилировать код Java для целевого процессора.

3 голосов
/ 05 января 2012

Думайте о байт-коде как о машинном языке JVM. (Компиляторы НЕ ДОЛЖНЫ генерировать ассемблерный код, который должен быть собран, но их гораздо проще написать таким образом.)

1 голос
/ 05 января 2012

Просто уточняющая заметка: То, что в 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-программу относительно независимой от операционной системы пользователя и сведений о платформе.

0 голосов
/ 05 января 2012

В кратком объяснении: JVM преобразует Java-байт-код в машинный код. Сгенерированный машинный код затем выполняется машиной.

Компилятор Java переводит JAVA в ByteCode. JVM переводит ByteCode в Assembly (машинный код) во время выполнения. Машина выполняет сборку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...