Что такое byte code java
Перейти к содержимому

Что такое byte code java

  • автор:

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

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

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

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

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

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

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

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

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

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

Байт-код Java

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

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

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

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

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

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

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

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

Знакомство с байт-кодами Java

В IntellijIDEA есть замечательная фича — показать байткод, позволяющая посмотреть как и в итоге JRE будет выполнять написанный код.(впрочем это также некоторая интерпретация компилятором машинного байткода для удобства чтения) Находится в View->Show Byte Code Что делает — анализирует скомпилированные .class — файлы. Описание команд можно найти по ссылке википедии.

Соответственно появилась идея разобрать байткоды для двух вариантов main-метода с инициализацией одинаковых строк, и попытаться прояснить почему они дают разные результаты: Вариант 1:(если сравнить str1==str2, то получаем false) public static void main(String[] args) < String str1 = new String("test"); String str2 = new String("test"); >Вариант 2:(если сравнить str3==str4, то получаем true) public static void main(String[] args) < String str3 = "test"; String str4 = "test"; >Байткод первого варианта(в квадратных скобках[] будет состояние стека после выполнения команды(вершина стека справа)): public static main([Ljava/lang/String;)V L0 LINENUMBER 5 L0 NEW java/lang/String //новая строка — кладем ссылку на класс «String «на вершину стека: [value_string] DUP //копируем ссылку на вершине стека: [value_string, value_string] LDC «test» //кладём в стек ссылку на «test» из constant pool(а если в нём еще нет ссылки на «test», //то она также остается в constant pool’e): [value_string, value_string, value_test] INVOKESPECIAL java/lang/String. (Ljava/lang/String;)V //вызов new для String с аргументами с вершины стека — //после вызова инициализирующего метода для стринг(и его внутренних манипуляций со стеком, //которые аналогично можно посмотреть в байткоде java.lang.String ) //- в стеке будет ссылка на проинициализированную строку: [value_result_string] //Почему для инициализации String(String) нужно три аргумента в стеке: //1)ссылка на входной аргумент 2)новая строка, 3)хешкод строки ASTORE 1 //сохраняем ссылку с вершины стека в локальную переменную(1) с вершины стека: [ ] L1 LINENUMBER 6 L1 NEW java/lang/String //аналогично первой строке DUP LDC «test» INVOKESPECIAL java/lang/String. (Ljava/lang/String;)V ASTORE 2 L2 LINENUMBER 7 L2 RETURN //return void — компилятор дописывает за нас если метод возвращает void L3 LOCALVARIABLE args [Ljava/lang/String; L0 L3 0 // список локальных переменных метода LOCALVARIABLE str3 Ljava/lang/String; L1 L3 1 // L1(метка где операции с локальной переменной) L3(метка где описание что это за локальная переменная) 1(номер локальной переменной) LOCALVARIABLE str4 Ljava/lang/String; L2 L3 2 // MAXSTACK = 3 //максимальная глубина стека метода MAXLOCALS = 3 //количество локальных переменных метода // //То есть сначала JRE будет выделять память при //вызове метода учитывая всю вложенность вызовов методов и new — инициализаций //(и если её не хватит — то всё вылетит с каким-нибудь OutOfMemory //эксепшном), а только потом будут производиться операции Байткод второго варианта: public static main([Ljava/lang/String;)V L0 LINENUMBER 5 L0 LDC «test» //берем ссылку на «test» из constant_pool и кладем на вершину стека: [value_test] ASTORE 1 //забираем ссылку с вершины стека в переменную(1) str1 : [ ] L1 LINENUMBER 6 L1 LDC «test» //берем ссылку на «test» из constant_pool и кладем на вершину стека: [value_test] ASTORE 2 //забираем ссылку с вершины стека в переменную(2) str2: [ ] L2 LINENUMBER 7 L2 RETURN //return void (который компилятор дописывает за нас как успешный конец метода) L3 LOCALVARIABLE args [Ljava/lang/String; L0 L3 0 //список локальных переменных, под которые выделяется память LOCALVARIABLE str1 Ljava/lang/String; L1 L3 1 //например: L1(метка где записан код) L3(метка где описан тип объекта и выделяется память) 1(локальный номер объекта) LOCALVARIABLE str2 Ljava/lang/String; L2 L3 2 // MAXSTACK = 1 //максимальная глубина стека для метода MAXLOCALS = 3 //количество локальных переменных метода

Как объяснить, что такое байткод? [закрыт]

Закрыт. На этот вопрос невозможно дать объективный ответ. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах.

Закрыт 3 года назад .

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

Отслеживать
23.4k 3 3 золотых знака 50 50 серебряных знаков 70 70 бронзовых знаков
задан 18 мая 2013 в 20:37
vanyamelikov vanyamelikov
3,113 3 3 золотых знака 30 30 серебряных знаков 59 59 бронзовых знаков
Если они не программисты, то им это не нужно. Не тратьте время.
18 мая 2013 в 20:44
18 мая 2013 в 20:45

Я сам не программист(по образованию), сейчас стоит вопрос проведения расчета охлаждения камеры сгорания ракетного двигателя. Так вот я хочу дать троим студентам эту задачу, на трех разных языках, и посмотреть у кого лучше получиться. Языки: java-среда эклипс, Си++ — Visual Studio и Visual Basic да еще и 6. Сам я его накидал в MathCAD и MathLab. Думаю должен получиться хороший эксперимент!

18 мая 2013 в 20:51

Извините за прямоту — но складывается ощушение, будто отвечающие, сами до конца не понимают, кроме @KoVadim что такое байт код. Не надо мразу минусовать! Вдумайтесь в вопросе было, что необходимо обяснить байт код, при условии понимания небольшого понятий компиляции и интерпретации! А у многих определения можно отнести как к первому, так ко второму и третьему!

19 мая 2013 в 6:05

Хотел было уже написать, но заглянул в Википедию и понял, что ничего добавить не смогу. @vanyamelikov, а Ваши коллеги эту статью читали?

19 мая 2013 в 19:50

7 ответов 7

Сортировка: Сброс на вариант по умолчанию

А нужно объяснять очень просто. Используя их положение. Для начала показываем этим инженерам программу на Java. Например, классический HelloWorld. И спрашиваем — понятно ли? Скорее всего они скажут нет. Объясняем, что и специальной программе, которая исполняет жава код, тоже не понятно. Для этого нужно «разобрать по косточкам».

Теперь делаем «псевдотрасляцию» — как для машинистки (секретарши). Для HelloWorld’а она будет такая.

  • настроить окружение (в коде этого нет, но это автоматом) — приготовить бумагу, проверить катриджи.
  • взять из памяти строку «привет мир».
  • нижимая кнопки, побуквенно ввести сроку (здесь появился цикл:) ).
  • почистить все за собой и отнести бумагу заказчику.

Формально — это и есть простой байткод. Только это человеческий байткод. А если в нем стандартизировать все операции и занумеровать, то все может быть сведено к набору чисел. Теперь к реальному байткоду перейти просто.

Легко будет объяснить и переносимость. Если человек (секретарша) выучит все коды операций, то она сможет выполнить любую работу, главное, что бы была последовательность кодов. А инженеры могут попробовать спаять-сконструировать устройство, которое будет это исполнять.

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

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