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

И есть также другая технология, которая иногда тесно связана с javalang, но в настоящее время становится все более и более развязанной, называется виртуальная машина Java (сокр. JVM).

Чтобы понять больше о JVM, сначала нам нужно немного узнать ее историю. JVM была создана из-за требований к javalang, переносимость которых является одной из основных задач. Еще в начале 90-х распространенным вариантом выполнения скомпилированных языков было скомпилировать их сначала в машиночитаемые коды для каждой конкретной платформы. Поэтому, если нам нужна переносимость, мы должны использовать интерпретируемые языки, но это на порядок (-и) медленнее.

В качестве решения этой проблемы была создана JVM. JVM - это абстрактная виртуальная машина, используемая в качестве цели компиляции для javalang. Это означает, что мы компилируем наши коды javalang в коды, которые понимает JVM (вместо того, чтобы компилировать их в несколько конкретных машиночитаемых кодов). Если вы уже знакомы с javalang, мы используем для этой цели компилятор javac.

Коды, которые понимает JVM, называются байт-кодом Java, по сути, промежуточным представлением (сокр. IR) наших кодов javalang. Байт-код Java переносим, ​​его можно перемещать на разные машины и выполнять без перекомпиляции.

Если вы раньше работали с .NET, у них также есть виртуальная машина, аналогичная JVM, под названием Common Language Runtime (abbr: CLR). Таким образом, подобная техника выполнения кода характерна не только для Java.

Компоненты JVM

В качестве цели компиляции и виртуальной машины JVM пытается имитировать наш компьютер в своей архитектуре, например, имея систему управления памятью и регистрацию.

В JVM есть 3 основных компонента:

  1. Загрузчик классов
  2. Область данных времени выполнения
  3. Механизм исполнения

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

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

И наконец, что, пожалуй, наиболее важно, механизм выполнения, отвечающий за выполнение байт-кодов. Он содержит интерпретатор, оперативный компилятор (сокр. JIT-компилятор) и сборщик мусора.

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

Языки JVM

С чисто технической точки зрения JVM понимает байт-код java, но совсем не понимает javalang. Поэтому мы можем рассматривать javalang и JVM как отдельные объекты. Фактически, когда использование JVM становится все более распространенным, а его функции и производительность становятся более мощными, появляются реализации других языков программирования, помимо javalang, которые могут быть скомпилированы в байт-код java. Некоторые из наиболее известных примеров - Scala, Kotlin, Clojure, JRuby и Jython.

Резюме

  1. JVM - это абстрактная виртуальная машина, работающая поверх вашего компьютера.
  2. JVM действует как цель компиляции для языков JVM. Первый созданный язык JVM - это javalang.
  3. JVM понимает и может выполнять байт-код java.
  4. JVM состоит из трех основных компонентов: загрузчика классов, области данных времени выполнения и механизма выполнения. Как виртуальная машина, JVM пытается имитировать наши компьютеры по своей архитектуре.
  5. Существуют также языки, отличные от javalang, которые можно скомпилировать в байт-код java, называемые языками JVM.