Перейти к содержимому

Что такое byte code java

  • автор:

Заглядываем Под Капот Языка Java: Компиляция и Байт-Код

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

Вот как это работает:

Как работает Java фото

Сначала у нас есть исходный код Java в виде файла с расширением .java.

Этот код проходит через компилятор, тщательно проверяясь на ошибки и преобразуясь в байт-код. Забудьте о машинном коде — байт-код здесь находится на первом плане.

Компилированный байт-код — это наш переходный язык, абстракция, которая не привязана к какой-либо платформе. Этот файл можно передать любому устройству, способному интерпретировать Java, и вот тут на сцену выходит виртуальная машина Java (JVM).

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

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

Презентацию с видео можно скачать на Patreon .

Байт-код Java: определение, инструкции, методы написания и примеры

Lorem ipsum dolor

Байт-код Java — это совокупность команд, которые исполняются в виртуальной машине Java. Одна команда равняется одному байту, поэтому байт-код Java кажется довольно примитивным , в едь одна команда будет равняться одной букве.

Даже начинающий Java-разработчик знает, что программный код, разработанный на этом языке, может запускаться на каждом устройстве, где инсталлирована виртуальная машина Java. Напомним, виртуальная машина Java — это «среда обработки», которая осуществляет запуск Java-приложения на любом устройстве, независимо от операционной системы. Благодаря этому п рограмма , написанная один раз на Java, может работать на Windows, Linux, MacOS без дополнительной адаптации под конкретную операционную систему.

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

Байт-код Java

  • «-с» — дизасс е мблирует класс Java;
  • «-р» — раскрывает закрытые члены класса;
  • «-v» — показывает подробную информацию, например , стек или пул констант.

Байт-код Java: инструкции

  • для загрузки и сохранения;
  • для арифметических операций;
  • для преобразования типов;
  • для формирования и трансформирования объектов;
  • для управления стеком;
  • для операторов перехода;
  • для вызывания и возвращения методов;
  • для специфических задач.
  • префикс «I» означает «integer»;
  • «L» — «long»;
  • «S» — «short»;
  • «B» — «byte»;
  • «C» — «character»;
  • «F» — «float»;
  • «D» — «double»;
  • «A» — «reference»;
  • и др.

Байт-код Java и компиляторы

  • «Javac» — считается оригинальной компилирующей программой байт-кода Java;
  • «Jikes» — компилятор, созданный компанией IBM, при этом он запрограммирован на языке С++;
  • «Espresso» — компилятор, который был популярен в первых модификациях Java;
  • «GCJ» — функциональный компилятор, который способен формировать не только байт-код, но и машинный;
  • и др.
  • «Jruby», который формирует byte-код для JVM из Ruby;
  • «Jpython», который формирует byte-код из Python;
  • «MIDletPascal» — из Pascal;
  • и др.

Заключение

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

Изучение byte-кода поможет лучше писать Java-программы, при этом корректировать сам байт-код не нужно. Однак о и зучение байт-кода не является обязательным требованием, чтобы писать Java-программы.

Мы будем очень благодарны

если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.

Байт-код Java

Курс Байт-код Java

Данный курс для тех, кто уже знает синтаксис языка, но хотел бы разобраться в том, что из себя представляет чёрный ящик в виде JVM с её ByteCode, «руками потрогать» то, во что превращается ваш код после компиляции, научиться читать ByteCode и как следствие научиться анализировать программы даже без исходных кодов! Все это и многое другое в нашем новом курсе, который может быть востребован даже среди ведущих разработчиков.

Уже с первых уроков вы узнаете, что такое Java Bytecode и как его понимать, а к концу сможете делать много самостоятельных операций. Прохождение курса позволит вам лучше узнать платформу, с которой вы работаете, или же создать собственный язык программирования, легче проводить отладку и даже заняться низкоуровневой оптимизацией.

Следующий рекомендованный курс: «Java: Структуры данных» (https://ru.hexlet.io/courses/collections)

Программа курса

Продолжительность 5 часов

Модуль 0. Урок 0. Введение.

Вводный урок в котором мы рассказываем о том: что это за курс и для кого, что необходимо знать перед прохождением курса, какова структура курса (количество модулей и уроков), кто мы такие и почему делаем этот курс, место данного курса среди других.

Байт-код Java — Java bytecode

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 .

См. Также

  • Портал компьютерного программирования
  • Списки инструкций байт-кода Java
  • Файл класса Java
  • Список языков JVM
  • Инструменты резервного копирования Java
  • Компиляторы виртуальных машин C в Java
  • JStik
  • Common Intermediate Language (CIL), соперник Microsoft для байт-кода Java
  • ObjectWeb ASM
  • Инженерная библиотека байтового кода

Ссылки

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

Wikibook Программирование на Java имеет страницу по теме: Байт-код Java
  • Спецификация виртуальной машины Java Oracle
  • Языки программирования для виртуальной машины Java
  • Визуализатор байт-кода — средство просмотра байт-кода и отладчик (бесплатный плагин Eclipse)
  • AdaptJ StackTrace — отладка на уровне байт-кода с полным контролем над стеком, локальными переменными и потоком выполнения
  • Java Class Unpacker — плагин для Total Commander, он позволяет открывать файлы классов как сжатые архивы и просматривать поля и методы как файлы. Байт-код можно просмотреть как текст с помощью F3

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *