Содержание

Разница между компилятором и интерпретатором

Разница между компилятором и интерпретатором

Как Компилятор так и Интерпретатор имеют одно предназначение — конвертировать инструкции языка высокого уровня (как C или Java) в бинарную форму, понятную компьютеру. Это программное обеспечение, используемое для запуска высокоуровневых программ и кодов выполняемых различные задачи. Для разных высокоуровневых языков разработаны специфичные компиляторы/интерпретаторы. Не смотря на то что как компилятор так и интерпретатор преследуют одну и ту же цель, они отличаются способом выполнения своей задачи, то есть конвертирования высокоуровневого языка в машинные инструкции. В этой статье мы поговорим о базовой работе обоих и выделим главные отличия между компилятором и интерпретатором.

Компилятор

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

На картинке показано базовое очертание процесса компиляции. Тут программа написанная на языке высокого уровня показана как «Исходный код», а сконвертированный называется «Исполняемый код».

Интерпретатор

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

Очертание процесса интерпретации на картинке выше показывает, что сначала исходный код конвертируется в промежуточную форму, а затем выполняется интерпретатором.

Ниже перечислены главные отличия между компилятором и интерпретатором:

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

Источник тут.

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

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

чем отличается реализация компилятора от интерпретатора?

для меня компилятор состоит из:

  • лексер
  • Parser (который строит синтаксическое дерево)
  • генерировать промежуточный код (например, 3-адресный код)
  • сделать все эти сумасшедшие вещи, чтобы оптимизировать, если вы хотите : -)
  • создать «сборку» или «собственный код» из кода адреса 3.

теперь, очевидно, интерпретатор также имеет тот же лексер и парсер, что и компилятор.
Но что он делает после этого?

  • Он «читает» дерево синтаксиса и выполняет его напрямую? (вроде того, что указатель инструкции указывает на текущий узел в дереве, а выполнение — это один большой обход дерева плюс управление памятью для стека вызовов) (и если да, то как это сделать? Я надеюсь, что выполнение лучше, чем огромный оператор switch, который проверяет, какой тип узла это)

  • генерирует ли он код адреса 3 и интерпретирует это? (если да, то как это сделать? Опять же, я ищу что-то более элегантное, чем заявление переключателя длиной в милю)

  • генерирует ли он реальный собственный код, загружает его в память и заставляет его работать? (в этот момент я думаю это больше не интерпретатор, а скорее JIT-компилятор)

кроме того, в какой момент понятие «виртуальная машина» вмешивается? Для чего вы используете виртуальную машину на языке? (чтобы быть ясным о моем уровне невежества, для меня виртуальная машина-VMWare, я понятия не имею, как концепция VM применяется к языкам программирования / исполняющим программам).

Как вы можете видеть, мой вопрос довольно широк. Я в основном ищу не только, какой метод используется, но в основном, чтобы сначала понять большие концепции, а затем подробно разобраться в том, как это работает. Мне нужны уродливые, грубые детали. Очевидно, что это скорее поиск ссылок на вещи для чтения, а не ожидание, что вы ответите на все эти детали здесь.

спасибо!
Даниэль!—1—>


EDIT: Спасибо за ваши ответы до сих пор. Я понял, что мой титул вводит в заблуждение. Я понимаю «функциональную» разницу между компилятором и интерпретатором.
Кто я? глядя на это разница, как вы реализовать интерпретатор против компилятора.
Теперь я понимаю, как реализован компилятор, вопрос в том, чем отличается интерпретатор от этого.

например: VB6 явно является как компилятором, так и интерпретатором. Теперь я понимаю часть компилятора. Однако я не могу понять, как при запуске внутри IDE он может позволить мне остановить программу в любой произвольной точке, изменить код и возобновить выполнение с новым код. Это только один крошечный пример, это не тот ответ, который я ищу. Я пытаюсь понять, как я объясняю ниже, что происходит после того, как у меня есть дерево разбора. Компилятор будет генерировать новый код из него на» целевом » языке. Что делает переводчик?

Спасибо за помощь!

21