- •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
1. Формалізація простої мови програмування
Центральним завданням теорії, зокрема і теорії програмування, є визначення та дослідження її основних понять. Зробити це не так просто, бо в теоріях, як правило, використовується багато понять, які пов’язані одне з одним. Тому спочатку доцільно ввести основні поняття теорії програмування на невеликому прикладі. Це буде програма знаходження найбільшого спільного дільника двох чисел. Програма записана на деякій простій мові. В цьому розділі ця мова буде формалізована, тобто буде описано її синтаксис та семантику. Також будуть досліджені деякі властивості програм цієї мови.
1.1 Неформальний опис простої мови програмування
Для посилання на певну мову треба надати їй ім’я. Для імені часто використовують абревіатуру короткої характеристики мови. Зважаючи на традиції використання латинських літер в науковій символиці, утворимо абревіатуру SIPL від характеристики SImple Programming Language (Проста Мова Програмування).
Цю абревіатуру можна розшифрувати трохи інакше, вказуючи на імперативність або структурованість цієї мови:
Simple Imperative Programming Language
Structured Imperative Programming Language
Говорячи неформально, мова SIPL має змінні цілого типу, над якими будуються арифметичні вирази та умови. Основними операторами є присвоєння, послідовне виконання, розгалуження, цикл.
Мова SIPL може розглядатися як надзвичайно спрощена традиційна мова програмування, наприклад, Паскаль. В мові SIPL відсутні типи, оператори вводу-виводу та багато інших конструкцій традиційних мов програмування. Разом з тим ця мова є досить потужною, щоб програмувати різні арифметичні функції, більше того, в цій мові можуть бути запрограмовані всі обчислювальні функції над цілими числами.
Приклад 1.1. Програма GCD знаходження найбільшого спільного дільника чисел M та N за алгоритмом Евкліда:
GCD
begin
while MN do
if M>N then M:=M–N else N:=N–M
end
Оскільки програми призначені для обчислення результатів за вхідними даними, розглянемо неформально процес виконання цієї програми на вхідних даних, у яких M має значення 8, а N – 16. Вважаємо, що дані записуються в пам’ять, а оператори виконуються деяким процесором. Тому розмітимо програму, відмічаючи оператори мітками:
0: begin
1: while MN do
2: if M>N then 3: M:=M–N else 4: N:=N–M
end
Процес виконання програми можна подати у вигляді таблиці, кожний рядок якої вказує на номер виконуваного оператора та на нові значення змінних (детали процесу виконання можна знайти з книжках з основ програмування). Для нашого прикладу така таблиця може мати наступний вигляд.
Таблиця 1.1
|
Мітка |
Значення умови |
Значення M |
Значення N |
|
0 |
|
8 |
16 |
|
1 |
MN – true |
|
|
|
2 |
M>N – false |
|
|
|
4 |
|
|
8 |
|
1 |
MN – false |
|
|
Програма припиняє роботу із значеннями M та N, рівними 8. Це число і є найбільшим спільним дільником.
Аналізуючи цю програму та процес її виконання, відзначаємо два аспекти:
-
синтаксичний (текст програми),
-
семантичний (смисл програми – те, що вона робить).
В нашому прикладі ні синтаксис, ні семантика не задані точно (формально). Ми маємо лише інтуїтивне розуміння програм мови SIPL. Тому важко відповідати на питання, які вимагають точного опису мови. Наприклад незрозуміло, чи можна поставити крапку з комою між оператором та символом end, що дозволяється робити в багатьох мовах програмування (синтаксичний аспект). Незрозуміло також, чи завжди наведена програма буде обчислювати найбільший спільник дільник для довільних значень M та N (семантичний аспект).
Щоб відповідь на такі питання стала можливою, необхідно надати строге (формальне) визначення нашої мови програмування. Лише тоді можна буде застосувати математичні методи дослідження програм та будувати відповідні системи програмування, зокрема транслятори та інтерпретатори.
Безумовно, уточнення (експлікацію) синтаксичного та семантичного аспектів можна давати по-різному. Ми спочатку розглянемо традиційні формалізми для опису мов.
