- •2.3 Розвиток основних понять програмування 53
- •1. Формалізація простої мови програмування
- •1.1 Неформальний опис простої мови програмування
- •1.2 Формальний опис синтаксису мови sipl
- •Малюнок 1.1. Дерево синтаксичного виводу програми gcd
- •1.3 Формальний опис семантики мови sipl
- •Малюнок 1.3. Алгебра даних мови sipl
- •1.3.2 Функції
- •1.3.3 Композиції
- •1.3.4 Програмні алгебри
- •Малюнок 1.4. Алгебра функцій (програмна алгебра)
- •1.3.5 Визначення семантичних термів
- •1.3.6 Побудова семантичного терму програми
- •1.3.7 Обчислення значень семантичних термів
- •1.3.8 Загальна схема формалізації мови sipl
- •Малюнок 1.5 Схема визначення композиційної семантики
- •1.4 Властивості програмної алгебри
- •2. Розвиток основних понять програмування
- •2.1 Аналіз словникових визначень поняття програми
- •2.2 Розвиток поняття програми з гносеологічної точки зору
- •2.3 Розвиток основних понять програмування
- •2.3.1 Початкова тріада понять програмування
- •Малюнок 2.2. Сфера інформатизації як особлива сфера суспільства
- •Малюнок 2.3. Тріада цільового призначення програм
- •2.3.2 Тріада прагматичності програм
- •Малюнок 2.4. Тріада прагматичності програм
- •2.3.3 Тріада основних понять програмування
- •Малюнок 2.5. Тріада основних понять програмування
- •2.3.4 Пентада основних понять програмування
- •Малюнок 2.6. Пентада основних понять програмування
- •2.4 Розвиток основних програмних понять
- •2.4.1 Тріада основних програмних понять
- •Малюнок 2.7. Програма як діалектичне заперечення проблеми
- •2.4.2 Пентада основних програмних понять
- •2.5 Сутнісні та семіотичні аспекти програм
- •2.6 Програми і мови
- •2.7 Пентада програмних понять процесного типу
- •3. Формалізація програмних понять
- •3.1 Теоретико-функціональна формалізація
- •3.2 Класи функцій
- •3.3 Програмні системи
- •3.4 Рівні конкретизації програмних систем
- •4. Синтактика: формальні мови та граматики
- •4.1 Розвиток понять формальної мови та породжучої граматики
- •4.2 Визначення основних понять формальних мов
- •4.3 Операції над формальними мовами
- •4.3 Породжуючі граматики
- •4.5 Ієрархія граматик Хомського
- •4.6 Автоматні формалізми сприйняття мов
- •4.6.1 Машини Тьюрінга
- •4.6.2 Еквівалентність машин Тьюрінга та породжуючих граматик
- •4.6.3 Лінійно-обмежені автомати
- •4.6.4 Магазинні автомати
- •4.6.5 Скінченні автомати
- •4.7 Методи подання синтаксису мов програмування
- •4.7.1 Нормальні форми Бекуса–Наура
- •4.7.2 Модифіковані нормальні форми Бекуса–Наура
- •4.7.3 Синтаксичні діаграми
- •4.8 Властивості контекстно-вільних граматик
- •4.8.1 Видалення несуттєвих символів
- •4.8.2 Видалення -правил
- •4.8.3 Нормальна форма Хомського
- •4.8.4 Нормальна форма Грейбах
- •4.8.5 Рекурсивні нетермінали
- •4.9 Властивості контекстно-вільних мов
- •4.10 Операції над формальними мовами
- •4.11 Дерева виводу
- •4.12 Однозначні та неоднозначні граматики
- •4.13 Розв’язні та нерозв’язні проблеми кв-граматик та мов
- •4.14 Рівняння в алгебрах формальних мов
- •5. Теорія рекурсії (теорія найменшої нерухомої точки)
- •5.1 Рекурсивні визначення та рекурсивні рівняння
- •5.2 Частково впорядковані множини, границі ланцюгів та -області
- •5.3 Неперервні відображення
- •5.4 Теореми про нерухомі точки
- •5.5 Конструювання похідних -областей
- •5.6 Властивості оператора найменшої нерухомої точки
- •5.7 Застосування теорії ннт
- •5.7.1 Уточнення синтаксису мов програмування
- •5.7.2 Семантика мов програмування
- •5.7.3 Рекурсивні розширення мови sipl
3. Формалізація програмних понять
Перейдемо до побудови математичних уточнень введених програмних понять – до їх формалізації.
Згідно принципу розвитку від абстрактного до конкретного, можна побудувати різні формалізації поняття програми. Найпростіша формалізація відповідає тріаді основних програмних понять: дане – функція – ім’я функції. Задаючи деякий клас даних D, програму можна уточнити як пару (fn, f ), де fn – ім’я програми, а f: DD – функція, що задає семантику програми. Клас програм тоді задається як певний клас таких пар і називаються інтерпретованим класом програм.
Пентада програмних понять дозволяє побудувати більш конкретні та багаті формалізації для програм, що будуть враховувати їх композиційну структуру та структуру дескрипцій. В цьому випадку можна говорити про те, що те, що класи програм задаються мовою програмування (програмною системою), яка може бути подана як трійка систем, що задають семантику, синтаксис та відношення денотації.
Які ж формалізми можна використовувати для подання програмних систем?
3.1 Теоретико-функціональна формалізація
Традиційно для формалізації поняття програми використовують теоретико-множинний підхід, часто в дуже специфічній формі. Наприклад, такі методи формальної розробки програм, як Z [19] та B [20], безпосередньо спираються на аксіоматичну теорію множин Цермело-Френкеля. Тому часто під формальною семантикою розуміють теоретико-множинну семантику. Водночас, незважаючи на наявний багатий позитивний досвід теоретико-множинних формалізацій, починаються спроби проводити формалізацію програмних понять не тільки на основі поняття множини, а на основі поняття функції (відображення). Аргументація переваг такого теоретико-функціонального підходу може бути знайдена, наприклад у [21]. Стосовно поняття програми, теоретико-функціональний підхід підтримується принципом аплікативності (функціональності) програм. У рамках композиційно-номінативного підходу також будемо орієнтуватися на теоретико-функціональну формалізацію. Відразу ж відзначимо, що поняття функції і множини нерозривно пов'язані одне з одним, тому коли мова йде про використання теоретико-функціонального підходу то основна увага буде приділятися поняттю функції, а не поняттю множини. В зв'язку з цим сформулюємо наступний принцип.
Принцип теоретико-функціональної формалізації. Формалізація поняття програми здійснюється в рамках теоретико-функціонального підходу, в основі якого лежить поняття функції (відображення), яке має розглядатися на різних рівнях абстракції.
Сформульований принцип має дві сторони. Перша полягає в тому, що більш адекватним для формалізації поняття програми є теоретико-функціональний підхід, а не теоретико-множинний, який розглядає лише екстенсіональні аспекти функцій. Друга сторона принципу полягає в тому, що треба збагачувати існуючі визначення функцій, вводячи інтенсіональні аспекти та властивості функцій різних рівнів абстракції. Отже, мова йде про те, щоб зблизити поняття програми та функції, збагативши тлумачення функцій тими аспектами, які є у програм.
З огляду на програмістську орієнтацію підходу, функції будуть у першу чергу трактуватися аплікативно (операціонально), як деякі абстрактні пристрої (машини, автомати), які при застосуванні до вхідних даних, можуть виробляти результати.
Таким чином, у процесі формалізації будемо вводити об'єкти різного рівня абстракції, які належать деякому універсуму об'єктів. На граничному рівні абстракції об'єкти розглядаються як чорні скриньки. На наступному рівні абстракції серед цих об'єктів виділяються спеціальні об'єкти, які називаються функціями (відображеннями). Ці об'єкти трактуються як деякі машини, які мають вхідний порт (канал), на який можуть надходити дані, та вихідний порт (канал), з якого зчитуються результати. Передбачається, що результати можуть бути отримані за скінченний час. Якщо за скінченний час результату немає, то результат застосування машини (функції) до вхідного даного покладається не визначеним. На верхньому рівні абстракції внутрішній пристрій машини (функції) невідомий (машина є чорною скринькою з двома портами), на більш низьких рівнях абстракції структура може бути частково розкрита (сірий ящик). Для деяких функцій або об'єктів їх внутрішній пристрій цілком розкритий (біла скринька). Як наслідок будемо використовувати різні типи машин для опису класів відображень.