Здесь обсуждаются операции, необходимые для компиляции программ типичного языка высокого уровня. В качестве примера мы будем использовать программу на Паскале, изображенную на рис. 1, однако обсуждаемые концепции и подходы приложимы к компиляции программ и с других языков.
Для облегчения построения компиляторов язык высокого уровня обычно описывается в терминах некоторой грамматики. Эта грамматика определяет форму (синтаксис) допустимых предложений языка. Например, оператор присваивания может быть определен в грамматике как имя переменной, за которой следует оператор присваивания (:=), за которым следует выражение. Проблема компиляции может быть сформулирована как проблема поиска соответствия написанных программистом предложений структурам, определенным грамматикой, и генерации соответствующего кода для каждого предложения.
Предложения исходной программы удобнее представлять в виде последовательности лексем (tokens), чем просто как строку символов. Лексемы можно понимать как фундаментальные кирпичики, из которых строится язык. Например, лексемой может быть ключевое слово, имя целой переменной, арифметический оператор и т. д. Просмотр исходного текста, распознавание и классификация различных лексем называются лексическим анализом. Часть компилятора, которая выполняет эту функцию, обычно называют сканером.
Как только лексемы выделены, каждое предложение программы может быть распознано как некоторая конструкция языка, как, например, декларативные операторы или оператор присваивания, описанные с помощью грамматики. Процесс, называемый синтаксическим анализом или синтаксическим разбором, осуществляется той частью компилятора, которая обычно называется синтаксическим анализатором (parser). Последним шагом базовой схемы процесса трансляции является генерация объектного кода. Большинство компиляторов генерирует непосредственно программу в машинных кодах, а не программу на ассемблере, предназначенную для последующей трансляции в машинные коды.
Хотя мы указали на три основных шага в процессе компиляции—лексический анализ, синтаксический анализ и генерацию кодов,— важно отметить, что компилятор вовсе не обязан делать три просмотра транслируемой программы. Для некоторых языков возможна компиляция программы за один просмотр. В этом разделе мы обсудим, как может работать однопросмотровый компилятор. Однако компиляторы для других языков и компиляторы, осуществляющие изощренную оптимизацию объектного кода или какой-либо другой анализ программы, обычно являются многопросмотровыми.
0 коммент.:
Отправить комментарий