Процессор

Организация иерархической структуры программы

Современные "большие" программы содержат и более команд. Для того чтобы можно было в такой программе разобраться (не говоря уже о том, что ее надо перед этим написать и отладить), программа должна быть структурирована. Основное средство структурирования на уровне системы команд процессора - это поддержка аппаратным уровнем (система команд, способы адресации) организации подпрограмм.

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

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

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

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

При этом необходимо обеспечить несколько дополнительных действий:

  1. После выполнения ПП управление надо вернуть в место вызова (каждый раз оно может быть разным, т.е. требуется при каждом вызове запоминать адрес возврата) - будем называть это действие связью по управлению.
  2. При передаче управления ПП надо передать ей также и исходные данные (при суммировании элементов массива это могут быть начальный адрес массива и число элементов), а при возврате управления в место вызова надо туда также вернуть и результат (в приведенном примере это сумма массива) - это действие будем называть связью по данным.
  3. Вызываемый фрагмент кода (подпрограмма) может использовать при своей работе ресурсы, такие как регистры процессора и т.п. К моменту вызова эти регистры могут содержать результаты работы предшествующих команд, которые будут нужны в дальнейшем. Совокупность переменных величин (содержимых регистров процессора, ячеек памяти), полностью характеризующих состояние программы, будем называть контекстом программы. При вызове подпрограммы нужно сохранить ту часть контекста вызывающей программы, которую подпрограмма при своей работе может изменить (испортить).
  4. Подпрограмме для работы могут потребоваться локальные переменные величины. Часть из них может располагаться в регистрах, другая часть - в ячейках памяти. Эти переменные нужны только до окончания работы подпрограммы (до возврата в вызывающую программу). При возврате занятую память хорошо бы освободить.
  5. В некоторых случаях одновременно может существовать несколько экземпляров одной подпрограммы, каждая со своим контекстом. Соответственно нужно несколько экземпляров локальных переменных. Простейший пример - рекурсивный вызов, когда подпрограмма вызывает сама себя.

В составе системы команд есть обычно инструкции, обеспечивающие в той или иной мере выполнение только что перечисленных действий и требований или, по крайней мере, некоторых из них.

Яндекс.Метрика