JIT – своеобразный метод динамического компилирования кода. Активируется непосредственно после запуска исходного программного обеспечения. Компилирует «на лету», в режиме реального времени. JIT – это just in time.
Далее предстоит познакомиться с этой особенностью работы с программным кодом более подробно. Эта информация пригодится как новичкам, так и уже более опытным разработчикам.
JIT – это…
JIT – это выполнение кода и его компиляция по принципу «just in time». Соответствующая операция подразумевает компилирование кода не до выполнения программного обеспечения, а тогда, когда это необходимо.
JIT-компиляторы занимаются преобразованием кода высокоуровневых языков в специальные инструкции, понятные виртуальным машинам и процессорам. Приложение из состояния «понятное человеку» переходит в машинный код.
Языки высокого уровня были созданы специально для того, чтобы было проще разрабатывать программное обеспечение. Они понятный пользователю, но не компьютерам и другому оборудованию. Чтобы исходный код программы стал понятен «машине», его необходимо грамотно преобразовать в двоичную форму. В этом помогают приложения-преобразователи или компиляторы.
Технологии JIT базируются на двух концепциях относительно среды выполнения:
- компиляция байт-кода;
- динамическое компилирование.
Поддерживает применение адаптивной оптимизации, а также динамической рекомпиляции. Предлагает более высокую производительность, чем статическое преобразование программного кода.
Свойства
Рассматриваемый процесс предусматривает несколько свойств:
- Поэтапное компилирование приложения. «Формируется» не сразу все программное обеспечение, а только необходимый на данный момент фрагмент. Этот прием позволяет значительно снизить нагрузку на процессор, особенно в крупных проектах.
- Машинный код будет генерироваться непосредственно во время выполнения приложения. Этот прием позволяет добиться оптимизации под архитектуру используемого оборудования, что способствует формирования кроссплатформенных продуктов.
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!