Программы и подпрограммы

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

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

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

Однако не все так просто. Для конкретной работы программы требуется дополнительная информация об адресе программы в ОЗУ, об адресе в ОЗУ входных и выходных параметров, о размещении рабочих данных, о состоянии программы. Блок этой дополнительной информации, который называется окружением программы, хранится в ОЗУ. Каждая программа может либо закончить свою работы, либо вызвать другую программу в качестве подпрограммы. В первом случае следующей должна выполняться родительская программа (та, из которой была вызвана закончившаяся программа). Во втором случае первая программа станет неактивной и будет ждать, когда закончится вторая (вызванная) подпрограмма.

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

Все эти действия являются частью подсистемы управления выполнением программ.