2010-03-11 2 views
27

В чем разница между компилятором Just-in-Time и интерпретатором и существуют ли различия между компилятором .NET и Java JIT?Каковы различия между компилятором Just-in-Time и интерпретатором?

+2

Ваше название вопроса не соответствует тексту вопроса. Как Java, так и .NET сбиты, ни интерпретируются. – Aaronaught

+0

он служил вторым вопросом – Rookian

+3

, тогда вы должны задать его как второй, другой вопрос. Таким образом, вы просто путаете людей. – Oded

ответ

29

Just-in-time compilation - это преобразование неродного кода, например байт-кода, в собственный код непосредственно перед его выполнением.

Материал из Википедии:

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

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

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

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

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

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

+0

Содержит ли JIT-компилятор CLR код WHOLE один раз или нет? – Rookian

+3

Нет, он компилирует только необходимый код. Это дает вам возможность оптимизировать во время выполнения. – Kimi

+0

Но процесс оптимизации за вызов происходит только один раз, не так ли (.NET JIT)? Поскольку я красным, .NET JIT компилирует мир кода только один раз. – Rookian

9

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

+0

Ваш ответ связан с Java JIT Compiler, не так ли? – Rookian

+0

Yup, но я считаю, что техника JIT была впервые разработана на smalltalk. – crowne

+0

Итак, JIT заставляет программу быстрее работать, пока она работает? – Aerovistae

1

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

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

more info

2

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

6

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

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

1

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

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

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

22

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

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

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

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

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

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

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

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

0

Т.Л., др

Переводчик: принимает только одну команду в то время для выполнения

Просто по времени: берет блок кода сразу и скомпилировать его, прежде чем выполнить , поэтому у вас есть достаточно места для оптимизации