Підпрограми
1. Точка повернення
Повернемося до програми sort31 із підрозділу 3.4. Виклики процедури swap записані в ній тричі, тому після їх виконання повинні виконуватися різні дії: спочатку обчислення умови b>c, потім обчислення a>b, і, нарешті, виведення значень. Проте в самій процедурі немає ніяких указівок, чим повинна бути продовжена програма після виконання її виклику. Виходить, перед тим, як виконати виклик підпрограми, комп'ютер якимось таємничим чином запам'ятовує, із якого місця йому слід продовжити програму.
Місце в програмі, що описує дію, якою вона продовжується по закінченні виконання виклику підпрограми, називається точкою повернення з підпрограми.
Отже, коли виконання програми доходить до виклику підпрограми, запам'ятовується точка повернення з неї, та вказівка на цю точку зберігається до закінчення виконання виклику. Потім за цією вказівкою продовжується виконання програми саме з точки повернення. Вказівка точки повернення займає частину локальної пам'яті процесу виконання виклику підпрограми. Що ще знаходиться в цій пам'яті, ми скажемо трохи нижче.
Точка повернення з процедури – це позначення дій, виконуваних після її виклику. Це може бути наступний за її викликом оператор, як у програмі sort31. Або умова завершення чи продовження циклу, якщо виклик записаний останнім у тілі циклу.
Після виклику функції може застосовуватися операція до значення, що повертається з виклику, або обчислюватися наступний операнд у виразі, або обчислене значення може використовуватися в операторі. Наприклад, у програмі minimdis із підрозділу 3.3 результат виклику функції присвоюється змінної dd. У програмі simpi із прикладу 4.7 виклик функції issimple записана як умова в if-операторі, і після виклику визначається, яка з гілок повинна бути виконана. При обчисленні виразу sqr(x)+sqr(y) спочатку один за одним виконуються виклики функції sqr, потім повернуті з них значення додаються.
Конкретний вигляд точки повернення в машинній програмі ми не уточнюємо.
2. Локальна пам'ять процесу виконання виклику підпрограми
У підрозділі 3.4 ми вже говорили про те, що параметрам-значенням підпрограми при виконанні її виклику зіставляються власні ділянки пам'яті, тобто змінні. У блоці підпрограми можуть бути означені власні імена змінних – ділянки пам'яті зіставляються їм так само. Крім того, є ділянка пам'яті з точкою повернення. Сукупність усіх цих ділянок пам'яті називається локальною пам'яттю процесу виконання виклику підпрограми. Її часто неточно називають локальною пам'яттю підпрограми. Будемо грішити цим і ми. Змінні в ній також називаються локальними.
Якщо підпрограма є функцією, то до її локальної пам'яті додається змінна для збереження значення, що повертається з її виклику. Можна сказати, що ця змінна ставиться у відповідність імені функції.
Таким чином, наприклад, локальна пам'ять процедури swap із підрозділу 3.4 (у її остаточному вигляді) складається з єдиної змінної, зіставленої імені t, а пам'ять функції dd із програми minimdis (підрозділ 3.3) – із змінних, зіставлених іменам xx1, yy1, xx2, yy2 і dd. А також указівки на точку повернення.
3. Підстановка аргументів на місце параметрів
Перед тим, як починається виконання операторів тіла підпрограми, для неї виділяється локальна пам'ять і в ній запам'ятовується точка повернення. Потім обчислюються значення тих аргументів у виклику, які відповідають параметрам-значенням. Ці значення присвоюються локальним змінним, які поставлено у відповідність параметрам-значенням.
Присвоювання значень аргументів, тобто копіювання їх у локальну пам'ять, називається підстановкою аргументів на місце параметрів за значенням.