Если коротко то компилятор сначала переводит программу на языке программирования в машинный и запускает, а интерпретатор по словам переводит в машинный язык и выполняет

Интерпретаторы и компиляторы. Трансляция программ и сопутствующие процессы.

Трансляторы бывают двух типов: компиляторы (compiler) и интерпретаторы (interpreter). Процесс компиляции состоит из двух частей: анализа (analysis) и синтеза (synthesis).

Начало
Выборка очередной инструкции
Анализ инструкции
Выполнение инструкции

Компилятор – это транслятор, который исходный текст программы переводит в машинный код. Если в тексте программы нет синтаксических ошибок, то машинный код будет создан. Но это, как правило, не работоспособный код, т.к. в этой программе не хватает подпрограмм стандартных функций, поэтому компилятор выдает промежуточный код, который называется объектным кодом и имеет расширение .obj.

Компилятор преобразует исходный код программы как одно целое, после чего сохраняет полный эквивалент исходного кода в виде исполняемого файла (в случае с ДОС, это com или exe файл).

Примеры:

1)Компилируемые Бейсики (Turbo Basic,...)

2) Паскаль, Си и многие другие ЯВУ

3) Ассемблер

Важно! Компилятор, в отличие от интерпретатора не выполняет программу, он ее создает, точнее, он создает исполняемый файл (в машинном коде) этой программы.

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

Процесс создания компилятора можно свести к решению нескольких задач, которые принято называть фазами компиляции (compilation phases). Фазы компиляции:

· Лексический анализ

· Синтаксический анализ

· Видозависимый анализ

· Оптимизация

· Генерация кода

Лексический анализ. Входом компилятора служит программа на исходном языке программирования. С точки зрения компилятора это просто последовательность символов. Задача первой фазы компиляции, лексического анализатора (lexical analysis), заключается в разборе входной цепочки и выделении некоторых более "крупных" единиц, лексем, которые удобнее для последующего разбора. Примерами лексем являются основные ключевые слова, идентификаторы, константные значения (числа, строки, логические) и т.п.

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

Синтаксический анализ. Синтаксический анализатор (syntax analyzer, parser) получает на вход результат работы лексического анализатора и разбирает его в соответствии с некоторой грамматикой. Эта грамматика аналогична грамматике, используемой при описании входного языка. Однако грамматика входного языка обычно не уточняет, какие конструкции следует считать лексемами. Синтаксический анализ является одной из наиболее формализованных и хорошо изученных фаз компиляции.

Видозависимый анализ. Видозависимый анализ (type checking), иногда также называемый семантическим анализом (semantic analysis), обычно заключается в проверке правильности типов данных, используемых в программе. Кроме того, на этом этапе компилятор должен также проверить, соблюдаются ли определенные контекстные условия входного языка. В современных языках программирования одним из примеров контекстных условий может служить обязательность описания переменных: для каждого использующего вхождения идентификатора должно существовать единственное определяющее вхождение.

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

Генерация кода. Наконец, по оптимизированной версии промежуточного представления генерируется объектная программа. Эту задачу решает фаза генерации кода (code generator). Помимо собственно генерации кода, на этом этапе необходимо решить множество сопутствующих проблем, например:

· распределение памяти, т.е. отображение имен исходной программы в адреса памяти;

· распределение регистров, т.е. определение для каждой точки программы множества переменных, которые должны быть размещены в регистрах;

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

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

Интерпретаторы используются многими языками для разработки Web-страниц, такими как JavaScript. Поскольку Web-страницы просматриваются с помощью компьютеров различного типа, вы не сможете скомпилировать программу (заранее не известен тип компилятора). Вместо этого используется интерпретатор.

Примеры:

1) Command.com - интерпретатор командных файлов ДОС

2) Интерпретируемые Бейсики используемые в бытовых компьютерах ("Микроша", "БК","Спектрум") и ранних PC

3) Perl — высокоуровневый интерпретируемый динамический язык программирования общего назначения, созданный Ларри Уоллом, лингвистом по образованию. Название языка представляет собой аббревиатуру, которая расшифровывается как Practical Extraction and Report Language — «практический язык для извлечения данных и составления отчётов». С помощью Perl вы, например, можете создать скрипт, который открывает один или несколько файлов, обрабатывает информацию и записывает результаты.

В реальных системах программирования совмещены технологии и компиляции, и интерпретации – p код*. В процессе отладки программа может выполняться по шагам, а результирующий код не обязательно будет машинным — он даже может быть исходным кодом, написанным на другом языке программирования. (Это существенно упрощает процесс трансляции, но требует компилятора для конечного языка). Результирующий код может быть промежуточным машинно-независимым кодом абстрактного процессора, который в различных компьютерных архитектурах станет выполняться с помощью интерпретатора или компилироваться в соответствующий машинный код.

 

*P-код (Пи-код) — концепция аппаратно-независимого исполняемого кода в программировании, часто его определяют как «Ассемблер для гипотетического процессора»

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

Среда исполнения — совокупность программного обеспечения, предоставляющего унифицированный ABI (Application Binary Interface), который могут использовать другие программы для доступа к ресурсам операционной системы

 

Выбор зависит от того, что Вам требуется.

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

Если вы хотите написать программу, которая будет выполняться на Web-странице, используйте интерпретатор или р-код.

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