logo
ЯП / ЯП / ЯП экзамен

Трансляторы. Интерпретация и компиляция.

Трансля́тор — программа или техническое средство, выполняющее трансляцию программы.

Трансляция программы — преобразование программы, представленной на одном из языков программирования, в программу на другом языке и, в определённом смысле, равносильную первой. Транслятор обычно выполняет также диагностику ошибок, формирует словари идентификаторов, выдаёт для печати тексты программы и т. Д

Трансляторы – компиляторы и интерпретаторы.

Компилятор (англ. compiler – составитель, собиратель) читает всю программу целиком, делает ее перевод и создает законченный вариант программы на машинном языке, который затем и выполняется.

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

Компилятор – переводит весь исходный код в объектный или исполняемый модуль. (С)

Интерпретатор – выполняет перевод команды в объектный код, непосредственно перед ее выполнением. Выполнением самим команд занимается имитатор абстрактной машины. JAVA, PHP, basic.

Компиляция

Исх текст

Лексический анализатор

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

Семантический анализатор

Промежуточный представление

Оптимизация машинозависимая

Генератор кода

Машинозависимый оптимизатор

Объектный код

Интерпретация

Исх текст

Лексический анализатор

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

Семантический анализатор

Абстрактный код

Имитатор абстрактной машины

Лексический анализатор преобразует последовательность символов в синтаксические инструкции (лексемы).

Синтаксический анализатор получает от лексического анализатора лексические единицы и использует их для создания иерархических структур.

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

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

Выходная часть компилятора (имитатор абстрактной машины) выполняет генерацию машинно-зависимого кода.

Оптимизатор пытается улучшить код, убрать лишние операции, заменить медленные инструкции на более быстрые и т.д.

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

Виды оптимизации:

  1. Оптимизация промежуточного представления

  2. Машинно-ориентированная оптимизация (регистры вместо оперативной памяти)

  3. Локальная оптимизация (замена нескольких команд одной более эффективной)