Лекции по построению компилятора на Pascal
16. Конструирование модулей
ВВЕДЕНИЕ
Эта обучающая серия обещает стать возможно одной из самых долгоиграющих мини-серий в
истории, конкурирующей только с задержкой на Томе IV Кнута. Начатая в 1988, эта серия
вошла в четырехлетнюю паузу в 1990, когда "заботы мира сего", изменения в приоритетах и
интересах и необходимость зарабатывать на жизнь казалось забросили ее после Главы 14.
Долго терпевшие из вас были наконец вознаграждены весной прошлого года долгожданной
Главой 15. В ней я начал попытку поставить серию обратно на рельсы и по ходу дела сделать
ее проще для достижения цели, которая состоит в том, чтобы обеспечить вас не только
достаточным пониманием трудных тем теории компиляции, но также достаточными
инструментами в виде фиксированных подпрограмм и концепций, так чтобы вы были
способны продолжать самостоятельно и стали достаточно опытными для того, чтобы
создавать свои собственные синтаксические анализаторы и трансляторы. Из-за этой длинной
паузы я подумал что следует вернуться назад и повторно рассмотреть концепции, которые
мы до этого охватили а также заново сделать некоторые части программы. В прошлом мы
никогда сильно не касались разработки программных инструментов промышленного
качества... в конце концов я пытался обучать (и обучаться) концепциям, а не промышленной
практике. Чтобы сделать это я старался давать вам не законченные компиляторы и
анализаторы, а только те отрывки кода, которые иллюстрировали частные случаи, которые
мы рассматривали в текущий момент.
Я все еще верю, что это хороший способ изучения любого вопроса; никто не захочет вносить
в изменения в программу в 100,000 строк только для того чтобы попробовать новую идею.
Но идея работы с обрывками кода а не полными программами также имеет свои недостатки
из-за которых мы писали те же самые фрагменты кода много раз.]]]] Хотя было полностью
доказано, что повторение является хорошим способом обучения новым идеям, также правда
и то, что оно может быть не слишком хорошей вещью. Ко времени, когда я завершил Главу
14, я казалось достиг пределов своих способностей манипулировать множеством файлов и
множественными версиями тех же самых программ. Кто знает, может быть это одна из
причин, по которым я кажется выдохся в то время.
К счастью, более поздние версии Borland Turbo Pascal позволяют нам получить и съесть свой
кусок пирога. Используя их концепцию раздельно компилируемых модулей мы все еще
можем писать маленькие подпрограммы и функции и сохранять наши основные и тестовые
программы маленькими и простыми. Но, однажды написанный, код в модулях Паскаля будет
всегда там для нашего использования и его связывание абсолютно безболезненно и
прозрачно.
Так как к настоящему времени большинство из вас программируют на C или C++, я знаю,
что вы подумаете: Borland с их Turbo Pascal конечно не изобретали понятие раздельно
компилируемых модулей. И, конечно, вы правы. Но если вы не использовали TP в последнее
время или когда либо, вы можете не понять насколько безболезненный весь этот процесс.
Даже в C или C++ вы все еще должны формировать make файл, или вручную, или сообщая
компилятору как это сделать. Вы должны также перечислить, используя утверждение
"extern" или заголовочные файлы, функции, которые вы хотите импортировать. В TP вы не
должны даже делать этого. Вам необходимы только имена модулей, которые вы желаете
использовать, и все их процедуры автоматически становятся доступны.
У меня нет намерения заниматься здесь дебатами на тему войн языков, так что я не буду
затрагивать эту тему в дальнейшем. Даже я больше не использую Pascal в своей работе... я
использую C на работе и С++ для своих статей в Embedded Systems Programming и других
журналах. Поверьте мне, когда я намеревался возродить эту серию, я думал долго и
интенсивно о переключении и языка и целевой системы на те, которые мы все используем в
эти дни, C/C++ и архитектуру PC и возможно также и объектно-ориентированные методы. В
конце концов я понял, что это вызовет больше беспорядка, чем сам перерыв. И в конце