Лекции по построению компилятора на Pascal
10. Представление "TINY"
ВВЕДЕНИЕ
В последней главе я показал вам основную идею нисходящей разработки компилятора. Я
показал вам первые несколько шагов этого процесса для компиляторов Pascal и C, но я
остановился далеко от его завершения. Причина была проста: если мы собираемся построить
настоящий, функциональный компилятор для какого-нибудь языка, я предпочел бы сделать
это для KISS, языка, который я определил в этой обучающей серии.
В этой главе мы собираемся сделать это же для подмножества KISS, которое я решил назвать
TINY.
Этот процесс по существу будет аналогичен выделенному в главе 9, за исключением одного
заметного различия. В той главе я предложил вам начать с полного БНФ описания языка.
Это было бы прекрасно для какого-нибудь языка типа Pascal или C, определения которого
устоялись. В случае же с TINY, однако, мы еще не имеем полного описания... мы будем
определять язык по ходу дела. Это нормально. Фактически, это предпочтительней, так как
мы можем немного подстраивать язык по ходу дела для сохранения простоты анализа.
Так что в последующей разработке мы фактически будем выполнять нисходящую
разработку и языка и его компилятора. БНФ описание будет расти вместе с компилятором.
В ходе этого будет принят ряд решений, каждое из которых будет влиять на БНФ и,
следовательно, характер языка. В каждой решающей точке я попытаюсь не забывать
объяснять решение и разумное обоснование своего выбора. Если вам случится
придерживаться другого мнения и вы предпочтете другой вариант, вы можете пойти своим
путем. Сейчас вы имеет базу для этого. Я полагаю важно отметить, что ничего из того, что
мы здесь делаем не подчинено каким-либо жесткими правилами. Когда вы разрабатываете
свой язык вы не должны стесняться делать это своим способом.
Многие из вас могут сейчас спросить: зачем нужно начинать с самого начала? У нас есть
работающее подмножество KISS как результат главы 7 (лексический анализ). Почему бы
просто не расширить его как нужно? Ответ тройной. Прежде всего, я сделал несколько
изменений для упрощения программы... типа изоляции процедур генерации кода, в
результате чего мы можем более легко выполнять преобразование для различных машин. Во-
вторых, я хочу, чтобы вы увидели что разработка действительно может быть выполнена
сверху вниз как это подчеркнуто в последней главе. Наконец, нам всем нужна практика.
Каждый раз, когда я прохожу через эти упражнения, я начинаю понимать немного больше, и
вы будете тоже.
ПОДГОТОВКА
Много лет назад существовали языки, называемые Tiny BASIC, Tiny Pascal и Tiny C, каждый
из которых был подмножеством своего полного родительского языка. Tiny BASIC, к
примеру, имел только одно-символьные имена переменных и глобальные переменные. Он
поддерживал только один тип данных. Звучит знакомо? К этому моменту мы имеем почти
все инструменты, необходимые для создания компилятора подобного этому.
Однако язык, называемый Tiny-такой-то все же несет некоторый багаж, унаследованный от
своего родительского языка. Я часто задавался вопросом, хорошая ли это идея. Согласен,
язык, основанный на каком-то родительском языке, будет иметь преимущество знакомости,
но может также существовать некоторый особенный синтаксис, перенесенный из
родительского языка, который может приводить к появлению ненужной сложности в
компиляторе. (Нигде это не является большей истиной, чем в Small C).
Я задавался вопросом, насколько маленьким и простым может быть создан компилятор и
при этом все еще быть полезным, если он разрабатывался из условия быть легким и для
использования и для синтаксического анализа. Давайте выясним. Этот язык будет