Что такое JIT-компиляция?

JIT-компиляция – это метод повышения производительности интерпретируемых программ. JIT расшифровывается как Just-in-time. Во время выполнения программа может быть скомпилирована в машинный код для повышения ее производительности. Также этот метод известен как динамическая компиляция.

icon strelka icons icons

узнай больше на курсе

Python программист с нуля
Напиши первый код и собери проекты на Python: 4 месяца онлайн в своём темпе, практика и сертификат. Смотри программу и тарифы.
Подробнее о курсе
Java-разработчик с нуля
Освой Java, ООП и Spring и собери первые проекты: 4 месяца онлайн, практика с проверкой и сертификат. Смотри программу и тарифы.
Подробнее о курсе
C# разработчик с нуля
Освой C# и .NET и собери первые приложения: 4 месяца онлайн, практика с проверкой заданий и сертификат. Смотри программу и тарифы.
Подробнее о курсе
JIT

Динамическая компиляция имеет несколько преимуществ перед статической. При запуске приложений на JAVA или C# среда выполнения может профилировать приложение во время его исполнения. Это позволяет создавать более оптимизированный код. Если поведение приложения меняется во время его исполнения, то среда выполнения может перекомпилировать код.

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


Обзор

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

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

Впервые динамическая компиляция была описана в статье о языке LISP Дж. Маккарти в 1960 году.

Компиляция на лету, JIT или динамическая компиляция – это компиляция, которая выполняется непосредственно во время исполнения программы, а не до этого. Что в этот момент происходит? Перевод в машинный код. Преимущества JIT-компиляции заключаются в том, что поскольку компиляция происходит во время выполнения, то JIT-компилятор имеет доступ к динамической информации времени выполнения, а это в свою очередь позволяет ему оптимизировать процесс (например, встраивать функции).

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

В качестве примеров JIT-компиляторов можно привести JVM (Java Virtual Machine - виртуальная машина Java) на Java и CLR (Common Language Runtime – общеязыковая исполняющая среда) на C#.


История

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

В какой-то момент эволюции языков компиляторы начали компилировать язык высокого уровня в псевдокод, который затем интерпретировался (интерпретатором) для запуска программы. Это исключило объектный код и исполняемые программы и позволило перенести эти языки на несколько операционных систем и аппаратных платформ. Одним из первых был Pascal (который скомпилирован в P-Code); более современными примерами являются Java и C#. Со временем термин P-Code был заменен на байт-код, поскольку большинство псевдоопераций имеют длину в один байт.

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

Обычный сценарий

Исходный код полностью преобразуется в машинный код.

JIT-сценарий

Исходный код преобразуется в структуру на языке ассемблера, например, IL (промежуточный язык) для C#, ByteCode для Java.

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

JIT или не JIT

При JIT-компиляции не весь код преобразуется в машинный код. Для начала преобразуется только необходимая часть кода. Затем, если вызываемый метод или выполняемые функции находятся не в виде машинного кода, то они тоже будут преобразованы в машинный код. Это снижает нагрузку на ЦП. Поскольку машинный код будет генерироваться во время выполнения, то JIT-компилятор создаст машинный код, оптимизированный для запуска архитектуры ЦП машины.

Ниже приведены некоторые примеры JIT-компиляторов:

  • Java: JVM (Java Virtual Machine – виртуальная машина Java)
  • C#: CLR (Common Language Runtime – общеязыковая исполняющая среда)
  • Android: DVM (Dalvik Virtual Machine – виртуальная машина Dalvik) или ART (Android RunTime – среда выполнения Android-приложений) в новых версиях

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

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

Ссылка
скопирована
Получите бесплатные уроки на наших курсах
Все курсы
icon strelka icons icons

узнай больше на курсе

Python программист с нуля
Напиши первый код и собери проекты на Python: 4 месяца онлайн в своём темпе, практика и сертификат. Смотри программу и тарифы.
Подробнее о курсе
Java-разработчик с нуля
Освой Java, ООП и Spring и собери первые проекты: 4 месяца онлайн, практика с проверкой и сертификат. Смотри программу и тарифы.
Подробнее о курсе
C# разработчик с нуля
Освой C# и .NET и собери первые приложения: 4 месяца онлайн, практика с проверкой заданий и сертификат. Смотри программу и тарифы.
Подробнее о курсе
Фронтенд-разработчик с нуля
Освой HTML, CSS и JavaScript и свёрстай первые сайты: 4 месяца онлайн, практика и портфолио с сертификатом. Смотри программу.
Подробнее о курсе
Разработка приложений на Flutter и Dart
Собери кроссплатформенное приложение на Flutter и Dart: 2 месяца онлайн, практика и сертификат. Смотри программу и тарифы.
Подробнее о курсе
Автоматизированное тестирование на Python
Напиши автотесты на Python с Pytest и Selenium: 4 месяца онлайн, практика на реальных проектах и сертификат. Смотри программу.
Подробнее о курсе
Еще по теме:
Разбираем, какую AI-модель выбрать под задачу: ChatGPT, Claude, Gemini или NotebookLM - их сильные стороны и ограничения
Почему диалог с ИИ снижает продуктивность и как перейти к декларативному управлению задачами вместо бесконечных чат-сессий
Простое объяснение 20 базовых концепций искусственного интеллекта: от нейросетей до агентов и RAG без сложных терминов.
Разбираем причины выгорания senior Android разработчиков: скрытая нагрузка, архитектурные решения и рост требований в экосистеме
Разбираем goroutine, mutex и waitgroup в Go на практическом примере с подсчетом частоты слов и параллельной обработкой данных.
ОСЕННИЕ СКИДКИ
30%
40%
50%
До конца акции: 30 дней 24 : 59 : 59