Программное обеспечение которое интерпретирует байт код java
Перейти к содержимому

Программное обеспечение которое интерпретирует байт код java

  • автор:

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

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

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

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

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

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

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

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

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

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

JVM – что это? Как устроена виртуальная машина Java

Виртуальная машина Java («Java Virtual Machine» — JVM) — это основная часть платформы Java Runtime Environment (JRE), которая интерпретирует байт-код Java для запуска программ.

Одним из наиболее значительных преимуществ использования является использование JVM для запуска программы Java в любой операционной среде. В её основе реализуется принцип WORA (Write once, run anywhere — «написал один раз, запускай везде»), который сильно упростил процессы разработки.

Как правило, считается, что JVM имеет двойное определение — техническое и неформальное.

Техническое: JVM — это спецификация программы, которая обеспечивает среду выполнения кода Java.

Неофициальное: JVM запускает приложения Java, c помощью настроенных параметров для управления всеми программными ресурсами.

Что делает виртуальная машина Java

JVM выполняет две основные функции:

  • позволяет запускать Java-программы на любом устройстве или в любой операционной системе;
  • даёт доступ к управлению памятью программ и её оптимизации.

Поскольку JVM — это хорошо известная среда выполнения со стандартизированной конфигурацией, мониторингом и управлением, она естественным образом подходит для контейнерной разработки с использованием таких технологий, как Docker.

Роль Java Virtual Machine

Теперь давайте более подробно рассмотрим место виртуальной машины Java в выполняемых процессах.

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

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

Файл .class и байт-код

Когда дело доходит до выполнения программы, главное, что интересует виртуальную машину Java — это определённый формат файла – .class.

Файлы классов содержат наполовину скомпилированный код, называемый байт-кодом, который в свою очередь предоставляет JVM инструкции, таблицу символов и другую вспомогательную информацию.

Архитектура виртуальной машины Java

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

Java Virtual Machine состоит из трёх отдельных компонентов:

  • загрузчик классов;
  • область памяти;
  • исполнительный механизм.

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

Загрузчик классов Java бывает трёх типов:

  • BootStrap ClassLoader (Загрузчик классов начальной загрузки) — это машинный код, который запускает операцию, когда её вызывает JVM. Его задача — загрузить классы из папки rt.jar.
  • Extension ClassLoader (Загрузчик классов расширений) является дочерним элементом Bootstrap ClassLoader и загружает расширения основных классов Java из каталога jre/lib/ext или любого другого каталога, на который указывает java.ext.dirs.
  • System ClassLoader (Системный загрузчик классов) загружает классы, найденные в переменной среды CLASSPATH, -classpath или параметре командной строки -cp.
  1. Область памяти

Область памяти или, как её ещё называют, область данных времени выполнения JVM состоит из 5 частей:

  • Область метода предназначена для хранения данных файлов .class: например, метаданные, данные полей и методов, а также код метода. Область метода создаётся автоматически при запуске виртуальной машины, и для каждой ВМ существует только одна область метода.
  • Область кучи. В куче хранятся все объекты и соответствующие им переменные экземпляра. Когда мы создаём новый экземпляр класса, он сразу же загружается в область кучи, которая остается единственной во время выполнения задачи.
  • Область стека. В неё загружаются все локальные переменные, вызовы методов и частичные результаты.
  • Регистры ПК. В регистре ПК хранится адреса виртуальных машин Java, выполняющих операцию в данный момент. В Java каждый поток получает свой собственный регистр ПК.
  • Стеки нативных методов. Нативные методы — это методы, написанные на C или C++. Виртуальная машина JVM хранит стеки, которые поддерживают такие методы, с отдельным стеком собственных методов, выделенным для каждого потока.
  1. Исполнительный механизм

Этот тип программного обеспечения используется для тестирования оборудования и программного обеспечения. При этом он не сохраняет никакой информации о тестируемом продукте.

  • интерпретатора;
  • JIT-компилятора;
  • сборщика мусора.

Перед выполнением программы интерпретатор и компилятор JIT («Just-in-time» — «точно в нужное время») преобразуют байт-код в машинные инструкции. Интерпретатор делает это построчно.

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

Но за что же в таком случае отвечает сборщик мусора? В некоторых других языках программирования (таких как C++) освобождение памяти от объектов без циклических ссылок зависит лишь от самого программиста. Однако в JVM этим занимается сборщик мусора, что оптимизирует использование памяти.

Важно отметить, что сборка мусора выполняется в JVM автоматически через определённые отрезки времени и не требует отдельного внимания специалистов. Конечно, этот процесс можно попробовать принудительно запустить, вызвав System.gc(), но нет никакой гарантии, что это сработает.

Заключение

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

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

JVM интерпретирует байт-код в машинный код?

60148da26ceae145804544.png

После того как байт-код попал в jvm, jvm интерпретирует код в машинный код или просто компилирует ? Что происходит непосредственно в JVM подскажите пожалуйста

  • Вопрос задан более трёх лет назад
  • 274 просмотра

Комментировать
Решения вопроса 1

azerphoenix

Орхан Гасанлы @azerphoenix
Java Software Engineer

Здравствуйте!
Будет ли JVM компилировать или интерпретировать байт-код зависит от платформы.
Прочитайте вот, этот ресурс — Ссылка
Вот, похожий вопрос — https://qna.habr.com/q/897579?e=10433021#comment_2.

Подводя итог, в зависимости от среды исполнения байт-код может быть:
— скомпилирован заранее и выполнен как родной код (похожий на большинство компиляторов С++)
— скомпилирован (JIT) и выполнен
— интерпретирован
— напрямую выполняется поддерживаемым процессором (байт-код — это собственный набор команд некоторых процессоров)

Ответ написан более трёх лет назад
Нравится 2 2 комментария
Аркадий Виноградов @usov-dmitriy Автор вопроса

Я так понимаю что JVM использует JIT, где БАЙТ-КОД проходит некую верификацию в зависимости от железа и системы, после всех этих действий с выбором системы JIT определяет компилировать или интерпретировать БАЙТ-КОД в машинный код, все верно ?

Java: компилируемый или интерпретируемый? Сравнение с C++

Java сочетает в себе и компиляцию, и интерпретацию. Код на Java сначала преобразуется в байт-код — файлы с расширением *.class — с помощью компилятора Java. Затем гибко выполняется на различных окружениях Java-виртуальной машиной (JVM), которая может интерпретировать байт-код or JIT-компилировать его в машинный код «на лету».

// Вот Java в действии javac MyProgram.java // Компиляция: из Java-кода в байт-код java MyProgram // Исполнение: наш байт-код работает!

Следует подчеркнуть, что Java соединяет в себе подходы интерпретации и компиляции.

Компиляция и выполнение в Java: это двухшаговый танец

Когда байт-код выходит на первый план

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

JIT: открывается завеса

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

Когда интерпретация выигрывает

Некоторые JVM до сих пор предпочитают интерпретировать байт-код, особенно редко запускаемые его части. Это позволяет экономить ресурсы системы, ведь компиляция в таких случаях не требуется.

Ahead-of-Time компиляция (AOT): забегая вперед

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

Стратегия исполнения и адаптивность в Java

Гордость за оптимизацию во время исполнения

Java использует JIT, интерпретацию и временами даже AOT для оптимизации исполнения программ. Эти методы позволяют динамически загружать байт-код и управлять его выполнением, использовать рефлексию и манипуляции агентами во время работы.

Мастерство оптимизации производительности

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

Философия Java: сила в универсальности

Написал один раз, запустится везде

Принцип Java «Write once, run anywhere» (WORA) подчеркивает переносимость Java байт-кода, который способен работать на разных платформах без изменений.

Поиск идеального баланса

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

Непреходящая привлекательность Java

Java развивается вместе с технологиями, начав свой путь с простого сочетания компиляции и интерпретации, но превратившись в полноценную систему исполнения кода. Принимая новые методы компиляции, такие как AOT, Java отвечает требованиям динамичного IT-мира.

Визуализация

Java, как настоящий преобразователь (��), адаптируется в зависимости от исполняющей среды.

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

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