В чём разница между интерпретатором, AOT и JIT-компилятором?
Интерпретация – простое последовательное воспроизведение кода программы, команда за командой.
AOT-компиляция (ahead-of-time, статическая) – процесс превращения текста на языке программирования в нативный код на машинном языке. Так работают языки вроде C++. В современных JDK можно получить настоящий ahead-of-time скомпилированный машинный код с помощью утилиты jaotc.
JIT-компиляция (just-in-time, динамическая) – «умная» интерпретация. Среда выполнения анализирует исполняемый код, оптимизируя часто вызываемые участки. Таким способом программа работает значительно быстрее, и сохраняет при этом преимущества платформо-независимости оригинального кода. Именно с JIT-компиляцией связана необходимость «прогрева» программ перед тестированием производительности.
Эти термины относятся не только к JVM, но и ко множеству других языков программирования. Конкретно в Java байткод – интерпретируемый. Но в JVM по умолчанию работает JIT-компилятор. А процесс компиляции Java-кода в байткод можно назвать AOT-компиляцией.
Для взаимодействия с JIT-компилятором из кода в JDK поставляется класс java.lang.Compiler . Его методом disable() можно отключить JIT и перевести программу в режим простой интерпретации. Сейчас этот класс объявлен устаревшим и готовится к удалению.
Более красивый способ влиять на компилятор – передавать его настройки параметрами JVM. Параметр -Djava.compiler=NONE также переключит программу с JIT на интерпретатор. В теории, через этот же параметр можно подключить другой JIT-компилятор, альтернативный встроенному в JVM.
JIT-компиляция: что это за система, принцип работы и виды
JIT-компиляция — это способ динамической компиляции, которая запускается после запуска программы и компилирует ее код « на лету » . JIT-компиляторы преобразуют код высокоуровневых языков в инструкции , понятные виртуальной машине или процессору.
Языки высокого уровня созданы для того , чтобы ими было удобно программировать. Их вообще не понимает компьютер. Для того чтобы он стал их понимать , существуют специальные программы-преобразователи, они же компиляторы. Компилятор преобразует очеловеченный код высокоуровневого языка в двоичный код для компьютеров.
Что такое JIT-ко м пиляция
- не весь код сразу компилируется в машинный, а только необходимая часть , — это снижает нагрузку на процессор;
- машинный код генерируется во время выполнения программы, значит , он будет изначально оптимизирован под архитектуру устройства, что позволит делать кроссплатформенные программы.
- для Java JIT находится внутри виртуальной машины Java;
- для C# JIT-компилятор находится внутри CL R ( Common Language Runtime);
- в Андроиде — DVM или ART;
- и др.
Принцип JI T ( Just-in-Time)
- С1 — компилирует 3 первых уровня;
- С2 — компилирует 4-й уровень компиляции.
Заключение
JIT — это способ ускорить работу приложений, но с затратами памяти устройства. JIT-компилятор самостоятельно анализирует наиболее часто используемые участки программы и преобразует их в байт-код заранее. На этом и построен процесс ускорения такой компиляции. О ее эффективности можно говорить долго, но самый показательный момент, что JIT-компиляция — это хорош е е возвращение в Android.
Изначально виртуальная машина в Андроиде (DVM) работала по технологии JIT. Но пото м разработчики Андроид решили отказаться от JIT в пользу новомодной виртуальной машины ART, которая не содержала JIT. Спустя какое-то время « чистая » ART себя н е оправдала, поэтому было решено снова внедрить в Андроид JIT, что и было сделано в последних версиях.
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Что такое компилятор Just-In-Time (JIT) в Java?
Компилятор Just-In-Time (JIT) является компонентом JRE (Java Runtime Environment), который повышает производительность приложений Java во время выполнения. Это помогает повысить производительность Java-программ путем компиляции байт-кодов в собственный машинный код во время выполнения.
Как работает компилятор JIT
На практике методы не компилируются при первом вызове. Для каждого метода виртуальная машина Java поддерживает счетчик вызовов, который увеличивается каждый раз при вызове метода. JVM интерпретирует метод, пока его счетчик вызовов не превысит порог компиляции Just-In-Time. Поэтому часто используемые методы компилируются вскоре после запуска виртуальной машины Java, а менее используемые методы скомпилируются намного позже или вообще не выполняются. Порог компиляции Just-In-Time помогает быстрому запуску JVM и по-прежнему имеет улучшенную производительность. Порог был тщательно выбран для обеспечения оптимального баланса между временем запуска и долгосрочной эксплуатацией.
Преимущества компилятора Just-In-Time (JIT)
Усовершенствования в технологии компилятора могут повлиять на существующие программы. Напр. Лучший компилятор «C» не поможет вам уже с уже развернутыми ранее программами. Лучший JIT-компилятор улучшит производительность существующих программ. Итак, код Java, который вы написали годы назад, будет работать быстрее сегодня.
Нативные изображения загружаются быстрее, потому что они не имеют много начальных действий и требуют статического количества меньше памяти
Недостатки компилятора Just-In-Time (JIT)
Компилятор Just-In-Time (JIT) повышает уровень непредсказуемости и сложности в Java-программе. Он добавляет еще один уровень, который программисты не понимают и не контролируют.
JIT-компиляторы имеют намного больше накладных расходов на память, поскольку им необходимо загрузить компилятор и интерпретатор в дополнение к библиотекам времени выполнения и скомпилированному коду, который требуется для выполнения компилируемой программы, выполняемой заранее.
Большие приложения обычно выигрывают от компиляции времени ожидания (AOT), а мелкие — вообще нет.
Что такое JIT-компиляция?
![]()
JIT-компиляция – это метод повышения производительности интерпретируемых программ. JIT расшифровывается как Just-in-time. Во время выполнения программа может быть скомпилирована в машинный код для повышения ее производительности. Также этот метод известен как динамическая компиляция.
Динамическая компиляция имеет несколько преимуществ перед статической. При запуске приложений на 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 компилирует код в байт-код, а затем интерпретатор интерпретирует этот байт-код построчно, переводя его в машинный код, и выполняет его).
Кроме того, при следующем вычислении функции тот же скомпилированный код выполняется снова, в отличие от обычной интерпретации, когда код повторно интерпретируется построчно. Это значительно ускоряет процесс выполнения программы.
