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

Содержание

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

21

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Theme: Overlay by Kaira Extra Text
Cape Town, South Africa