Что делает компилятор JIT? - PullRequest
470 голосов
/ 18 сентября 2008

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

Ответы [ 19 ]

467 голосов
/ 18 сентября 2008

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

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

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

241 голосов
/ 18 сентября 2008

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

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

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

63 голосов
/ 29 апреля 2013

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

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

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

JIT-сценарий:

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

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

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

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

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

JIT Примеры:

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

Как уже упоминалось

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

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

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

11 голосов
/ 19 января 2018

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

enter image description here

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

enter image description here

Источник

9 голосов
/ 10 августа 2012

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

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

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

9 голосов
/ 18 сентября 2008

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

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

7 голосов
/ 27 февраля 2016

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

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

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

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

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

Еще один похожий пример - поиск шаблона с использованием «Регулярного выражения» в списке строк / предложений.

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

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

4 голосов
/ 18 сентября 2008

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

4 голосов
/ 21 марта 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...