Байт-код Java

редактировать

Байт-код Java - это набор инструкций для виртуальной машины Java ( JVM).

Содержание

  • 1 Отношение к Java
  • 2 Архитектура набора команд
    • 2.1 Набор команд
  • 3 Пример
  • 4 Поколение
  • 5 Выполнение
  • 6 Поддержка динамических языков
  • 7 См. Также
  • 8 Ссылки
  • 9 Внешние ссылки

Связь с Java

A Программисту Java совсем не обязательно знать или понимать байт-код Java. Однако, как предлагается в журнале IBM developerWorks, «Понимание байт-кода и того, какой байт-код может быть сгенерирован компилятором Java, помогает программисту Java так же, как знание сборка помогает программисту C или C++. "

архитектура набора команд

JVM является одновременно стековой машиной и регистрационный аппарат. Каждый фрейм для вызова метода имеет «стек операндов» и массив «локальных переменных». Стек операндов используется для операндов для вычислений и для получения возвращаемого значения вызываемого метода, в то время как локальные переменные служат той же цели, что и регистры , а также используются для передачи аргументов метода. Максимальный размер стека операндов и массива локальных переменных, вычисляемый компилятором, является частью атрибутов каждого метода. Каждый может иметь независимый размер от 0 до 65 535 значений, где каждое значение составляет 32 бита. Типы longи double, которые являются 64-битными, занимают две последовательные локальные переменные (которые не должны быть выровнены по 64-битному в массиве локальных переменных) или одно значение в стеке операндов (но считаются как две единицы в глубине стека).

Набор команд

Каждый байт-код состоит из одного байта, который представляет код операции , а также ноль или более байтов для операндов.

Из 256 возможных байтовых кодов операций, по состоянию на 2015 год, 202 используются (~ 79%), 51 зарезервирован для будущего использования (~ 20%), а 3 инструкции (~ 1%) постоянно зарезервированы для использования реализациями JVM. Два из них (impdep1и impdep2) предназначены для обеспечения ловушек для программного и аппаратного обеспечения, зависящего от реализации, соответственно. Третий используется отладчиками для реализации точек останова.

Инструкции делятся на несколько широких групп:

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

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

Многие инструкции имеют префиксы и / или суффиксы, относящиеся к типам операндов, которые они работают над. Это следующие:

Префикс/суффиксТип операнда
iцелое число
lдлинный
sкороткий
bбайт
cсимвол
fплавающий
dдвойной
aссылка

Например, iaddдобавит два целых числа, а daddдобавит два двойных числа. const, loadи Инструкции storeтакже могут иметь суффикс вида _n, где n - это число от 0 до 3 для loadи store. Максимальное значение n для constзависит от типа.

Инструкции constпомещают значение указанного типа в стек. Например, iconst_5поместит в стек целое число (32-битное значение) со значением 5, тогда как dconst_1поместит двойное (64-битное значение с плавающей запятой) со значением 1 в стек. Также существует aconst_null, который подталкивает ссылку null. Число n для инструкций loadи storeуказывает индекс в массиве локальных переменных для загрузки или сохранения. Инструкция aload_0помещает объект в локальной переменной 0 в стек (обычно это этот объект). istore_1сохраняет целое число наверху стека в локальную переменную 1. Для локальных переменных, превышающих 3, суффикс отбрасывается, и необходимо использовать операнды.

Пример

Рассмотрим следующий код Java:

outer: for (int i = 2; i < 1000; i++) { for (int j = 2; j < i; j++) { if (i % j == 0) continue outer; } System.out.println (i); }

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

0: iconst_2 1: istore_1 2: iload_1 3: sipush 1000 6: if_icmpge 44 9: iconst_2 10: istore_2 11: iload_2 12: iload_1 13: if_icmpge 31 16: iload_1 17: iload_2 18: irem 19: ifne 25 22: goto 38 25: iinc 2, 1 28: goto 11 31: getstatic # 84; // Поле java / lang / System.out: Ljava / io / PrintStream; 34: iload_1 35: invokevirtual # 85; // Метод java / io / PrintStream.println: (I) V 38: iinc 1, 1 41: goto 2 44: return

Поколение

Наиболее распространенный языковой таргетинг Виртуальная машина Java путем создания байт-кода Java - это Java. Первоначально существовал только один компилятор, компилятор javac из Sun Microsystems, который компилирует исходный код Java в Байт-код Java; но поскольку теперь доступны все спецификации для байт-кода Java, другие стороны предоставили com Пилеры, которые производят байт-код Java. Примеры других компиляторов включают:

  • Jikes, компилирует из Java в байт-код Java (разработан IBM, реализован в C ++ )
  • Espresso, компилирует из Java в байт-код Java (Java 1.0)
  • Компилятор GNU для Java (GCJ), компилируется из Java в байт-код Java; он также может компилироваться в собственный машинный код и был частью коллекции компиляторов GNU (GCC) до версии 6.

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

  • , принимает текстовые описания для классов Java, написанные в простом синтаксисе, подобном ассемблере, с использованием набора команд виртуальной машины Java и генерируют файл класса Java
  • Jamaica, a макрос язык ассемблера для виртуальной машины Java. Для определения класса или интерфейса используется синтаксис Java. Тела методов указываются с помощью байт-кода instr
  • Krakatau Bytecode Tools, в настоящее время содержит три инструмента: декомпилятор и дизассемблер для файлов классов Java и ассемблер для создания файлов классов.
  • Lilac, ассемблер и дизассемблер для виртуальной Java machine.

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

  • ColdFusion
  • JRuby и Jython, два языка сценариев на основе Ruby и Python
  • Apache Groovy, язык сценариев на основе Java
  • Scala, типобезопасный язык программирования общего назначения, поддерживающий объектно-ориентированное и функциональное программирование
  • JGNAT и AppletMagic, компилируйте с языка Ada в байт-код Java
  • C в компиляторы байт-кода Java
  • Clojure, функциональный неизменяемый язык программирования общего назначения из семейства Lisp с упором на параллелизм
  • Kawa, реализация программирования Scheme язык, а Также диалект Lisp.
  • MIDletPascal
  • Код JavaFX Script компилируется в байт-код Java
  • Kotlin, статически типизированный язык программирования общего назначения с выводом типа
  • Object Исходный код Pascal компилируется в байт-код Java с использованием компилятора Free Pascal 3.0+.

Execution

Сегодня доступно несколько машин, как бесплатных, так и коммерческих.

Если выполнение байт-кода Java на виртуальной машине Java нежелательно, разработчик также может скомпилировать исходный код Java или байт-код непосредственно в машинный код с помощью таких инструментов, как компилятор GNU для Java (GCJ). Некоторые процессоры могут выполнять байт-код Java изначально. Такие процессоры называются процессорами Java.

Поддержка динамических языков

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

JSR 292 (Поддержка динамически типизированных языков на платформе Java) добавил новую инструкцию invokedynamicна уровне JVM, чтобы разрешить вызов метода, основанного на динамической проверке типа (вместо существующей инструкции invokevirtualс статической проверкой типа). Da Vinci Machine - это прототип виртуальной машины, на которой размещены расширения JVM, предназначенные для поддержки динамических языков. Все JVM, поддерживающие JSE 7, также включают код операции invokedynamic.

См. Также

  • icon Портал компьютерного программирования

Ссылки

Внешние ссылки

Wikibook Программирование на Java имеет страницу по теме: Байт-код Java
Последняя правка сделана 2021-05-24 03:57:41
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте