JavaScript

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

Lorem ipsum dolor

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

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

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

Байт-код Java

Байт-код это прямой результат компилирования исходного Java-кода. Он формируется перед попаданием кода в виртуальную машину и заключается в специальный файл.

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

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

Просмотреть файл «.class» все же можно. Для этого воспользуйтесь командной строкой и командой:

javap -c -p -v [указать путь до файла «.class»]

В команде присутствует несколько флагов. Вот что они значат:

  •  «-с» дизассемблирует класс Java;

  •  «-р» раскрывает закрытые члены класса;

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

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

Байт-код Java формируется по определенным правилам-инструкциям. Не было бы их, тогда при компилировании программного исходного кода в байт-код творился бы хаос.

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

Byte-code Java — это не машинный код, как считают некоторые начинающие разработчики, а промежуточный код, который нужен виртуальной машине Java.

Инструкции, по которым формируется byte-код, разделяются на несколько категорий:

  •  для загрузки и сохранения;

  •  для арифметических операций;

  •  для преобразования типов;

  •  для формирования и трансформирования объектов;

  •  для управления стеком;

  •  для операторов перехода;

  •  для вызывания и возвращения методов;

  •  для специфических задач.

Пример инструкций:

  •  префикс «I» означает «integer»;

  •  «L» «long»;

  •  «S» «short»;

  •  «B» «byte»;

  •  «C» «character»;

  •  «F» «float»;

  •  «D» «double»;

  •  «A» «reference»;

  •  и др.

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

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

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

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

  • «Javac» считается оригинальной компилирующей программой байт-кода Java;

  • «Jikes» компилятор, созданный компанией IBM, при этом он запрограммирован на языке С++;

  • «Espresso» компилятор, который был популярен в первых модификациях Java;

  • «GCJ» функциональный компилятор, который способен формировать не только байт-код, но и машинный;

  • и др.

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

  • «Jruby», который формирует byte-код для JVM из Ruby;

  • «Jpython», который формирует byte-код из Python;

  • «MIDletPascal» из Pascal;

  • и др.

Заключение

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

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

Схожие статьи

Учебный курс по React, часть 10: практикум по работе со свойствами компонентов и стилизации
JavaScript

Учебный курс по React, часть 10: практикум по работе со свойствами компонентов и стилизации

Что такое Var и Let, их функции и какая разница между ними
JavaScript

Что такое Var и Let, их функции и какая разница между ними

JS проверка на NaN: как проверить, является ли число NaN в JavaScript
JavaScript

JS проверка на NaN: как проверить, является ли число NaN в JavaScript

Учебный курс по React, часть 14: практикум по компонентам, основанным на классах, состояние компонентов
JavaScript

Учебный курс по React, часть 14: практикум по компонентам, основанным на классах, состояние компонентов

×