- •М. С. Нікітченко теорія програмування Частина 1
- •1. Формалізація простої мови програмування
- •1.1. Неформальний опис простої мови програмування
- •1.2. Формальний опис синтаксису мови sipl
- •1.3. Формальний опис семантики мови sipl
- •1.3.2. Функції
- •1.3.3. Композиції
- •1.3.4. Програмні алгебри
- •1.3.5. Визначення семантичних термів
- •1.3.6. Побудова семантичного терму програми
- •1.3.7. Обчислення значень семантичних термів
- •1.3.8. Загальна схема формалізації мови sipl
- •1.4. Властивості програмної алгебри
- •2. Розвиток основних понять програмування
- •2.1. Аналіз словникових визначень поняття програми
- •2.2. Розвиток поняття програми з гносеологічної точки зору
- •2.3. Розвиток основних понять програмування
- •2.3.1 Початкова тріада понять програмування
- •2.3.2. Тріада прагматичності програм
- •2.3.3. Тріада основних понять програмування
- •2.3.4. Пентада основних понять програмування
- •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.4. Породжуючі граматики
- •4.5. Приклад породжуючої граматики та її властивості
- •4.6. Ієрархія граматик Хомського
- •4.7. Автоматні формалізми сприйняття мов
- •4.7.1. Машини Тьюрінга
- •4.7.2. Еквівалентність машин Тьюрінга та породжуючих граматик
- •4.7.3. Лінійно-обмежені автомати
- •4.7.4. Магазинні автомати
- •4.7.5. Скінченні автомати
- •4.8. Методи подання синтаксису мов програмування
- •4.8.1. Нормальні форми Бекуса–Наура
- •4.8.2. Модифіковані нормальні форми Бекуса–Наура
- •4.8.3. Синтаксичні діаграми
- •4.9. Властивості контекстно-вільних граматик
- •4.9.1. Видалення несуттєвих символів
- •4.9.2. Видалення -правил
- •4.9.3. Нормальна форма Хомського
- •4.9.4. Нормальна форма Грейбах
- •4.9.5. Рекурсивні нетермінали
- •4.10. Властивості контекстно-вільних мов
- •4.11. Операції над формальними мовами
- •4.12. Дерева виводу
- •4.13. Однозначні та неоднозначні граматики
- •4.14. Розв’язні та нерозв’язні проблеми кв-граматик та мов
- •4.15. Рівняння в алгебрах формальних мов
- •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
2.3.2. Тріада прагматичності програм
Розглядаючи користувача як тезу, а програму – як антитезу, ми зараз повинні віднайти синтезуюче поняття, яке розкриває спосіб користування програмами. Згідно з принципом програмологічної перспективи потрібно конкретизувати це поняття таким чином, щоб наблизитися до програмування (як програмування, орієнтованого на обчислювальну техніку). Ця конкретизація полягає у розкритті засобів реалізації цього відношення. Процес обчислення саме і є таким засобом. Це означає, що необхідно ввести поняття процесу виконання (за допомогою певного виконавця, наприклад комп'ютера). Враховуючи, що процес виконання відбувається, як правило, за допомогою комп’ютера, будемо такий процес також називати процесом обчислення програми.
Отже, використання програми полягає в першу чергу в її виконанні. З’являється нова тріада, яку назвемо тріадою прагматичності програм:
Рисунок 2.4. Тріада прагматичності програм
Основні відношення в цій тріаді наступні:
прагматика (програма – користувач);
обчислюваність (програма – процес виконання);
інтерфейс (процес виконання – користувач).
Відзначимо, що хоча на перших етапах розвитку понять програмування введені відношення є абстрактними та бідними, при подальшій конкретизації вони розгортаються до дуже важливих та багатих відношень. Так, відношення обчислюваності є предметом теорії алгоритмів, якій присвячено чимало книжок. Інше відношення «користувач – процес обчислення». Його можна називати по-різному: (людино-машинний) інтерфейс, діалог. Це відношення деталізується як в монографіях, так і в державних стандартах. Можна виокремлювати різні рівні абстракції, пов’язані з цим відношенням. Наприклад:
Найбільш абстрактним буде вивчення відношення «користувач – процес обчислення « – в абстракції від програм та проблем.
Більш конкретним буде вивчення цього відношення з урахуванням особливостей програм.
Ще більша конкретність з’явиться при урахуванні особливостей програм та проблем тощо.
На кожному рівні абстракції є свої специфічні особливості відношення інтерфейсу. Наприклад, на першому рівні можна врахувати сприйняття користувачем кольорів монітору, швидкість набору символів на клавіатурі. На другому рівні можна врахувати кількість інформації, що видається програмою, спосіб розміщення цієї інформації на моніторі тощо. На третьому рівні додатково враховуються особливості проблеми, скажімо, чи вимагає проблема реакції у реальному часі.
Звичайно, є і багато інших конкретних рівнів.
2.3.3. Тріада основних понять програмування
Перейдемо до наступного кроку розвитку. Цей крок полягає в тому, щоб розкрити відношення адекватності. Це відношення розкривається у процесі створення, породження програм. Цей аспект називається генетичним аспектом програм. На цьому кроці з’являється поняття, що поєднує поняття програми та проблеми. Таким поняттям буде програмування (як процес), яке повинно пов’язати разом проблему і відповідну їй програму. Таким чином, побудовано нову тріаду розвитку: проблема (теза) – програма (антитеза) – процес програмування (синтез). Цю тріаду назвемо тріадою основних понять програмування, бо саме в ній уперше з'являється поняття програмування (тут терміни програмування та процес програмування розглядаємо як синоніми, проте будемо часто вживати саме термін «процес програмування», щоб підкреслити динамічний характер програмування). Крім того, термін «основні» тут використаний для того, щоб підкреслити, що суть програмування полягає саме у створенні необхідної єдності проблеми предметної області і програми, що використовується для розв’язання цієї проблеми.
Поняття основної тріади програмування пов’язані певними співвідношеннями (рис. 2.5). Так, поняття програмування та проблеми з’єднує відношення орієнтованості процесу програмування на розв'язок певної проблеми (проблемно-орієнтованість). Що ж стосується взаємодії понять програми та програмування, то тут виділимо два відношення:
відношення генетичності програм (відношення «програма – процес програмування»);
відношення експлікативності процесу програмування (відношення «процес програмування – програма»).
Для розкриття основної ідеї цих відношень розглянемо приклади.
Припустимо, що ви хочете купити мобільний телефон. Серед різних параметрів, які визначають ваш вибір, буде і параметр, пов’язаний із виробником телефону, тобто яка фірма і на якому заводі виробила телефон. Якщо це – бренд (на сучасному етапі – Nokia, Samsung, Motorola), то ви маєте більше довіри до якості телефону. Цей приклад демонструє важливість генетичного аспекту. Те саме стосується і генетичності програм: якщо програма (програмна система) розроблена відомою фірмою, яка використовує гарні технології розробки програм, то слід очікувати, що така програма буде більш надійною та ефективною, ніж програма, створена фірмою-одноденкою.
Відношення процесу програмування до програми буде конкретизовано як відношення уточнюваності (експлікативності процесу програмування).
Щоб зрозуміти, що означає це відношення, треба розглянути, як процес програмування пов’язаний із програмою. Спочатку про програму нічого не відомо (ні її розмір, ні кількість операторів і т.д.). Програма виступає як чорна скринька, наповнення якої з’явиться пізніше. На наступних кроках процесу програмування вимальовується деяка структура програми, її частини і т. д. Програма поступово уточнюється. Процес цих уточнень і задає відношення експлікативності.
Зробимо термінологічне зауваження: інколи вживають терміни «деталізація», «конкретизація», «декомпозиція». В англомовній літературі часто вживається термін «refinement», одним із смислів якого є уточнення.
Рисунок 2.5. Тріада основних понять програмування
Уведені відношення також пов'язані одне з одним. Так, можна говорити про те, що відношення адекватності програми проблемі є певним «добутком» відношень проблемно-орієнтованості та уточнюваності: чим вони кращі, тим кращою є адекватність програми. Тобто можна записати таку символічну (але не формальну) формулу:
(адекватність програми проблемі)=
=(проблемно-орієнтованість процесу програмування) *
*(експлікативність процесу програмування)