close

Байт-код Java

Перейти к навигации Перейти к поиску

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

Структура

Код операции каждой инструкции имеет длину один байт, хотя для некоторых требуются параметры, приводящие к многобайтовым инструкциям. Используются не все 256 возможных кодов операций. На самом деле Sun Microsystems , первоначальный создатель платформы Java, разделила три ценности, чтобы навсегда остаться нереализованными. [ 1 ]

Инструкции делятся на следующие категории:

  • Перемещение из памяти в регистры и наоборот (например, aload_0, istore)
  • Арифметика и логика (например, ladd, fcmpl)
  • Преобразование типов (например, i2b, d2i)
  • Создание объектов и манипулирование ими (например, new, putfield)
  • Манипуляции со стеком операндов (например, swap, dup2)
  • Управление потоком (например, ifeq, goto)
  • Вызов методов и их возврат (например, invokespecial, areturn)

Есть также несколько инструкций для более специализированных операций, таких как обработка исключений , синхронизация и т. д.

Стиль байт-кода Java аналогичен стековому языку программирования . Например, ассемблерный код для добавления двух регистров и перемещения результата в третий для ЦП семейства x86 выглядит так:

 добавить  eax ,  edx 
 mov  ecx ,  eax

в то время как сопоставимый код на языке ассемблера Java будет выглядеть так:

iload_1
iload_2
iadd
istore_3

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

Обработка динамических языков

Виртуальная машина Java предоставляет некоторую поддержку для обработки динамически типизированных языков. Большинство инструкций JVM статически типизированы, в том смысле, что вызовы методов проверяют свою «подпись» во время компиляции , без механизма задержки этого решения во время выполнения или выбора метода «отправки» выполнения в соответствии с альтернативным подходом. [ 2 ]

JSR 292 ( Поддержка языков с динамической типизацией на платформе Java™ ) [ 3 ] включает новый оператор invokedynamic, разрешающий вызов метода на основе динамической типизации. «Машина Да Винчи» — это прототип реализации виртуальной машины, в которой размещены расширения JVM для работы с этими языками. Точно так же официальная виртуальная машина Java, начиная с версии 7, также включает код операции invokedynamic.

Ссылки