Использование трансляторов и интерпретаторов на разных уровнях
Исходный код программы – код, написанный на языке программирования.
Объектный модуль – код программы после трансляции, преобразованный в машинные коды.
Трансляция – получение объектного кода из исходного.
При программировании на языке высокого уровня обычно реализуется одна из процедур.
1. Сначала с помощью программы-редактора создается текстовый файл, представляющий собой исходную программу на языке высокого уровня. После этого вызывается программа-компилятор, которая преобразует исходную программу в файл машинного кода, т.е. образуется еще один файл. При выполнении программы действует файл машинного кода.
2. Программист вводит текстовый файл в память машины и вызывает программу-интерпретатор, которая преобразует каждый оператор программы в машинный код и сразу выполняет его. Отдельный файл машинного кода не создается. Следовательно, при каждом выполнении программы она преобразуется в машинный код. Реализация интерпретируемой программы длится гораздо дольше, чем компилированной, так как формирование машинного кода производится при каждом выполнении программы.
Компилятор – программа, обеспечивающая перевод с языка высокого уровня на машинный без одновременного выполнения получаемой программы.
Интерпретатор – программа, обеспечивающая перевод с языка высокого уровня на машинный с одновременным выполнением операторов программы.
Компилятор и интерпретатор обычно являются довольно сложными программами, которые воспринимают программу на исходном языке в форме текста, устанавливают внутреннюю структуру заданной программы, проверяя при этом ее синтаксическую корректность (синтаксический анализ), и переводят программу на другой (объектный) язык или выполняют эту программу путем соответствующих действий.
При синтаксическом анализе исходная программа проверяется на грамматическую корректность, и из исходной программы строится ее древовидное внутреннее представление. Это дерево проверяется на соблюдение ряда дополнительных правил, называемых контекстными условиями, и снабжается при этом атрибутами.
Компилятор в ходе семантической обработки из атрибутированного дерева (обычно за несколько промежуточных шагов и снова с применением техники атрибутирования) строит объектную программу. Структура части компилятора для семантического анализа исходя из синтаксического дерева представлена на рис. 5.1.
Рис. 5.1. Фазовая модель для компиляции
Фаза оптимизации при этом может быть опущена.
Структура части интерпретатора для семантической обработки исходной программы представлена на рис. 5.2.
Компилятор и интерпретатор могут быть структурированы и совсем иначе, чем это описано выше, из-за того, что отдельные фазы синтаксического анализа и, соответственно, компиляции и интерпретации могут быть объединены. Компиляция и интерпретация могут также комбинироваться: если, например, программа компилируется на промежуточный язык, а полученная программа далее интерпретируется.
Рис. 5.2. Фазовая модель для интерпретации
Корректность компиляторов и интерпретаторов имеет фундаментальное значение: для верифицированной, корректной программы, которая переводится неверифицированным, некорректным компилятором или выполняется некорректным интерпретатором, ее надежность, достигнутая при верификации, снова теряется.
В трансляторах, создаваемых для практического использования, существенное место занимают диагностика ошибок и их анализ. Специальная методика позволяет исправлять простые синтаксические ошибки и при обнаружении ошибки не прекращать процесс синтаксического анализа, а продолжать обработку остальных частей программы. Большие программы целесообразно не компилировать целиком, а независимо друг от друга переводить как отдельные составные части (раздельная трансляция). Оттранслированные части (объекты связывания, объекты монтажа) с помощью специальной программы (компоновщик) объединяются в единую выполняемую программу.
Эффективность программы, порожденной компилятором, зависит от эффективности исходной программы и качества кода, сгенерированного компилятором. Код, непосредственно порождаемый компилятором, в силу ряда обстоятельств не очень эффективен. Это, в частности, имеет место, когда исходный и объектный языки существенно отличаются друг от друга. Это может также быть следствием некачественного составления исходной программы. На практике эффективность порождаемой программы может быть улучшена непосредственно в процессе компиляции с помощью специальной фазы оптимизации.
Процессор
Под архитектурой процессора понимается его программная модель, то есть программно-видимые свойства.
Программная модель процессора - это функциональная модель, используемая программистом при разработке программ в кодах ЭВМ или на языке ассемблера. В такой модели игнорируются многие аппаратные особенности в работе процессора.
Под микроархитектурой понимается аппаратная реализация этой программной модели. Для одной и той же архитектуры разными фирмами и в разных поколениях применяются существенно различные микроархитектурные реализации, при этом, естественно, стремятся к максимальному повышению производительности (скорости исполнения программ).
В состав микропроцессора (МП) входят арифметико-логическое устройство (АЛУ), устройство управления (УУ) и группа регистров (рис. 1).
Рис. 1. Состав микропроцессора