Программирование: МОДУЛИ Модульное программирование возникло из-за возрастающих объемов и сложности программ и коллективным характером разра- ботки. В настоящее время модуль - независимо разрабатываемая и хранимая, независимо компилируемая и тестируемая программная единица со строго определенными интерфейсами. Модули могут объединяться в различных сочетаниях, что характерно, например, для языка Ада [Зуев, 93]. В Турбо Паскале понятие модуля было введено, начиная с 4-ой версии, что явилось решающим шагом на пути его превраще- ния в язык, пригодный для крупных разработок производственного и коммерческого назначения на современном уровне технологии программирования. Стал возможным современный стильреализации программных пакетов, легко подключаемых к любой программе. Удалось ослабить ограничение на суммарный объем готовых прог- рамм. ОБЩАЯ СТРУКТУРА МОДУЛЯ В Турбо Паскале подпрограмма является структурным элемен- том программы и не может существовать вне ее. Модуль - отдельно хранимая и независимо компилируемая программная единица. КИ: Модуль в Турбо Паскале совокупность (библиотека) подпрограмм и описаний (константы, типы, переменные), которые используются другими программными единицами. Сам по себе мо- дуль не исполняется. Общая структура модуля unit <имя модуля> } Заголовок модуля interface <Описания видимых объектов> } Интерфейс implementation <Описания скрытых объектов> } Реализация begin <Операторы инициализации> } Инициализация end. Пример КИ (нет реализации и инициализации): unit tipsp; interface type tukaz=^telem; telem=record inf:integer; sled:tukaz; end; implementation end. Использование модуля Program p; uses tipsp; var perv,tek,posl:tukaz; z:telem; begin ... end. ПОДПРОГРАММЫ В МОДУЛЯХ По аналогии с модулем для любой подпрограммы интерфейс - это ее заголовок, реализация - тело, а инициализация - значе- ния, присваиваемые типизированным константам. Соответственно, в интерфейсной части модуля помещаются ПОЛНЫЕ ЗАГОЛОВКИ процедур и функций, доступных (видимых) для других программ без служебного слова forward. В реализующей части описания подпрограмм СОКРАЩЕННЫЕ ЗАГОЛОВКИ (без списка параметров). Можно использовать и полные заголовки, но тогда они должны полностью совпадать с заголовками в интерфейсной части. [Фаронов, 92, с.164] Не рекомендуется делать инициирующую часть пустой, лучше ее опустить: пустая часть содержит пустой оператор, которому будет передано управление при запуске прог- раммы. Это часто вызывает проблемы при разработке оверлейных программ. Пример [Фаронов] модуль "Комплексные числа" Таким образом, механизм модулей позволяет скрыть детали реализации тех или иных программных подсистем, предоставив в распоряжение использующих программ строго определенную сово- купность интерфейсных объектов. Если необходимо расширить мо- дуль введением новых процедур или изменить реализацию какой- либо процедуры и интерфейс модуля не изменился, то такая моди- фикация НИКАК НЕ ОТРАЗИТСЯ на использующих программах. КОМПИЛЯЦИЯ И ИСПОЛЬЗОВАНИЕ МОДУЛЕЙ Принято за правило: имя файла с исходным текстом модуля должно совпадать с именем этого модуля. Фактически компилятор ищет имена файлов, а не имена модулей. Если нужны разные име- на, то используется директива $U с указанием имени файла, нап- ример, uses {$U IMIAF} imiamod; заставляет компилятор искать модуль imiamod в файле IMIAF. Результат компиляции исходного текста модуля mod.pas - файл mod.tpu (Turbo Pascal Unit), при это имя файла берется из имени файла с исходным текстом. Спецификация используемых модулей uses A, B; должна идти непосредственно после заголовка программы или пос- ле служебного слова interface. Правило видимости имен: модуль, указанный первым в спис- ке, образует самый внешний блок программы, т. е. вложенность блоков выглядит так: идентификаторы модуля А идентификаторы модуля В идентификаторы программы При необходимости производится уточнение имен (составное имя как для записей), например, в программе Р передается зна- чение модулю A.X:=round(X); Возможны случаи косвенного использования модулей (через модуль). В спцификации использования необходимо указывать только модули, НЕПОСРЕДСТВЕННО используемые программой. Недопустимо явное или косвенное обращение модуля к самому себе. Если есть операторы раздела инициализации, то они выпол- няются ПЕРЕД началом выполнения программы, в которой использу- ется этот модуль. Если используемых модулей несколько, то их разделы инициализации выполняются в порядке, определенном спе- цификацией использования.