Байт-код
Все языки можно условно разделить на компилируемые и интерпретируемые. В Java используется третий подход — байт-код. Исходный код Java преобразуется компилятором в байт-код (а не машинный код). A байт-код Java преобразуется в машинный код с помощью специального интерпретатора, называемого виртуальной машиной Java (Java Virtual Machine — JVM).
Рассмотрим более детально как работает Java:
- Создается исходный документ (исходник) – файл c расширением .java.
- Исходник пропускается через компилятор, который проверяет код на ошибки и выдает конечный результат.
- Компилятор создает новый документ, закодированный с помощью байт-кода. Любое устройство, способное выполнять Java, сможет интерпретировать этот файл в такой формат, который сможет запустить. Скомпилированный байт-код не зависит от платформы.
- Виртуальная машина считывает и выполняет байт-код.
Презентацию с видео можно скачать на Patreon .
Байт-код Java: определение, инструкции, методы написания и примеры
![]()
Байт-код 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
Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 23 июня 2021 года; проверки требуют 2 правки.
Текущая версия страницы пока не проверялась опытными участниками и может значительно отличаться от версии, проверенной 23 июня 2021 года; проверки требуют 2 правки.
Байт-код Java — набор инструкций, исполняемых виртуальной машиной Java. Каждый код операции байт-кода — один байт; используются не все 256 возможных значений кодов операций, 51 из них зарезервирован для использования в будущем.
Для программирования на языке Java или других JVM-совместимых языках знание особенностей байт-кода не обязательно, тем не менее, «понимание байт-кода и понимание механизмов его генерации компилятором Java помогает Java-программисту так же, как и знание языка ассемблера помогает программисту, пишущему на Си или C++» [1] [2] .
Инструкции [ править | править код ]
Код CA16 зарезервирован для использования отладчиком и не используется языком, как и коды FE16 и FF16, которые зарезервированы для использования виртуальной машиной и отладчиками. Коды в диапазоне CB16—FD16 в текущей версии JVM не используются и зарезервированы для будущих дополнений.
Инструкции можно разделить на несколько групп:
- загрузка и сохранение (например, ALOAD_0, ISTORE),
- арифметические и логические операции (например, IADD, FCMPL),
- преобразование типов (например, I2B, D2I),
- создание и преобразование объекта (например, NEW, PUTFIELD),
- управление стеком (например, DUP, POP),
- операторы перехода (например, GOTO, IFEQ),
- вызовы методов и возврат (например, INVOKESTATIC, IRETURN).
Также есть несколько инструкций, выполняющих специфические задачи, такие как выбрасывание исключений, синхронизация и так далее.
Многие инструкции имеют префиксы или суффиксы, соответствующие их операндам:
| Префикс или суффикс | Тип операнда |
|---|---|
| I | integer |
| L | long |
| S | short |
| B | byte |
| C | character |
| F | float |
| D | double |
| A | reference |
Например, операция IADD — сложение двух целых чисел, в то время как FADD — сложение чисел с плавающей точкой.
Пример [ править | править код ]
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); >
компилятор может транслировать в следующий байт-код:
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
Генерация [ править | править код ]
Основная статья: Список языков JVM
В большинстве случаев байт-код Java генерируется для исполнения на виртуальной машине Java из исходного кода на языке Java. Единственный оригинальный компилятор, преобразующий код на языке Java в байт-код Java — это Javac, созданный компанией Sun Microsystems. Но поскольку все спецификации байт-кода Java доступны, существуют и сторонние компиляторы, генерирующие этот байт-код. Примеры таких компиляторов:
- Jikes[en] — компилирует код на Java в Java-байт-код (разработан IBM, написан на C++),
- Espresso — компилирует код на Java в Java-байт-код (для версии Java 1.0),
- GCJ (GNU Compiler for Java) — компилирует код на Java в Java-байт-код, также способен компилировать в нативный машинный код, является частью GNU Compiler Collection.
Для некоторых проектов существуют компиляторы, позволяющие генерировать байт-код для JVM из исходного кода на другом языке программирования, среди таких проектов:
- ColdFusion,
- JRuby и Jython (для Ruby и Python соответственно),
- Groovy (скриптовый язык, основанный на Java),
- Scala,
- Kotlin,
- JGNAT и AppletMagic,
- компиляторы с языка Си в Java-байт-код,
- Clojure,
- MIDletPascal,
- JavaFX Script.
Большинство существующих инструкций JVM имеет статическую типизацию: сигнатуры методов в местах их вызова проверяются во время компиляции, но механизм переноса этой проверки на время выполнения отсутствует [3] . Тем не менее, для JVM реализованы ряд языков с динамической типизацией.
Примечания [ править | править код ]
- ↑ Peter Haggar, Understanding bytecode makes you a better programmerWayback Machine // IBM DeveloperWorks, 01 Jul 2001
- ↑(неопр.)Дата обращения: 25 апреля 2013.Архивировано 25 мая 2013 года.
- ↑Nutter, Charles(неопр.) (3 января 2007). Дата обращения: 25 января 2008.См. также [ править | править код ]
Ссылки [ править | править код ]
Байт-код Java

Данный курс для тех, кто уже знает синтаксис языка, но хотел бы разобраться в том, что из себя представляет чёрный ящик в виде JVM с её ByteCode, «руками потрогать» то, во что превращается ваш код после компиляции, научиться читать ByteCode и как следствие научиться анализировать программы даже без исходных кодов! Все это и многое другое в нашем новом курсе, который может быть востребован даже среди ведущих разработчиков.
Уже с первых уроков вы узнаете, что такое Java Bytecode и как его понимать, а к концу сможете делать много самостоятельных операций. Прохождение курса позволит вам лучше узнать платформу, с которой вы работаете, или же создать собственный язык программирования, легче проводить отладку и даже заняться низкоуровневой оптимизацией.
Следующий рекомендованный курс: «Java: Структуры данных» (https://ru.hexlet.io/courses/collections)
Программа курса
Продолжительность 5 часов
Модуль 0. Урок 0. Введение.
Вводный урок в котором мы рассказываем о том: что это за курс и для кого, что необходимо знать перед прохождением курса, какова структура курса (количество модулей и уроков), кто мы такие и почему делаем этот курс, место данного курса среди других.
