Правильно ли мое понимание интерпретатора и компилятора? - PullRequest
0 голосов
/ 27 марта 2011

Мне было интересно, если мое понимание о интерпретаторе и компиляторе правильно:

  1. Я думаю, что компилятор только переводит из исходного кода в двоичный код, а переводчик не только работает переводчик, но и также выполнить то, что генерируется после компиляции.
  2. Всегда ли у переводчика есть часть для компиляции?
  3. Всегда ли компилятор выполняет исполняемый двоичный код?

Извините, что задавал глупые вопросы. Спасибо и всего наилучшего!

Ответы [ 3 ]

1 голос
/ 27 марта 2011

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

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

Таким образом, ваше определение компилятора в # 1 недостаточно широко, в то время как определение интерпретаторафактически называет комбинацию компилятора и интерпретатора (вы не виноваты, это очень распространенный подход, используемый многими языками, обычно - но ошибочно - называемый «интерпретированный»).# 2 - ложь, поскольку интерпретаторы не выводят код (что могло бы сделать компилятор), в то время как # 3 корректен (вы можете подключить его к интерпретатору для выходного кода, но это все-таки другая программа).

1 голос
/ 27 марта 2011

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

1 голос
/ 27 марта 2011
  1. Вы правы в отношении компилятора, но ошибаетесь в интерпретаторе.Переводчик не должен ничего переводить.Он просто читает фрагмент кода и «интерпретирует» его - выполняет прочитанное.Например, он читает 1 + 2 и затем выполняет функцию sum(1, 2).

  2. Нет.Интерпретатор может использовать компиляцию только для целей оптимизации (как это делается в JVM HotSpot, использующей JIT-компиляцию).

  3. Что ж, работа компилятора заключается в том, чтобы «компилировать» - переводить исходный кодкод в двоичный код.Это все.Так что ответ на ваш вопрос - да.Это не его работа.

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