JIT – своеобразный метод динамического компилирования кода. Активируется непосредственно после запуска исходного программного обеспечения. Компилирует «на лету», в режиме реального времени. JIT – это just in time.

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

JIT – это…

JIT – это выполнение кода и его компиляция по принципу «just in time». Соответствующая операция подразумевает компилирование кода не до выполнения программного обеспечения, а тогда, когда это необходимо.

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

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

Технологии JIT базируются на двух концепциях относительно среды выполнения:

  • компиляция байт-кода;
  • динамическое компилирование.

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

Свойства

Рассматриваемый процесс предусматривает несколько свойств:

  1. Поэтапное компилирование приложения. «Формируется» не сразу все программное обеспечение, а только необходимый на данный момент фрагмент. Этот прием позволяет значительно снизить нагрузку на процессор, особенно в крупных проектах.
  2. Машинный код будет генерироваться непосредственно во время выполнения приложения. Этот прием позволяет добиться оптимизации под архитектуру используемого оборудования, что способствует формирования кроссплатформенных продуктов.

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

«Классическое» компилирование осуществляется еще до того, как программа «стартует». В этом случае сразу весь код компилируется в отдельный документ/файл. Типичный пример – это .exe в операционных системах Windows.

Вот еще несколько примеров JIT:

  • в Java JIT поддерживается внутри виртуальной машины;
  • у C# JIT реализован через CRL;
  • Android предлагает его в DVM и ART.

Проекты RPython, libJIT, LLVM могут быть использованы для создания just-in-time интерпретаторов любого скриптового языка.

Нюансы реализации

JIT-компиляция может быть применена не только ко всему программному обеспечению, но и к отдельным его частям. Пример – текстовые редакторы. Они способны «на лету» компилировать регулярные выражения для обеспечения более быстрого поиска данных. При помощи AOT-компилирования подобного результата добиться не дается для некоторых ситуаций. К ним относят моменты, при которых данные предоставляются непосредственно во время исполнения программы.

JIT встречается в:

  • JRE (Java);
  • Net.Framework;
  • JavaScript;
  • Pypy (так называется одна из реализаций Python).

Самые распространенные интерпретаторы популярных языков разработки Python, Perl, PHP, Ruby и им подобным тоже поддерживают рассматриваемую «технологию». В них она реализована ограниченной или неполно.

Основная часть реализации just-in-time обладает последовательной структурой. Сначала программа формируется в байт-код виртуальной машины среды исполнения (AOT-компилирование), затем just-in-time компилирует байт-код непосредственно в машинный. Результатом становится то, что при запуске программного обеспечения затрачивается лишнее время. Оно компенсируется более быстрой работой контента.

Принципы just-in-time

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

Изучаемая концепция имеет один недостаток – это необходимость хранения уже «готовых» фрагментов проекта. Соответствующие блоки будут располагаться непосредственно в памяти устройства. Быстродействие ПО при just-in-time «технологии» достигается за счет увеличенного потребления памяти оборудования.

Рассматриваемый процесс является достаточно сложным для описания простыми словами. Каждый язык разработки имеет собственный компилятор, работающий по принципу just-in-time. Далее поверхностно предстоит разобраться с вариантом для Java.

Пример just-in-time в Java

Для Java рассматриваемый процесс является четырехуровневым. Компилирование может происходить на одном из 4-х уровней сложности. Чем выше соответствующий показатель, тем сложнее сам процесс. И тем больше времени он отнимает для реализации. Данный момент покрывается за счет более быстрой работы проекта, чем при компиляции на «низком» уровне.

Уровень «формирования» приложения выбирается в Java автоматически. Это происходит для каждого отдельно взятого участка проекта. Разработчики способны только выбирать вид just-in-time:

  • c1 – отвечает за первые 3 уровня;
  • c2 – формирует 4-ый уровень.

Для несложных и небольших проектов рекомендуется пользоваться c1 production. Этот прием позволяет добиться более быстрого старта. Дальнейшее быстродействие остается на второстепенном уровне.

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

Историческая справка

Первая реализация just-in-time может относиться к LISP, которая написана McCarthy в 1960 году. Мужчина в своей книге упоминает функции, которые компилируются во время реализации, избавив разработчиков и устройства от надобности вывода работы компиляторов на перфокарты.

Еще одно раннее упоминание рассматриваемой «технологии» относится к Кену Томпсону. Он в 1968 году использовал регулярные выражения для поиска подстрок в текстовых редакторах QED. Для того чтобы ускорить алгоритм, мужчина использовал компиляцию регулярных выражений в машинный код IBM 7094.

Метод непосредственного получения скомпилированного проекта был выдвинут Митчелом. Это произошло в 1970 году. Тогда Митчел реализовывал экспериментальный язык LC.

В 1983 году началось стремительное развитие just-in-time. «Пионером» в этом области стал Smalltalk. Перевод в машинный «вид» выполнялся непосредственно по требованию, после чего кэшировался для применения в будущем. Если память заканчивалась, система удаляла некоторую часть кэша из оперативной памяти, восстанавливая по мере необходимости. В основном «технология» использовалась при разработке на Self, который был всего в 2 раза медленней C.

Дальнейшие исследования just-in-time начались в размах Java. В 1993 году JIT стал официальным термином. Теперь он поддерживается почти по всех JVM и стремительно развивается.

Здесь можно увидеть наглядный пример работы JIT в PHP. Лучше и быстрее разобраться в соответствующей теме помогут специализированные дистанционные компьютерные курсы. Пример – от OTUS.

Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в Otus!