Что делает компилятор точно в срок (JIT)?

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

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

JIT - как раз вовремя само слово говорит, когда нужно (по запросу)

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

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

сценарий JIT:

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

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

JIT против сравнения без JIT:

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

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

Примеры JIT:

  • В Java JIT находится в JVM (виртуальная машина Java)
  • В С# он находится в CLR (Common Language Runtime)
  • В Android он находится в DVM (Dalvik Virtual Machine) или ART (Android RunTime) в новых версиях.

Ответ 4

Как отмечали другие

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

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

enter image description here

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

enter image description here

Источник

Ответ 8

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

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

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

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

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

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

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

Смотрите документацию Oracle по пониманию JIT, чтобы прочитать больше.

Ответ 9

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

Ответ 10

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

Ответ 11

Jit означает как раз вовремя компилятор jit - это программа, которая превращает java-байтовый код в инструкцию, которая может быть отправлена ​​непосредственно в процессор.

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

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

Ответ 12

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

Ответ 13

В следующих примерах кода показано, как JIT оптимизирует код Java.

Код перед оптимизацией

    class A {
      B b;
      public void newMethod() {
        y = b.get();
        ...do stuff...
        z = b.get();
        sum = y + z;
      }
    }

class B {
   int value;
   final int get() {
      return value;
   }
}

После оптимизации

class A {
B b;
public void newMethod() {
   y = b.value;
   ...do stuff...
   sum = y + y;
}
}
class B {
   int value;
   final int get() {
      return value;
   }
}

Первоначально код содержал два вызова метода b.get(). После оптимизации оба вызова метода оптимизируются в одну операцию копирования переменных; то есть оптимизированный код не должен выполнять вызов метода для получения значения поля класса B.

Ответ 14

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

Компиляция ИТ представляет собой комбинацию двух традиционных подходов к переводу на машинный код - компиляция в режиме времени (AOT) и интерпретация - и объединяет некоторые преимущества и недостатки обоих. Компиляция JIT объединяет скорость скомпилированного кода с гибкостью интерпретации.

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

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

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

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

См.

Ответ 15

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

Ответ 16

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

Ответ 17

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

Ответ 18

Просто компилятор времени (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 обычно представляет собой комбинацию компилятора и интерпретатора. JIT сначала включает посреднические данные (например, байт-код Java), которые он получает на машинный язык посредством интерпретации. JIT часто может ощущать, что некоторая часть кода выполняется часто, и компиляция этой части будет выполняться быстрее.