it-swarm.com.ru

Каковы различия между компилятором Just-in-time и интерпретатором?

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

30
Rookian

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

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

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

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

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

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

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

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

32
Mark Byers

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

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

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

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

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

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

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

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

13
crowne

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

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

6
supercat

тЛ; др

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

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

2
del bao

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

2
erasmus

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

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

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

1
bitan

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

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

больше информации

0
Kimi