Каково различие между реализацией компилятора и интерпретатором?

По умолчанию изображение отображается inline, как буква.

Он сидит в той же строке, на которой сидят a, b, c и d.

Существует пространство ниже этой строки для descenders, которые вы найдете на таких буквах, как f, j, p и q.

Вы можете отрегулировать vertical-align изображения, чтобы разместить его в другом месте (например, middle) или изменить display, чтобы он не был встроен.

21
задан Daniel Magliola 26 January 2009 в 15:00
поделиться

9 ответов

короткий ответ:

  • компилятор преобразовывает исходный код в формат исполняемых файлов для более позднего выполнения
  • , интерпретатор оценивает исходный код для непосредственного выполнения

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

компиляторы могут обычно оптимизировать лучше, потому что у них есть больше времени, чтобы изучить код и произвести файл для более позднего выполнения; интерпретаторы имеют меньше времени для оптимизации, потому что они имеют тенденцию выполнять код, "как" на первый взгляд

интерпретатор, который оптимизировал в фоновом режиме, узнав, что лучшие способы выполнить код также возможны

сводка: различие действительно сводится, 'готовят код к более позднему выполнению', или 'выполняют код прямо сейчас'

7
ответ дан 29 November 2019 в 21:06
поделиться

Компилятор является программой, которая переводит программу в одном языке программирования к программе в другом языке программирования. Вот именно - простой и простой.

интерпретатор переводит язык программирования в свое семантическое значение.

x86 микросхема является интерпретатором для x86 машинного языка.

Javac является компилятором для Java к виртуальной машине Java. Java, исполняемое приложение, является интерпретатором для jvm.

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

Интерпретаторы обычно, но не всегда, показывают read-eval-print цикл.

8
ответ дан 29 November 2019 в 21:06
поделиться

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

ОСНОВНОЙ был главным образом сделан этот путь.

Вы могли утверждать, что вещами, которые выполняют байт-код (java/.net), не делая JIT, являются интерпретаторы - но не в традиционном смысле, так как все еще необходимо 'скомпилировать' в байт-код.

старое школьное различие было: Если это генерирует код ЦП, это - компилятор. Если Вы выполняете его непосредственно в Вашей среде редактирования и можете взаимодействовать с ним при редактировании, это - интерпретатор.

, Который был намного менее формальным, чем фактическая книга Дракона - но я надеюсь, что это информативно.

3
ответ дан 29 November 2019 в 21:06
поделиться

программа является описанием работы, которую Вы хотите сделанный.

А компилятор преобразовывает высокоуровневое описание в более простое описание.

интерпретатор чтения описание того, что сделать и , делает работу .

  • Некоторые интерпретаторы (например, оболочки Unix) читают описание одна маленькая часть за один раз и действие на каждой части, поскольку они видят его; некоторые (например, Perl, Python) читают все описание, внутренне преобразовывают его в более простую форму и затем действуют на это.
  • Некоторые интерпретаторы (например, JVM Java или микросхема Pentium 4) только понимают очень простой язык описания, который слишком утомителен, чтобы люди работали с непосредственно, таким образом, люди используют компиляторы для преобразования их высокоуровневых описаний в этот язык.

Компиляторы никогда не делают работу. Интерпретаторы всегда делают работу.

7
ответ дан 29 November 2019 в 21:06
поделиться

Оба имеют много общего (например, лексический синтаксический анализатор) и существует разногласие по вопросам различия. Я смотрю на этот путь:

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

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

4
ответ дан 29 November 2019 в 21:06
поделиться

Если мой опыт указывает на что-нибудь;

  1. Интерпретаторы не пытаются уменьшить/обработать AST далее, каждый раз, когда на блок кода ссылаются, соответствующий узел AST пересечен и выполнен. Компиляторы пересекают блок самое большее несколько раз, чтобы сгенерировать исполняемый код в определенном месте и быть сделанными с ним.
  2. таблица символов Интерпретаторов сохраняет значения и ссылаемый, в то время как выполнение, таблица символов компиляторов сохраняет местоположения переменных. Нет такой вещи таблицы символов в то время как выполнение.

В выстреле различие может быть столь же простым как

case '+':
    symtbl[var3] = symtbl[var1] + symtbl[var2];
    break;

между,

case '+':
    printf("%s = %s + %s;",symtbl[var3],symtbl[var1],symtbl[var2]);
    break;

(Не имеет значения при предназначении для другого языка или (виртуальных) машинных команд.)

2
ответ дан 29 November 2019 в 21:06
поделиться

В отношении этой части Вашего вопроса, который действительно не рассмотрели другие ответы:

Кроме того, в которой точке понятие "виртуальной машины" включает? Для чего Вы используете виртуальную машину на языке?

Виртуальные машины как JVM или CLR являются слоем абстракции, которые позволяют Вам оптимизации JIT-компилятора повторного использования, сборка "мусора" и другая реализация детализируют для совершенно других языков, которые компилируются для работы VM.

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

2
ответ дан 29 November 2019 в 21:06
поделиться

После того как дерево синтаксического анализа доступно, существует несколько стратегий:

1) непосредственно интерпретируйте AST (Ruby, исходный интерпретатор WebKit) 2) преобразование кода-> в коды байта или машинный код

Достигнуть Редактировать-и-продолжать, счетчик команд или указатель команд должно быть повторно вычислено и перемещено. Это требует сотрудничества от IDE, потому что код, возможно, был введен прежде или после небольшой желтой стрелки.

Одним путем это могло быть сделано, должен встроить положение счетчика команд в дереве синтаксического анализа. Например, мог бы быть специальный оператор, названный "повреждением". Счетчик команд только должен быть расположен после инструкции "по повреждению" продолжить работать.

Кроме того, необходимо решить то, что Вы хотите сделать о текущем стековом фрейме (и переменные на стеке). Возможно, выталкивая текущий стек, и копируя переменные или сохраняя стек, но патч в GOTO и ВОЗВРАТЕ к текущему коду.

1
ответ дан 29 November 2019 в 21:06
поделиться

Учитывая Ваш список шагов:

  • Лексический анализатор
  • Синтаксический анализатор (который создает синтаксическое дерево),
  • Сгенерируйте Промежуточный код (как 3 адресных кода)
  • Сделайте все эти сумасшедшие вещи оптимизировать, если Вы хотите :-)
  • Генерируйте "блок" или "собственный код" из 3 адресных кодов.

Очень простой интерпретатор (как ранние ОСНОВЫ или TCL) только выполнил бы шаги одна и две одна строки за один раз. И затем выбросьте большинство результатов, продолжая к следующей строке выполняться. Другие 3 шага никогда не выполнялись бы вообще.

0
ответ дан 29 November 2019 в 21:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: