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