Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
материалы_2_полуг_1.doc
Скачиваний:
4
Добавлен:
08.09.2019
Размер:
138.75 Кб
Скачать

5.5. Использование трансляторов и интерпретаторов на разных уровнях

Исходный код программы – код, написанный на языке программирования.

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

Трансляция – получение объектного кода из исходного.

При программировании на языке высокого уровня обычно реализуется одна из процедур.

1. Сначала с помощью программы-редактора создается текстовый файл, представляющий собой исходную программу на языке высокого уровня. После этого вызывается программа-компилятор, которая преобразует исходную программу в файл машинного кода, т.е. образуется еще один файл. При выполнении программы действует файл машинного кода.

2. Программист вводит текстовый файл в память машины и вызывает программу-интерпретатор, которая преобразует каждый оператор программы в машинный код и сразу выполняет его. Отдельный файл машинного кода не создается. Следовательно, при каждом выполнении программы она преобразуется в машинный код. Реализация интерпретируемой программы длится гораздо дольше, чем компилированной, так как формирование машинного кода производится при каждом выполнении программы.

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

Интерпретатор – программа, обеспечивающая перевод с языка высокого уровня на машинный с одновременным выполнением операторов программы.

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

При синтаксическом анализе исходная программа проверяется на грам­матическую корректность, и из исходной программы строится ее древо­видное внутреннее представление. Это дерево проверяется на соблюде­ние ряда дополнительных правил, называемых контекстными условиями, и снабжается при этом атрибутами.

Компилятор в ходе семантической обработки из атрибутированного дерева (обычно за несколько промежуточных шагов и снова с примене­нием техники атрибутирования) строит объектную программу. Структура части компилятора для семантического анализа исходя из синтаксиче­ского дерева представлена на рис. 5.1.

Рис. 5.1. Фазовая модель для компиляции

Фаза оптимизации при этом может быть опущена.

Структура части интерпретатора для семантической обработки исход­ной программы представлена на рис. 5.2.

Компилятор и интерпретатор могут быть структурированы и совсем ина­че, чем это описано выше, из-за того, что отдельные фазы синтаксиче­ского анализа и, соответственно, компиляции и интерпретации могут быть объединены. Компиляция и интерпретация могут также комбиниро­ваться: если, например, программа компилируется на промежуточный язык, а полученная программа далее интерпретируется.

Рис. 5.2. Фазовая модель для интерпретации

Корректность компиляторов и интерпретаторов имеет фундаментальное значение: для верифицированной, корректной про­граммы, которая переводится неверифицированным, некорректным ком­пилятором или выполняется некорректным интерпретатором, ее надеж­ность, достигнутая при верификации, снова теряется.

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

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

13