В чем разница между компилятором Just-in-time и интерпретатором? - PullRequest
31 голосов
/ 11 марта 2010

В чем различия между компилятором Just-in-time и интерпретатором, и есть ли различия между .NET и компилятором Java JIT?

Ответы [ 8 ]

33 голосов
/ 11 марта 2010

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

Из Википедии:

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

Интерпретатор выполняет программу. Это может иметь или не иметь дрожание.

Опять из Википедии:

Переводчиком может быть программа, которая либо

  1. выполняет исходный код напрямую
  2. переводит исходный код в некоторое эффективное промежуточное представление (код) и немедленно выполняет это
  3. явно выполняет сохраненный предварительно скомпилированный код, созданный компилятором который является частью переводчика система

Как стандартные дистрибутивы Java, так и .NET имеют JIT-компиляцию, но это не требуется стандартами. JIT-компилятор в .NET и C #, конечно, отличается, потому что промежуточный байт-код отличается. Принцип тот же, хотя.

32 голосов
/ 18 ноября 2014

Я всегда обнаруживал, что иногда помогает более абстрактное объяснение. Допустим, вы пытаетесь спросить всех в Мексике: «Привет. Как дела?» (ваш исходный язык ) Конечно, сначала вам нужно будет перевести его на испанский ( родной язык страны). Этот перевод будет "Привет. Como Estas?"

Если вы знаете испанский, вам не нужно переводить ( нативный код / ​​ассемблер ). Вы просто спрашиваете: «Привет. Комо есть?»

Если вы не знаете испанский, есть 3 способа справиться с этим.

Первый - это получить словарь испанского языка ( компилятор ) и посмотреть, что это за слова на испанском, прежде чем идти. Возможно, вы понимаете, что "Hola. Que tal?" на один слог короче ( оптимизация компилятора ) и используйте его вместо этого. Это языковая компиляция ; Вы заранее конвертируете информацию на родной язык.

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

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

  • Предварительный перевод означает, что вы можете задавать вопросы людям быстрее всего ( прекомпиляция ); вам даже не нужно брать с собой словарь.
  • Перевод, когда вы видите первого человека в каждой стране, почти так же быстр, как перевод заранее, но все же позволяет вам путешествовать по нескольким странам без необходимости возвращаться домой, чтобы получить словарь, но означает, что вам нужно взять с собой несколько словарей ( среда, независимая от платформы ).
  • Перевод по требованию выполняется намного медленнее, но позволяет изменять слова, не возвращаясь домой ( исходный язык распространения ).
13 голосов
/ 11 марта 2010

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

6 голосов
/ 27 сентября 2011

На вопрос о том, является ли механизм выполнения компилятором или интерпретатором, можно очень просто ответить на вопрос, что произойдет, если подпрограмма будет выполнена 1000 раз. Если код в механизме выполнения должен будет проверять какое-то конкретное представление кода 1000 раз, механизм выполнения является интерпретатором этого представления. Если код внутри исполнения, то исполняющему движку нужно будет только исследовать это конкретное представление кода меньшее количество раз (обычно, хотя и не обязательно, один раз), он является компилятором или транслятором этого представления. Обратите внимание, что механизм исполнения обычно принимает входной код и преобразовывает его в какую-то другую форму, которую можно более легко изучить. Такой механизм выполнения объединял бы компилятор или переводчик первой формы с интерпретатором последней формы.

Обратите внимание, что интерпретаторы очень редко создают какой-либо вид машинного кода. Практически единственный раз, когда интерпретатор генерирует машинный код, это когда оператор должен выполнять какую-то операцию, которую на самом деле нельзя выполнить другим способом. Например, если интерпретатор BASIC, работающий на 8080, встречает инструкцию «OUT 100,5», он обычно выполняет эту операцию, сохраняя D3 64 C9 (OUT 64h / RET) в три последовательных байта по некоторому фиксированному адресу, загружая A с помощью 5, и вызовите этот адрес. С технической точки зрения, интерпретатор может генерировать машинный код, но если нужно выполнить одну и ту же инструкцию OUT 500 раз, интерпретатору придется каждый раз заново генерировать машинный код.

2 голосов
/ 26 марта 2017

ТЛ; др

Интерпретатор : для выполнения требуется только одна инструкция за раз

Just-in-time : сразу берет блок кода и компилирует его перед выполнением. так что есть много места для оптимизации

2 голосов
/ 11 марта 2010

JIT-компилятор создает двоичные машинные коды, переводящие исходный код блока. Переводчик переводит построчно.

1 голос
/ 21 февраля 2014

При первом обращении к классу JIT Execution Engine перекомпилирует файлы .class (первичные двоичные файлы), сгенерированные компилятором Java, содержащие набор инструкций JVM, в двоичные файлы, содержащие набор инструкций системы HOST. JIT сохраняет и повторно использует эти перекомпилированные двоичные файлы из памяти в будущем, сокращая время интерпретации и преимущества от выполнения собственного кода.

С другой стороны, простой старый Java-интерпретатор интерпретирует одну инструкцию JVM из файла класса за раз и вызывает для нее процедуру.

Найти подробное сравнение здесь http://bitshub.blogspot.com/2010/01/Flavors-of-JVM.html

0 голосов
/ 11 марта 2010

Когда вы компилируете язык Microsoft.NET, компилятор генерирует код, написанный на языке Microsoft Intermediate Language (MSIL). MSIL - это набор инструкций, которые можно быстро перевести на собственный код.

Приложение Microsoft.NET может быть запущено только после перевода кода MSIL в машинный код. В .NET Framework промежуточный язык «точно вовремя» (JIT) компилируется в собственный код при запуске приложения или компонента вместо компиляции приложения во время разработки.

подробнее

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