Вопрос

Что конкретно делает JIT-компилятор в отличие от компилятора, отличного от JIT?Кто-нибудь может дать краткое и понятное описание?

Это было полезно?

Решение

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

Это в отличие от традиционного компилятора, который компилирует ВСЕ перевод кода на машинный язык до того, как программа запускается в первый раз.

Перефразируя, обычные компиляторы создают всю программу в виде EXE-файла ПЕРЕД первым ее запуском.Для программ более нового стиля сборка генерируется с использованием псевдокода (p-code).Только после того, как вы запустите программу в операционной системе (например, дважды щелкнув по ее значку), запустится компилятор (JIT) и сгенерирует машинный код (m-code), который поймет процессор на базе Intel или что-то еще.

Другие советы

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

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

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

JIT- Точно в срок само слово говорит, когда это необходимо (по требованию)

Типичный сценарий:

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

Сценарий JIT:

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

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

Сравнение JIT и Не-JIT:

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

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

Примеры JIT:

  1. В Java JIT находится в JVM (виртуальной машине Java).
  2. В C # это происходит в CLR (Common Language Runtime).
  3. В Android это происходит в DVM (виртуальная машина Dalvik) или ART (среда выполнения Android) в более новых версиях.

Как уже упоминали другие

JIT расшифровывается как Jit-in-Time, что означает, что код компилируется тогда, когда это необходимо, а не перед выполнением.

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

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

JIT-компилятор только компилирует байт-код в эквивалентный машинный код при первом выполнении.При каждом последующем выполнении JVM просто использует уже скомпилированный машинный код для оптимизации производительности.

enter image description here

Без JIT-компилятора интерпретатор JVM переводит байтовый код построчно, чтобы он выглядел так, как будто выполняется собственное приложение.

enter image description here

Источник

JIT расшифровывается как Jit-in-Time, что означает, что код компилируется тогда, когда это необходимо, а не перед выполнением.

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

После того, как байт-код (который не зависит от архитектуры) был сгенерирован компилятором Java, выполнение будет обработано JVM (на Java).Байтовый код будет загружен загрузчиком в JVM, а затем каждая байтовая инструкция будет интерпретирована.

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

JIT-компиляторы работают только во время выполнения, поэтому у нас нет никаких двоичных выходных данных.

Компилятор Just In Time (JIT) :
Он компилирует байт-коды Java в машинные инструкции этого конкретного процессора.

Например, если у нас есть оператор цикла в нашем java-коде :

while(i<10){
    // ...
    a=a+i;
    // ...
 }

Приведенный выше код цикла выполняется 10 раз, если значение i равно 0.

Нет необходимости компилировать байт-код 10 раз снова и снова, так как одна и та же инструкция будет выполняться 10 раз.В этом случае необходимо скомпилировать этот код только один раз, и значение может быть изменено необходимое количество раз.Итак, компилятор Just In Time (JIT) отслеживает такие операторы и методы (как было сказано выше ранее) и компилирует такие фрагменты байтового кода в машинный код для повышения производительности.

Другим подобным примером является поиск шаблона с использованием "Регулярного выражения" в списке строк / предложений.

JIT-компилятор не компилирует весь код в машинный код.Он компилирует код, который имеет аналогичный шаблон во время выполнения.

Видишь это Документация Oracle по пониманию JIT чтобы прочитать больше.

У вас есть код, который скомпилирован на какой-нибудь IL (промежуточный язык).Когда вы запускаете свою программу, компьютер не понимает этот код.Он понимает только машинный код.Таким образом, JIT-компилятор компилирует ваш IL в машинный код "на лету".Он делает это на уровне метода.

Я знаю, что это старый поток, но оптимизация времени выполнения - еще одна важная часть JIT-компиляции, которая, похоже, здесь не обсуждалась.По сути, JIT-компилятор может отслеживать программу по мере ее выполнения, чтобы определить способы улучшения выполнения.Затем он может вносить эти изменения "на лету" - во время выполнения.Оптимизация Google JIT (javaworld обладает довольно хорошая статья об этом.)

Jit расшифровывается как just in time compiler jit - это программа, которая превращает байтовый код Java в инструкцию, которая может быть отправлена непосредственно процессору.

Использование компилятора java just in time (на самом деле второго компилятора) на конкретной системной платформе приводит байт-код в соответствие с конкретным системным кодом, после того как код был повторно скомпилирован jit-компилятором, он обычно будет выполняться на компьютере быстрее.

Компилятор just-in-time поставляется вместе с виртуальной машиной и используется необязательно.Он компилирует байт-код в исполняемый код для конкретной платформы, который немедленно выполняется.

Компилятор точно в срок (JIT) - это часть программного обеспечения, которая принимает неисполняемые входные данные и возвращает соответствующий машинный код для выполнения.Например:

Intermediate representation    JIT    Native machine code for the current CPU architecture

     Java bytecode            --->        machine code
     Javascript (run with V8) --->        machine code

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

Разница между компилятором, интерпретатором и JIT

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

  1. Компилятор:Принимает исходный код и возвращает исполняемый файл
  2. Переводчик:Выполняет программу инструкция за инструкцией.Он берет исполняемый сегмент исходного кода и превращает этот сегмент в машинные инструкции.Этот процесс повторяется до тех пор, пока весь исходный код не будет преобразован в машинные инструкции и выполнен.
  3. ДЖИТ:Возможно множество различных реализаций JIT, однако JIT обычно представляет собой комбинацию комплизатора и интерпретатора.Промежуточные данные JIT first turn (например,Байт-код Java), который он переводит на машинный язык посредством интерпретации.JIT часто может определить, когда определенная часть кода выполняется часто, и скомпилирует эту часть для более быстрого выполнения.

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

компиляция точно в срок (JIT) (также динамическая трансляция или компиляция во время выполнения) - это способ выполнения компьютерного кода это включает компиляцию во время выполнения программы – во время выполнения – вместо того, чтобы предшествовать исполнению.

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

Давайте рассмотрим JIT, используемый в JVM,

Например, JIT-компиляторы HotSpot JVM генерируют динамическую оптимизацию.Другими словами, они принимают решения по оптимизации во время работы Java-приложения и генерируют высокопроизводительные машинные инструкции ориентирован на базовую системную архитектуру.

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

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

Ссылаться :

20% байтового кода используется в 80% случаев.JIT-компилятор получает эту статистику и оптимизирует эти 20% байт-кода для ускорения работы, добавляя встроенные методы, удаляя неиспользуемые блокировки и т.д., А также создавая байт-код, специфичный для этой машины.Я цитирую из этой статьи, я обнаружил, что это было удобно. http://java.dzone.com/articles/just-time-compiler-jit-hotspot

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

JVM фактически выполняет этапы компиляции во время выполнения по соображениям производительности.Это означает, что в Java нет четкого разделения компиляции и выполнения.Сначала он выполняет так называемую статическую компиляцию из исходного кода Java в байт-код.Затем этот байт-код передается в JVM для выполнения.Но выполнение байт-кода происходит медленно, поэтому JVM измеряет, как часто выполняется байт-код, и когда она обнаруживает "горячую точку" кода, которая выполняется очень часто, она выполняет динамическую компиляцию из байт-кода в машинный код кода "горячей точки" (hotspot profiler).Настолько эффективно сегодня Java-программы запускаются с помощью выполнения машинного кода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top