Что делает JIT-компилятор?

Я просто смотрел видео Google IO, и они говорили о JIT-компиляторе, который они включили в Android. Они продемонстрировали демонстрацию улучшения производительности благодаря JIT-компилятору. Мне было интересно, что именно делает JIT-компилятор, и я хотел услышать от разных людей.

Итак, в чем заключается обязанность JIT-компилятора?


person mehmet6parmak    schedule 25.05.2010    source источник
comment
возможный дубликат Что делает JIT компилятор делать?   -  person msanford    schedule 20.08.2013


Ответы (9)


Код Java обычно распространяется как байт-код, который является машинно-независимым псевдокодом. (Та же идея ранее использовалась в системе UCSD-p, разработанной в 70-х годах.) Преимущество этого состоит в том, что одно и то же приложение можно запускать на разных процессорах и в разных операционных системах. Кроме того, байт-код часто меньше, чем у скомпилированного приложения.

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

Другой подход - компиляция HotSpot. Сначала он запускается как интерпретатор, но затем определяет, какие процедуры используются чаще всего, и компилирует только те. Преимущество состоит в том, что нет начальной задержки из-за компиляции. Кроме того, компилятор HotSpot может выполнять профилирование во время выполнения, а затем производить более сильную оптимизацию для наиболее важных подпрограмм. Он может даже собирать информацию, чтобы, когда вы запускаете одно и то же приложение снова и снова, оно будет работать все быстрее и быстрее. Дополнительную информацию о компиляции HotSpot можно найти в этой статье (tnx Пангея по ссылке).

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

Обновить

Файлы байт-кода Python имеют расширение .py. Когда вы выполняете файл байт-кода, JIT-компилятор Python создает скомпилированный файл .pyc. В следующий раз, когда вы запустите ту же программу, если файл .py не изменился, нет необходимости компилировать его снова, вместо этого Python запускает ранее скомпилированный файл .pyc. Это ускоряет запуск программы.

person PauliL    schedule 25.05.2010
comment
@PauliL: если JIT преобразует байт-код в машинно-понятный формат, то как же независимость от платформы байт-кода? - person Sharda Prasad Jaiswal; 25.04.2016
comment
@ShardaPrasadJaiswal: байт-код не зависит от платформы. Компилятор JOT компилирует его в собственный код вашего компьютера при запуске программы. - person PauliL; 27.01.2018

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

person David M    schedule 25.05.2010

Это своевременный компилятор, находящийся на полпути между интерпретатором и компилятором (т.е. он компилируется, но только непосредственно перед выполнением кода).

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

Для получения дополнительной информации, как всегда, см. Википедию:

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

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

person Skilldrick    schedule 25.05.2010

JIT = Как раз вовремя. Это процесс, посредством которого программа, которая иначе была бы интерпретирована (например, байт-коды Java или код Javascript), преобразуется в собственный машинный код на лету во время работы для повышения производительности.

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

Этот вопрос может содержать дополнительную информацию: Как JIT-компилятор помогает производительности приложений?

person Paolo    schedule 25.05.2010

Итак, в чем заключается обязанность JIT-компилятора?

Как уже упоминалось, это сокращение от «Just In Time», что в этом смысле означает «как раз вовремя для исполнения».

Когда вы компилируете программы в машинный код, они часто ориентированы на определенную платформу.

Поэтому JIT был «изобретен», вы хотите скомпилировать последние фрагменты кода для исполняющей платформы, поэтому рассматривайте это как компилятор / оптимизатор «перед выполнением».

JIT упрощает нашу жизнь и (надеюсь) ускоряет работу наших приложений.

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

person Filip Ekberg    schedule 25.05.2010

Довольно красивое объяснение:

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

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

Компилятор JIT можно отключить, и в этом случае будет интерпретироваться вся программа Java. Отключение JIT-компилятора не рекомендуется, кроме как для диагностики или решения проблем JIT-компиляции ".

Источник: https://www-01.ibm.com/support/knowledgecenter/SSYKE2_7.0.0/com.ibm.java.aix.71.doc/diag/understanding/jit_overview.html

person Antea    schedule 02.07.2015

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

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

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

person Ovidiu Pacurar    schedule 25.05.2010

Компилятор Just-In-Time (JIT) - это компонент среды выполнения Java ™, улучшающий производительность приложений Java во время выполнения.

См. Документацию IBM здесь.

Интерпретатор в основном делает это:

  1. Прочитать следующий байт-код для выполнения
  2. Посмотрите, что такое байт-код, и найдите соответствующие ему машинные инструкции.
  3. Выполнить собственные машинные инструкции
  4. Перейти к шагу 1

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

  1. Прочтите все байт-коды для метода, который необходимо выполнить
  2. Преобразуйте все эти байт-коды в собственные машинные инструкции
  3. Выполнить сгенерированные машинные инструкции

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

Кроме того, JIT выполняет множество оптимизаций для создания машинного кода, который работает как можно быстрее.

person Aniket Thakur    schedule 05.08.2013
comment
На этот вопрос уже был дан ряд достойных ответов; не уверен, зачем нужно копировать и вставлять существующий контент. - person Andrew Barber; 06.08.2013
comment
@AndrewBarber Я столкнулся с этим вопросом и не нашел четкого упоминания о том, что JIT является своего рода альтернативой интерпретатору. Только после того, как я провел еще несколько исследований, я получил четкое представление об этом и опубликовал его только для того, чтобы он мог помочь другим. Особенно полезна документация IBM. - person Aniket Thakur; 06.08.2013
comment
Два из трех наиболее часто задаваемых ответов касались сравнения с переводчиками. - person Andrew Barber; 06.08.2013
comment
@AniketThakur поддержал. ^ - person Aniket Kapse; 13.02.2015

Сомневайтесь, сэр, если javac является компилятором Java, его роль заключается в преобразовании исходного кода в байтовый код. Класс, а затем .class (байтовый код) интерпретируется интерпретатором Java (Java) средствами JVM, а JIT является частью JVM, тогда что его фактическая работа

person Amit Kumar Jha    schedule 26.08.2016