Модульное программирование

Модульное программирование получило широкое распространение. Под модули-зацией понимается разделение программы на части по некоторым установленным правилам. Этими частями могут быть программные секции (в КОБОЛЕ), внутренние процедуры (в ПЛ/1 и ПАСКАЛЕ) или внешние процедуры (в ФОРТРАНЕ, КОБОЛЕ и ПЛ/1). В процедурных (алгоритмических) системах программирования есть специальная библиотека программ (модулей) и средства работы с этой библиотекой. По мере усложнения функций, возлагаемых на ЭВМ, росла и сложность программ. Первоначально библиотека программ использовалась для уменьшения дублирования в работе программиста. Затем при создании сложных ПС возможности процедурных систем программирования (имеется в виду возможность организации библиотеки модулей) стали использоваться для обеспечения создания сложных программ одним или коллективом программистов. Это объяснялось тем, что сложность прикладных программ возросла на столько, что трудно было писать её как единое целое или разрабатывать одним программистом. Программы стали слишком велики, чтобы их можно было представить во всех подробностях как единое целое и поместить в памяти ЭВМ целиком. Поэтому сложность программ долгое время вызывала трудности при проектировании ПС.

Для размещения больших программ в памяти машины стали применяться структуры с перекрытиями (оверлейные структуры). Это потребовало разбиение программ на модули. Пошли по пути дальнейшего развития и совершенствования процедурного программирования и библиотек программ. С появлением ЭВМ со страничной (виртуальной) памятью управление оверлейными структурами осуществляется автоматически, но эффективность распределения программы по страницам зависит от выбираемого программистом способа разделения ее на модули.

Программы разбиваются на модули для того, чтобы: упростить их разработку и реализацию; облегчить чтение программы; упростить их настройку и модификацию; облегчить работу с данными, имеющими сложную структуру; избежать чрезмерной детализации алгоритмов; обеспечить более выгодное размещение программ в памяти ЭВМ.

Основная черта модульного программирования – это стандартизация и паспортизация интерфейса между отдельными программными единицами. Модуль – это отдельно функционально законченная программная единица, которая структурно идентифицируется (или оформляется) стандартным образом по отношению к компилятору и по отношению к объединению её с другими аналогичными единицами в загрузке. В общем случае любая программа имеет внешние и внутренние потоки данных, области хранения данных. Поэтому, как правило, модуль содержит паспорт, в котором указаны все основные его характеристики: язык программирования, объем, входные и выходные переменные, их формат, точки входа в модуль, параметры настройки и т.д. Объем модуля, обычно не превышает 1000 команд ЭВМ или операторов языка программирования. Наиболее оптимальный по размеру модуль, как правило, уменьшается на одном месте распечатки на АЦПУ. В этом случае, модульная система, будет наиболее технологичной.

Модульное программирование –это искусство разбиения задачи на некоторое число различных модулей, умение широко использовать стандартные модули, путем их параметрической настройки, автоматизации сборки готовых модулей из библиотек, банков модулей и т.д. Очень хорошо, в модульном программировании, используется техника макрогенерации.

Модульное программирование, обладает следующими преимуществами:

1) простота составления и отладки модульной программы, т.к. функциональные компоненты программы могут быть написаны и отлажены порознь;

2) модульная программа, легче сопровождается и модифицируется, т.к. функциональные компоненты могут быть изменены, переписаны или заменены, без изменения, в остальных компонентах;

3) облегчение процесса управления, разработкой модульной программы, т.к. более сложные модули, могут разрабатываться более опытными программистами, проще осуществляется контроль и отчетность программистов.

Но, модульное программирование, имеет и недостатки:

1) требуется выполнить большой объем работ, т.к. программист должен проектировать программы по нисходящей схеме и анализировать на каждом шаге декомпозиции программы, удобство ее модификации, а так же проводить документирование программы на каждом шаге декомпозиции;

2) возрастают затраты времени центрального процессора на выполнение программы и занимается несколько больший объем памяти под программу (на ~5 –10%), т.к. необходимо при входе и выходе из подпрограммы, выполнять команды, обеспечивающие их совместимость с программой более высокого уровня;

3) могут возникнуть трудности, в системах реального времени, т.к. при считывании подпрограмм в оперативную память, программа может быть переведена в режим ожидания.

Существует несколько методов построения модульных программ:

Первый метод характеризуется функциональной независимостью модулей. Каждая подпрограмма должна иметь определенное назначение, которое более или менее зависит от других подпрограмм программы. Выбор определенного размера модуля, определяется решаемой задачей, удобством сопровождения, языком программирования. Качество разбиения программы на модули, во многом зависит, от квалификации программиста.

Второй метод заключается в использовании, так называемых таблиц решений, которые позволяют формально записывать логические алгоритмы и реализовать их инвариантными программами [5,7,15]. Этот метод, обладает важными достоинствами:

1) способствует лучшему анализу и пониманию задачи, т.к. дисциплинирует мысли разработчика алгоритма;

2) организует удобный способ общения между разработчиками алгоритмов и программистами, исключающий многие неоднозначности, свойственные словестным описаниям программируемой задачи;

3) уменьшает, а в некоторых случаях и полностью исключает программирование алгоритмов;

4) обеспечивает удобный контроль ошибок, уменьшает неполноту, противоречивость и избыточность алгоритмов;

5) создает возможность определять модульность ПС и организовать базу знаний разработчику алгоритмов(технологу).

Третий метод состоит в отделении операций по вводу/выводу от вычислительных операций. Это способствует быстрому изменению и удобному заданию интерфейса между ПС и пользователем. При этом вычислительные операции не меняются. Кроме этого, создаются предпосылки, для разработки инвариантного набора программ ввода/вывода.

В дополнение, к рассмотренным методам, модульного программирования можно дать рекомендации, способствующие выделению модулей. Необходимо стремиться к заданию параметров в символьной форме, что обеспечивает простое изменение параметра в программе. Если параметры используются несколькими модулями, то имеет смысл централизованное задание значений параметров, что повышает использование модулей в различных конфигурациях и удобное изменение значений параметров. Рекомендуется параметры и действия таблиц решений задавать в отдельных модулях алгоритма: модуль входных параметров и модуль действий, что делает независимыми правила выбора действий от расположения в памяти параметров и от выполняемых действий [15]. Не рекомендуется, чтобы модули использовали общую рабочую память, что приводит к увеличению зависимости модулей.