Передавання посилання. 1

Грами

Виклик

підпрограми

підпрограми

.

.

Заміщення викликів підпрограм


Відкриті підпрограми. 2

 

Оператори, складові капсули, підставляються в текст програми на місце виклику підпрограми, тому рядки програми розсовуються і вона стає більш довгою. При цьому у момент обробки виклику підпрограми оболонка капсули зникає, а оператори капсули стають звичайними операторами програми.

Для обробки викликів відкритих підпрограм використовується спеціальна програма – макропроцесор, яка працює до роботи компілятора і тому ще називається препроцесором, а процес обробки викликів називається макрообробкою, макрообчисленням, або препроцесорною обробкою.

На основі відкритих підпрограм будується програмна конструкція підпрограмного рівня інкапсуляції, котра називається макрос.


Закриті підпрограми. 1

 

Виклики закритих підпрограм обробляються завжди під час компіляції. При цьому компілятором на місці виклику генерується послідовність команд, які дають змогу звертатися до відповідного екземпляра підпрограми в пам'яті і повертати управління в точку, що йде слідом за викликом.

A
B
A
  A
  B
  C
A
B
A
A
B


підпро

програми після

виклики компіляції


Закриті підпрограми. 2

 

На основі закритих підпрограм будуються програмні конструкції підпрограмного рівня інкапсуляції – так звані процедури (procedure) і функції (function).

Механізм процедур і функцій є обов'язковим для використання у всіх мовах програмування високого рівня.

 


Процедурна абстракція

 

Із визначення інкапсуляції підпрограмного рівня випливає, що підпрограмна капсула – це послідовність структурних операторів, охоплених оболонкою. Порядок розміщення операторів у капсулі відбиває сутність розв’язувальної капсулою задачі.

Тоді поняття підпрограмної капсули дає змогу програмістові-читачеві (абстрагуватися) від того, як розв’язує задачу капсула, і зосередитись на тому, яку задачу вона розв’язує. Такий погляд на підпрограму відбиває сутність процедурної абстракції.


Абстракція управління

 

Підпрограмну капсулу можна також розглядати як «чорну скриньку», на вхід якої передається управління, а на виході управління повертається. Унаслідок передачі управління та виконання операторів капсули можна отримати корисний ефект, який знайде відображення у векторі стану програми, у точці після виклику підпрограми.

Такий погляд на підпрограму становить сутність абстракції управління.


Оболонка підпрограмної капсули. Параметри підпрограми

 

Часто у процесі обробки використовуються не лише значення об'єктів, що містяться всередині капсули (локальні об'єкти). Проте часто доводиться передавати значення всередину капсули. При цьому результат, якщо він існує, постає потреба передати в середовище, яке оточує підпрограму.

Значення, що передаються всередину підпрограми, зазвичай різняться від виклику до виклику, тому, об'єкти, котрі можуть мати такі значення, називаються параметрами (parameters).


Параметри закритої підпрограми. 1

 

Кожен параметр можна описувати у вигляді тотожності такого виду:

<індикатор типу параметру <позначення параметра> ≡ <позначення значення, яке він набуває параметр у виклику підпрограми>.

Наприклад, нехай ділянку програми (р1 + р2) – 2 * р3 оформлено у вигляді підпрограми, де р1, р2, р3 – позначення параметрів. Тоді її виклик із параметрами, які мають наступні значення (тотожності):

int р1 = 5;

int р2 = 10;

int р3 = 3;

виробляє результат - значення 9 типу int.


 

Параметри закритої підпрограми. 2

 

Очевидно, що заміна параметрів на їхні значення за допомогою вказаної тотожності має сенс тільки перед виконанням підпрограми. Тому такі описи необхідно виконувати перед кожним викликом підпрограми. Цей громіздкий процес поліпшили, розклавши його на два етапи:

Ø Ліві частини тотожностей ( в прикладі int p1, int p2, int p3) – описи, об'єднують у список (послідовність) і записують в інтерфейсу, при описі підпрограми;

Ø Праві частини тотожностей (в прикладі 5, 10, 3 – значення), в тому самому порядку, що й описи, записують у виклику, при використанні підпрограми.


Параметри закритої підпрограми. 3

 

Бачимо, що перший список – це лише зазначення позицій у першому списку позначень і типів для добавлених при виклиці правих частин, розміщених у другому списку. Тому позначення в першому списку називають позначеннями формальних параметрів, а іноді параметрами. А у другому – позначеннями фактичних значень параметрів або фактичними параметрами, іноді - аргументами, якщо фактичний параметр не використовується для повернення значення - результату.


Параметри закритої підпрограми. 4

Для позначення формальних параметрів використовується ідентифікатор. Очевидно, що типи та позиції елементів обох списків мають бути узгодженими. Такий спосіб формування списку називають позиційним.

Щоб підпрограму викликати, її необхідно позначити. Для позначення підпрограми використовується ідентифікатор.

Якщо є значення - результат виконання підпрограми, то його потрібно передавати в зовнішнє оточення підпрограми. Для цього можна використовувати список параметрів, або інший спосіб.


Параметри закритої підпрограми. 5

 

Таким чином, для застосування підпрограми необхідно виконати наступне:

Ø створити (описати) підпрограму, визначивши тіло підпрограми (послідовність операторів) та оболонку, виділивши інтерфейс, визначивши позначення підпрограми та вказавши список формальних параметрів (тип кожного параметра та його позначення, якщо список позиційний);

Ø визначити результат роботи підпрограми і, якщо він є значенням або значеннями і має передаватись в оточення виклику, то визначити спосіб передачі результату в навколишнє середовище;


Параметри закритої підпрограми. 6

 

Ø розмістити підпрограму на зберігання в програмі або у файловій системі (бібліотеці) операційної системи;

Ø у програмі визначити місця виклику підпрограми і записати їх, вказавши позначення підпрограми і список фактичних параметрів.


Локальні об'єкти підпрограм. 1

 

Одна з цілей, якої досягають застосуванням інкапсуляції – це обмежений доступ усередину капсули. Це не тільки неможливість передати управління в капсулу, обминувши інтерфейс, а й спроможність використовувати об'єкти (літерали, константи, змінні), описані лише всередині капсули. Такі об'єкти називаються локальними.

Локальні об’єкти - об’єкти, що використовуються тільки в середині капсули, і мають сенс тільки при виконанні підпрограми, в якій їх визначено.

Це дає змогу писати підпрограми, не дбаючи про контекст, наприклад, у сенсі вибору позначень об'єктів у програмі.


Локальні об'єкти підпрограм. 2

 

Використання локальних об'єктів пов'язане зі стратегією розподілу пам'яті для цих значень. Їх дві:

1) статична – значення локальних об'єктів зберігаються між викликами капсул (підпрограм), але|та| самі об'єкти недоступні поза|зовні| підпрограмою;

2) динамічна – при кожному виклику підпрограми створюється новий набір локальних об'єктів, а їхні значення після|потім| закінчення виклику не зберігаються.

 

Першу стратегію реалізовано шляхом опису об’єктів static| в мові|язиці| С та типізованих констант в мові Pascal. Друга стратегія ґрунтується на блоці (розподіл пам’яті в стек).


Глобальні об'єкти підпрограм

Водночас у підпрограмі буває дозволено використання об'єктів, описаних поза|зовні| нею. Ці об'єкти називаються глобальними.

Глобальні об’єкти – об’єкти, описані поза підпрограмою, що існують до, під час і після виконання підпрограми.

Очевидно, що глобальні об'єкти можна використовувати для повернення результатів, вироблених підпрограмою, тому що вони доступні в ній і в її оточенні.

Але, не дивлячись на те, що використання глобальних об’єктів у підпрограмі дозволено синтаксично, застосовувати програмний об’єкт, що потрапив у підпрограму, обминувши інтерфейс підпрограмної капсули вкрай небажано.


Правило хорошого стилю програмування

 

Не використовуйте глобальні об’єкти для передачі інформації між оточенням виклику підпрограми й оточенням виконання та для повернення результату виконання підпрограми!


Відмінності між параметрами та локальними об’єктами підпрограми. 1

 

Принципові відмінності між параметрами підпрограм та її локальними об'єктами полягають у ступені|мірі| їхньої «локальності» та способах їх ініціалізації.

Параметри (parameters) – це частина сполучення підпрограми з її оточенням. Вони використовуються тільки для передавання інформації між оточенням виклику підпрограми та оточенням виконання. Початкові значення параметрів визначаються фактичними значеннями виклику (з оточення).


Відмінності між параметрами та локальними об’єктами підпрограми. 2

 

Локальні об'єкти (local objects) – це тимчасові ресурси, необхідні для виконання підпрограм та реалізації процедурної абстракції, тому вони повністю приховані від користувача підпрограми. Ініціалізація локальних об'єктів виконуються при їх описі або за допомогою операторів присвоювання.

Усі локальні об'єкти потребують повної специфікації, а коректність їх використання можна перевірити компілятором.


 

Прототип підпрограми

 

Очевидно, що синтаксична правильність частини|частки| програми, яка використовує об'єкти, введені|запроваджувати| через механізм параметрів, може бути перевірена|лише| шляхом визначення відповідності списку формальних параметрів у описі та фактичних – у виклику.

Компілятор може визначати синтаксичну правильність використаних об'єктів, але|та| для цього потрібно, щоб|аби| відповідна частина|частки| підпрограми мала компільовану специфікацію. Цим пояснюється|тлумачить| те, що у всіх мовах|язиках| програмування, якщо підпрограму використано раніше, ніж її описано, потрібно до її виклику навести специфікацію інтерфейсу. Наприклад, такою специфікацією є прототип підпрограми в мові|язиці| С.


Способи передачі значень параметрів підпрограми. 1

 

Відомо три фундаментальних способи, згідно з якими можна в підпрограму передавати фактичні параметри (зв’язувати формальні та фактичні параметри). Способи враховують устрій змінної, тому що формальний параметр завжди є змінною відповідного типу.

Згідно цього устрою розрізняють передачу:

Ø значення вмісту (значення, по значенню);

Ø значення імені (посилання, по посиланню);

Ø ім'я (найменування, по найменуванню).


Способи передачі значень параметрів підпрограми. 2

 

Механізм зв’язування фактичних і формальних параметрів мови програмування визначає спосіб передавання значень у тіло підпрограми.

При цьому в перших двох способах питання, як передавати фактичний параметр у підпрограму (обчислення параметру), розв’язує програма, що викликає підпрограму.

У третьому способі передається не обчислений параметр, а обчислення відбувається щоразу, коли використовується відповідний формальний параметр.


Передавання значення вмісту. 1

 

Фактичний параметр обчислюється, і знайдене значення підставляється замість значення відповідного формального параметра:

 


Передавання значення вмісту. 2

 

Використання програмних об’єктів як фактичних параметрів:

Ø якщо фактичний параметр літерал або константа, то обчислюється значення літерала, і воно заміщує значення вмісту формального параметру;

Ø якщо фактичний параметр - змінна, то вона розіменовується, а значення її вмісту підставляється замість значення вмісту формального параметра;

Ø якщо зміннаіндексованоготипу, то індекс обчислюється, далі відбувається розіменування змінної, і значення вмісту підставляється замість значення вмісту формального параметра;

Ø якщо фактичний параметр вираз, то він обчислюється і здобуте значення замінює значення вмісту формального параметра.


Передавання значення вмісту. 3

 

Семантика:

Якщо формальні параметри вважати локальними об'єктами, описаними в підпрограмі, то передавання значень відповідає створенню локальних змінних із позначенням формальних параметрів, ініціалізованих здобутими значеннями.

Операції присвоювання над формальними параметрами дозволені, але вони діють тільки на локальні об'єкти – формальні параметри підпрограми, які після її завершення зникають.


 

Обчислюється посилання (значення) імені об'єкту, котрий є фактичним параметром, і воно заміщує посилання в імені формального параметра: