Лекции по построению компилятора на Pascal
13. Процедуры
ВВЕДЕНИЕ
Наконец-то мы принимаемся за хорошую главу!
К этому моменту мы изучили почти все основные особенности компиляторов и
синтаксического анализа. Мы узнали как транслировать арифметические выражения, булевы
выражения, управляющие конструкции, объявления данных и операторы ввода/вывода. Мы
определили язык TINY 1.3, который воплощает все эти возможности, и написали
элементарный компилятор, который может их транслировать. Добавив файловый ввод/вывод
мы могли бы действительно иметь работающий компилятор, способный производить
выполнимые объектные файлы из программ, написанных на TINY. С таким компилятором
мы могли бы писать простые программы, способные считывать целочисленные данные,
выполнять над ними вычисления и выводить результаты.
Все это хорошо, но то, что у нас есть, это все еще только игрушечный язык. Мы не можем
считывать и выводить даже одиночные символы текста и у нас все еще нет процедур.
Эти возможности, которые будут обсуждены в следующих двух главах, так сказать отделят
мужчин от игрушек. "Настоящие" языки имеют более одного типа данных и они
поддерживают вызовы процедур. Более чем любые другие, именно эти две возможности
дают языку большую часть его характера и индивидуальности. Как только мы предоставим
их, наши языки, TINY и его преемники, перестанут быть игрушками и получат характер
настоящих языков, пригодных для серьезного программирования.
В течение нескольких предыдущих глав я обещал вам урок по этим двум важным темам.
Каждый раз появлялись другие проблемы, которые требовали отклонения и работы с ними.
Наконец у нас появилась возможность оставить все эти проблемы в покое и вернуться в
основное русло. В этой главе я охвачу процедуры. В следующий раз мы поговорим об
основных типах данных.
ПОСЛЕДНЕЕ ОТКЛОНЕНИЕ
Эта глава была необычайно трудной для меня. Причина не имеет никакого отношения
непосредственно к теме... я знал, о чем хотел рассказать уже какое-то время, и фактически я
представил большинство из этого на Software Development '89,] в феврале. Больше это имело
отношение к подходу. Позвольте мне объяснить.
Когда я впервые начал эту серию, я сказал вам, что мы будем использовать некоторые
"приемы" чтобы упростить себе жизнь и позволить нам получить общее представление не
вдаваясь слишком подробно в детали. Среди этих приемов была идея рассмотрения
отдельных частей компилятора в отдельные моменты времени, т.е. выполнения
экспериментов, использующих Cradle как основу. Когда, например, мы исследовали
выражения мы работали только с этой частью теории компиляции.]]]] Когда мы исследовали
управляющие структуры, мы писали различные программы, все еще основанные на Cradle,
для выполнения этой части. Мы включили эти понятия в полный язык довольно недавно.
Эти методы служили нам действительно очень хорошо и привели нас к разработке
компилятора для TINY версии 1.3.
Вначале, когда я начал этот урок, я попытался основываться на том, что мы уже сделали и
просто добавлять новые возможности в существующий компилятор. Это оказалось немного
неудобным и сложным... слишком, чтобы удовлетворить меня.
В конце концов я выяснил почему. В этой серии экспериментов я отказался от очень
полезного метода, который позволил нам добраться до сюда, и без особой на то нужды я
переключился на новый метод работы, который включал в себя пошаговые изменения в
полной версии компилятора] TINY.