Лекция. Модули
Модули
1 Введение
Понятие модуля или, в более общем случае, модульного программирования, возникло на определенном этапе развития программирования и было обусловлено возрастающими объемами программ, их увеличивающейся внутренней сложностью и коллективным характером разработок. К настоящему времени понятие модуля проделало значительную эволюцию от примитивного "разрубания" текста программы на произвольные части или создания библиотек включаемых фрагментов до независимо хранимых и разрабатываемых, независимо компилируемых и тестируемых программных единиц со строго определенными интерфейсами, которые могут объединяться в различных сочетаниях.
При всех несомненных достоинствах алголоподобных языков, большинство из них имеет существенный недостаток - отсутствие модульности. Представление программной системы как единой языковой конструкции является препятствием для эффективной организации коллективных разработок сложных систем, затрудняет понимание и модификацию программ. Понятие подпрограмм лишь частично решает проблему ввиду неявных и слабо контролируемых информационных зависимостей подпрограмм и их окружения.
Введение понятия модуля в Turbo Pascal (введено в 4-ой версии системы) позволило превратить его в язык, пригодный для крупных разработок на современном уровне технологии программирования. За счет введения модулей удалось ослабить ограничения на суммарный объем готовых программ.
2 Общая структура модуля
В языке Turbo Pascal модуль (unit) по определению считается отдельной программой. Если подпрограмма является структурным элементом Pascal-программы и не может существовать вне ее, то модуль представляет собой отдельно хранимую и независимо компилируемую единицу.
В самом общем виде модуль представляет собой набор программных ресурсов, предназначенных для использования другими модулями и программами. Под ресурсами в данном случае понимаются любые программные объекты языка Turbo Pascal - константы, типы, переменные, подпрограммы. Важно понимать, что модуль сам по себе не является выполняемой программой - его объекты ИСПОЛЬЗУЮТСЯ другими программными единицами.
Все программные ресурсы модуля можно разбить на две части: объекты, прямо предназначенные для использования другими программами или модулями, и рабочие (внутренние) объекты. Например, если модуль содержит некоторую подпрограмму универсального назначения, пригодную для использования другими программами, то вызываемые этой подпрограммой процедуры и функции, содержащиеся в модуле, и используемые ею переменные относятся к внутренним. Поэтому модуль, кроме заголовка, имеет две основные части, называемые интерфейсом (interface) и реализацией (implementation).
В интерфейсной части модуля сосредоточены описания объектов, доступных из других программ. Такие объекты называют видимыми вне модуля. В части реализации помещаются рабочие объекты, называемые также невидимыми или скрытыми, так как вне модуля они не доступны
Заголовок модуля составляется из служебного слова unit и следующего за ним идентификатора, являющегося именем модуля. Заголовок завершается символом ; (точка с запятой). Интерфейсная часть начинается со служебного слова interface, за которым следует совокупность обычных описаний. Часть реализации начинается служебным словом implementation, за которым идут описания скрытых для внешних программ объектов. Завершает модуль, как и программу, служебное слово end и символ '.' (точка).
Кроме перечисленных частей, модуль может содержать так называемый раздел инициализации, предназначенный для установки начальных значений переменных модуля перед его использованием. Этот раздел следует после раздела реализации, начинается со служебного слова begin и содержит последовательность операторов.
Таким
образом, общая структура модуля может
быть представлена следующей схемой:
Приведем простейший пример модуля. Для того, чтобы не описывать в нескольких программах общие для них типы данных, можно описать их в одном модуле. Данный пример касается описаний, связанных с датами, месяцами, днями и т.д.
unit Calendar;
interface
type
Days = (Mon,Tue,Wed,Thu,Fri,Sat,Sun);
WorkingDays = Mon..Fri;
Months = (Jan,Feb,Mar,Apr,May,June,July,Aug,Sept,Oct,Nov,Decem);
Summer = June..Aug;
Autumn = Sep..Nov;
Spring = Mar..May;
DayNo = 1..31;
YearNo = 1900..2000;
Date = record
Day : DayNo;
Month : Months;
Year : YearNo
end;
implementation
end.
Данный модуль, ввиду своей простоты, не содержит разделов реализации и инициализации.
