WikiSort.ru - Не сортированное

ПОИСК ПО САЙТУ | о проекте

Байт-код Java — набор инструкций, исполняемых виртуальной машиной Java. Каждый код операции байт-кода — один байт. Используются не все 256 возможных значений кодов операций. 51 из них зарезервированы для использования в будущем.

Связь с языком Java

Для программирования на языке Java или других JVM-совместимых языках знание особенностей байт-кода не обязательно. Однако, как следует из публикации в журнале IBM developerWorks, «понимание байт-кода и понимание механизмов его генерации компилятором Java помогает Java-программисту так же, как и знание языка ассемблера помогает программисту, пишущему на Си или C++».[1][2]

Инструкции

У одного байта существует 256 возможных значений, поэтому всего 256 возможных кодов операций в байт-коде. Код CA16 зарезервирован для использования отладчиком и не используется языком, как и коды FE16 и FF16, которые зарезервированы для использования виртуальной машиной и отладчиками. Коды в диапазоне CB16—FD16 в текущей версии JVM не используются и зарезервированы для будущих дополнений.

Инструкции можно разделить на несколько групп:

  • загрузка и сохранение (например, ALOAD_0, ISTORE),
  • арифметические и логические операции (например, IADD, FCMPL),
  • преобразование типов (например, I2B, D2I),
  • создание и преобразование объекта (например, NEW, PUTFIELD),
  • управление стеком (например, DUP, POP),
  • операторы перехода (например, GOTO, IFEQ),
  • вызовы методов и возврат (например, INVOKESTATIC, IRETURN).

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

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

Префикс или суффиксТип операнда
Iinteger
Llong
Sshort
Bbyte
Ccharacter
Ffloat
Ddouble
Areference

Например, операция IADD — сложение двух целых чисел, в то время как FADD — сложение чисел с плавающей точкой.

Пример

Рассмотрим следующий пример кода на языке 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; //Field java/lang/System.out:Ljava/io/PrintStream;
  34:  iload_1
  35:  invokevirtual   #85; //Method java/io/PrintStream.println:(I)V
  38:  iinc    1, 1
  41:  goto    2
  44:  return

Генерация

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

  • Jikes(англ.)русск. — компилирует код на Java в Java байт-код (разработан IBM, написан на C++),
  • Espresso — компилирует код на Java в Java байт-код (для версии Java 1.0),
  • GCJ (GNU Compiler for Java) — компилирует код на Java в Java байт-код, также способен компилировать в нативный машинный код. Является частью GNU Compiler Collection.

Для некоторых проектов существуют компиляторы, позволяющие генерировать байт-код для JVM из исходного кода на другом языке программирования. Среди этих проектов:

Выполнение

Байт-код Java разработан для исполнения на виртуальной машине Java (JVM, Java Virtual Machine) компании Sun. На сегодняшний день также доступны различные реализации JVM, как свободные, так и коммерческие.

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

Поддержка языков с динамической типизацией

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

См. также

Ссылки

Примечания

  1. Peter Haggar, Understanding bytecode makes you a better programmer // IBM DeveloperWorks, 01 Jul 2001
  2. A Formal Introduction to the Compilation of Java, Stephan Diehl, "Software - Practice and Experience", Vol. 28(3), pages 297-327, March 1998.
  3. Nutter, Charles InvokeDynamic: Actually Useful? (3 января 2007). Проверено 25 января 2008. Архивировано 30 апреля 2013 года.

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии