Что является байт-кодами и как делает JVM, обрабатывают их

Я много раз слышал, что Java реализует JIT (своевременная) компиляция, и ее байт-коды, которые являются портативными через платформы, "интерпретируются" JVM. Однако я действительно не знаю то, что байт-коды, и что JVM на самом деле означают в архитектуре языка Java; я хотел бы знать больше о них.

20
задан Justin Johnson 4 February 2010 в 21:21
поделиться

5 ответов

Канал связи уже установлен к моменту входа протокола WebSocket в сцену. WebSocket построен поверх TCP и HTTP, поэтому вам не нужно заботиться о том, что уже сделано этими протоколами, включая прокси.

Когда соединение WebSocket установлено, оно всегда начинается с соединения HTTP/TCP, которое позже «обновляется» во время фазы «квитирования» WebSocket. В это время туннель создан так, что доверенные лица прозрачны, нет необходимости заботиться о них.

-121--1419362-

Вместо метода BeginAnimation можно использовать раскадровку с завершенным событием. Вот пример, устанавливающий непрозрачность, но это то же понятие:

DoubleAnimation animation = new DoubleAnimation(0.0, new Duration(TimeSpan.FromSeconds(1.0)));

Storyboard board = new Storyboard();
board.Children.Add(animation);

Storyboard.SetTarget(animation, MyButton);
Storyboard.SetTargetProperty(animation, new PropertyPath("(Opacity)"));

board.Completed += delegate
{
    MessageBox.Show("DONE!");
};

board.Begin();
-121--4043404-

JVM ( Виртуальная машина Java) имеет набор команд, как и реальная машина. Имя этого набора команд - Java Bytecode. Он описан в Спецификации виртуальной машины Java . Другие языки переводятся в байт-код перед исполнением, например рубин и питон. Байт-код Java находится на довольно низком уровне, в то время как байт-код python намного выше.

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

Интерпретация обычно быстро начинается, но медленно во время выполнения, в то время как JIT имеет больше затрат на запуск, но работает быстрее после этого. Современные JVM используют комбинацию методов интерпретации и JIT, чтобы получить пользу от обоих. Байт-код сначала интерпретируется, в то время как JIT переводит его в фоновом режиме. После завершения компиляции JIT JVM переключается на использование этого кода вместо интерпретатора. Иногда компиляция JIT может дать лучшие результаты, чем компиляция с опережением времени, используемая для C и C++, поскольку она более динамична. JVM может отслеживать, как часто вызывается код и каковы типичные пути через код, и использовать эту информацию для создания более эффективного кода во время работы программы. JVM может переключаться на этот новый код так же, как при первоначальном переключении с интерпретатора на код JIT.

Как и другие языки, которые компилируются в собственный код, например C, C++, Fortran; существуют компиляторы для других языков, выводящие байт-код JVM. Одним из примеров является язык scala. Я считаю, что groovy и jruby также могут преобразовать в байт-код Java.

45
ответ дан 29 November 2019 в 22:56
поделиться

Байт-код - это шаг между исходным кодом и фактическим машинным кодом. JVM - это то, что берет байт-код и переводит его в машинный код.

JIT относится к тому факту, что JVM выполняет это преобразование «на лету», когда программа выполняется, а не за один шаг (как в традиционно компилируемом / связанном языке, таком как C или C ++).

Точка байт-кода заключается в том, что вы получаете лучшую производительность, чем строго интерпретируемый язык (например, PHP), потому что байт-код уже частично скомпилирован и оптимизирован. Кроме того, поскольку байт-код не должен напрямую интерпретироваться ЦП, его не нужно связывать с какой-либо конкретной архитектурой ЦП, что делает его более переносимым.

Недостатком, конечно же, является то, что оно, как правило, будет немного медленнее, чем приложение, скомпилированное в собственном коде, поскольку JVM все еще должна проделать некоторую работу по преобразованию байт-кода в машинный код.

14
ответ дан 29 November 2019 в 22:56
поделиться

Когда вы что-то компилируете на Java, компилятор генерирует байт-код. Это собственный код виртуальной машины Java. Затем JVM переводит байт-код в собственный код для вашего процессора / архитектуры, здесь и происходит JIT. Без JIT JVM будет транслировать программу по одной инструкции за раз, что очень медленно.

​​
1
ответ дан 29 November 2019 в 22:56
поделиться

Байт-код - это JVM-эквивалент инструкций машинного языка.

0
ответ дан 29 November 2019 в 22:56
поделиться

jcyang уже предоставил ссылку на википедию, но эта лучше соответствует вашему вопросу:

Байт-код Java

Компилятор Java компилирует исходный код Java в файлы классов. Методы класса транслируются в байтовый код, и виртуальная машина Java (JVM) интерпретирует этот байтовый код. Компилятор Just In Time (JIT) может использоваться для преобразования байтового кода в машинный код для ускорения выполнения методов класса.

0
ответ дан 29 November 2019 в 22:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: