МОДУЛЬНОЕ ПРОГРАММИРОВАНИЕ

 

«Принцип модульности» оказывает наиболее сильное влияние на дисциплину мышления при решении задач. Он состоит в декомпозиции первоначального задания в связную систему подзадач: решение части полученных подзадач известно, а остальные подзадачи необходимо решать самостоятельно.

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

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

Используя модули, можно:

1) разрабатывать типовые подпрограммы для использования одним или многими программистами;

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

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

4) использовать нисходящий метод разработки программ (смотри структурное программирование).

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

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

- всякий раз после внесения в программу изменений, даже самых минимальных, вся программа должна быть перекомпилирована;

- архитектура многих современных ЭВМ предполагает, что программа при выполнении должна занимать непрерывный участок не более одного сегмента (64 Кбайт), несмотря на наличие большого объема свободной памяти.

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

Классификация и вызовы подпрограмм

Алгоритм решения любой из выделенных подзадач общей задачи (смотри структурное программирование) реализуется программным модулем, иначе подпрограммой. Фактически, еще не имея текста подпрограммы, уже можно зафиксировать ее назначение и заголовок (имя подпрограммы, число формальных параметров, их смысл и порядок). Подпрограммы на Паскале могут быть в виде процедур и функций: внутренних, внешних и библиотечных относительно основной программы. Схематично вложенность подпрограмм выглядит так:

 
 

 


Библиотечные подпрограммы всегда внешние. Если текст подпрограммы включен (вложен) в текст другой программы или подпрограммы, то она внутренняя по отношению к своей внешней программе, в которую она вложена. Выполнение главной программы начинает ОС или среда Турбо Паскаля. Остальные подпрограммы выполняются под управлением главной, т.е. вызываются (активизируются) из главной.

 

А В С

0

 
 


1 А1 А2 В1 В2

           
   
 
   


2 В21 В22

       
   
 

 


Внутренние Внешние Библиотечные

 

Любая подпрограмма имеет ту же структуру, как и основная программа, но с двумя отличиями:

• заголовок процедуры и функции имеет другой синтаксис и включает служебное слово PROCEDURE или FUNCTION;

• описание процедуры или функции заканчивается точкой с запятой (а не точкой).

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

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

Правила вызова подпрограмм:

1) из любой программы или подпрограммы можно вызвать любую подпрограмму, расположенную в библиотеке: системной (TPL – файл) или личной (TPU – файл);

2) внутренняя подпрограмма может быть вызвана:

a) из программы или подпрограммы – первой внешней по отношению к той, из которой происходит запрос;

b) из подпрограммы одного с ней уровня вложенности:

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

• если текст вызываемой подпрограммы расположен после текста вызывающей подпрограммы, но имеет опережающее описание, расположенное до вызывающей подпрограммы;

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

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

Каждое имя (объект), используемое в подпрограмме, должно быть объявлено. Область действия объявленных имен – от точки объявления до конца программы или подпрограммы, в которой они объявлены.

Переменные, используемые в подпрограммах, могут быть:

1) глобальные объекты (внешние): объявленные во внешней программе или подпрограмме и не переобъявленнные в данной;

2) локальные объекты (внутренние): определенные в данной подпрограмме, доступные и используемые только в ней и во всех вложенных в нее подпрограммах, в которых они не переобъявлены;

3) формальные параметры, определенные в списке формальных параметров – идентификаторы формальных параметров локальны в подпрограмме.

Локальной переменной подпрограммы называется объект (константа, переменная, процедура, функция, массив, строка), объявленный в данной подпрограмме. Так как и подпрограммы могут быть определены локально, то описания подпрограмм могут быть вложенными. Описание локальных объектов позволяет ограничивать область использования переменной той подпрограммой, в которой она имеет смысл.

Подпрограмма, т.е. фрагмент текста программы, для которого действительно описание объекта, называется его областью видимости. Из вложенности описаний следует и вложенность друг в друга и областей видимости.

Любой объект, упоминаемый в подпрограмме, но не описанный в ней, является нелокальным. Если его описание принадлежит внешней программе, то нелокальный объект называется глобальным.

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

При определении области действия подпрограмм действует правило: текст подпрограммы должен быть до ее вызова либо иметь опережающее описание.

Опережающее описание – до вызывающей процедуры дается только заголовок вызываемой процедуры, а вместо тела вызываемой процедуры пишется ключевое слово FORWARD (вперед).

Например.

PROCEDURE B ( N : BYTE ) ; {опережающее описание В }

FORWARD ; { заголовок функции с параметрами, но нет текста процедуры В }

PROCEDURE A (K : BYTE ) ;

BEGIN ……..

B ( K ) ; {вызов процедуры В }

………

END ;

PROCEDURE B ; { нет формальных параметров В }

BEGIN …. { текст – описание процедуры В }

A ( N ) ; { вызов процедуры А – косвенная рекурсия }

END ;