
- •М. С. Нікітченко теорія програмування Частина 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. Розвиток основних понять програмування
Постійне розширення сфери застосування обчислювальної техніки і необхідність побудови все більш складних, але надійних програмних систем змушують дослідників знову і знову звертатися до визначення основних понять програмування. Незважаючи на різноманіття існуючих моделей програм і парадигм програмування, не можна не визнати тієї обставини, що розробка загальноприйнятної теорія програмування ще не завершена. Водночас зрозуміло, що центральною складової такої теорії повинні бути строгі уточнення (експлікації) понять програми і програмування. Одним із підходів до початкових уточнень цих понять є композиційно-номінативний підхід, який може розглядатися як подальший розвиток композиційного програмування.
Цей підхід базується на наступних трьох основних принципах: розвитку, композиційності і номінативності. Принцип розвитку (від абстрактного до конкретного) говорить про поступове уточнення поняття програми, починаючи з найбільш абстрактних і продовжуючи більш конкретними і багатими уточненнями. Принцип композиційності трактує програми як функції, що будуються з інших функцій за допомогою спеціальних операцій, які називаються композиціями. Принцип номінативності говорить про необхідність використовувати відношення іменування для роботи з програмами і даними.
Ідеї розвитку, композиційності і номінативності добре відомі і простежуються з глибокої давнини. Категорія розвитку є однією з центральних категорій у такому філософському напрямку, як діалектика, серед представників якої виділимо Геракліта Ефеського та Г.В.Ф. Гегеля. Композиційні властивості мовних виразів були чітко сформульовані Г. Фреге та Р. Карнапом. Принцип композиційності був основним у композиційному програмуванні, запропонованому В.Н. Редьком. Різним аспектам номінативності (іменування) присвятили свої роботи Аристотель, Гоббс, Джон Стюарт Мілль, Джордж Буль, Пірс, Фреге, Рассел, Кріпке і багато інших.
Перш ніж переходити до детального розгляду основних понять програмування, проаналізуємо визначення поняття «програма», наведені у словниках.
2.1. Аналіз словникових визначень поняття програми
Почнемо з визначень поняття програми, які наводяться у словниках і енциклопедіях. Великий тлумачний словник сучасної української мови1, Меріам-Убстер Електронний словник2 та інші словники дають наступне трактування слова «програма».
Етимологія: від грецького prographein – попередній запис (pro – перед + graphein – писати). Пізніше латинське programma: письмове повідомлення. Значення3:
наперед продуманий план якої-небудь діяльності, роботи тощо;
план для програмування деякого механізму (як комп’ютер);
послідовність кодів інструкцій, що можна ввести в механізм (наприклад, комп’ютер).
Аналізуючи ці та інші визначення терміна «програма», дійдемо висновку, що визначення використовують такі терміни, як «план», «послідовність», «дія», «інструкція», «програмування», «комп'ютер» і т.д. Подивимося, наприклад, на визначення першого терміна в цьому списку. «План» – це:
креслення або діаграма,
метод досягнення кінцевої мети,
упорядкована класифікація частин проекту або мети,
детальна програма дій.
Бачимо, що визначення терміна «план», які нас цікавлять, звертаються знову до слова «програма». Звідси можна зробити два висновки:
1) словникові визначення поняття програми призводять до хибного кола, бо ніякого глибокого розвитку цього поняття не відбувається, а є лише досить проста тавтологія, коли фактичного розкриття терміна немає, а стверджується, що програма – це те саме, що і план, а план є програмою;
2) поняття програми є дуже широким поняттям, яке не визначається як конкретизація деякого іншого поняття (не визначається за схемою родовидових понять Аристотеля).
Подібна ситуація буде і з іншими термінами з нашого списку. Правда, критикуючи словникові визначення за неповноту, зауважимо, що вони надають початкове уявлення про значення різних термінів. Тому треба погодитися зі словами М.Т. Рильського:
Не бійтесь заглядати у словник:
це пишний яр, а не сумне провалля.
Таким чином, термін 'програма' є надзвичайно загальним, багатоаспектним і не може бути простим способом визначений через інші терміни. Але як же тоді визначати такі загальні терміни?
Сформулювавши питання таким чином, ми фактично ставимо запитання про методи наукового пізнання і тим самим полишаємо область програмування і переходимо у більш загальну сферу, що яка є розділом філософії і яка називається гносеологією. Гносеологія (також вживається термін епістемологія) визначається як наука про взаємини суб’єкта та об’єкта, про закони, форми і методи пізнання, а також відношення знання до дійсності, критерії його істинності і достовірності. Тут суб’єкт та об’єкт – філософські категорії: під суб’єктом розуміється той, хто досліджує об’єкт.