
- •Лекція 3.2. Парадигми програмування
- •Діаграма рівня мов математичного запису.
- •Структурні,
- •Теорема про структурне програмування:
- •Людина лише формулює розв'язувану задачу, а пошуком рішення займається імперативна система.
- •Концепція функціонального програмування.
- •Програма на Прологу складається з предикатів. Програма на Прологу і база знань – синоніми. Мета формулюється також у вигляді предикатів. Виконання програми на Прологу – це резолюція мети.
- •Сучасний етап розвитку декларативних мов.
- •Інші напрямки досліджень в області декларативних мов в останнє десятиліття:
Лекція 3.2. Парадигми програмування
Вступ. Існує близько 2 500 мов програмування (і це не перебільшення), однак, попри таку різноманітність, число мов, на яких пише більшість, у межах десятка.
Причин, чому деяка
мова
не стала популярною, не менш, чим самих
мов.
Це й чвари
між їхніми творцями, і погано організований
продаж, і поява
нових технологій, і просто відверта
«кривизна», традиції.
Історію розвитку мов програмування представляють у формі деякої мережі.
У спрощеній формі наближення до генеалогічного дерева мов високого рівня має наступний вигляд, де явний, безпосередній зв'язок відображений суцільною стрілкою, а побічний вплив – пунктирною.
У принципі всі мови програмування створюють для рішення задач із використанням математики (практично всіх її розділів). Найбільш близькою до людини є мова математичного запису умови задачі і її рішень. Мається на увазі не лише строго формалізованого правила математичних позначень, а й виклад із застосуванням природних для людей прийомів оформлення й коментування. Можливо навіть із застосуванням фраз на звичайних мовах спілкування, подібно до того як записують задачі школярі або студенти.
Історія програмування показує прагнення, з одного боку наблизитись до цього ідеалу, а, з іншого - якнайбільше автоматизувати процес рішення задач, щоб програміст не описував у всіх подробицях алгоритми й дії. Ідеальною автоматизацією є повна відсутність будь-яких послідовностей дій - оператор має вводити лише умови задачі - все інше, включаючи вибір методу рішення, побудова структур даних, породження алгоритмів має виконувати сама система програмування. Оці міркування побудовано у вигляді діаграми [Орехов А.И. Языки программирования – эволюция? – 2005 г. http://softcraft.ru/paradigm/common/evol/index.shtml].
Згідно діаграми, мови програмування еволюціонують за деякою загальною закономірністю. Їхній рівень і ступінь декларативності плавно і взаємозалежно зростають. Найпрогресивнішими для прикладного високорівневого програмування є, мабудь мови, що ґрунтуються на функціональному й логічному підходах. Звичайно є величезна кількість мов, здатних зайняти деяке положення на діаграмі, але мається на увазі лише загальна тенденція розвитку.
Діаграма рівня мов математичного запису.
Залишається питання, що перебуває в правому нижньому куті діаграми? Це повинна бути мова, максимально наближена до апаратного рівня машин, але при цьому бути вкрай декларативною. Для такої мови навіть пропонують назву - Ідеальний Асемблер. Можливо в майбутньому (може бути й не такому вже й далекому) такі надінтелектуальні процесори будуть створені.
Типи парадигм. Усі мови і системи програмування за типом їхньої парадигми розподіляють на чотири різновиди:
директивні (directive), процедурні (procedural) або імперативні (imperative),
Структурні,
декларативні (declarative),
об'єктно-орієнтовані (object-oriented).
Визначення 1. Парадигма:
згідно з Томасом Куном — це система ідеалів і норм постановки й вирішення проблем;
у програмуванні — це сукупність ідей і понять, що визначають стиль написання програм, тобто сукупність правил, що лежать в основі синтаксису й семантики мови програмування.
Імперати́вне програмування — описує процес обчислення у вигляді інструкцій, що змінюють стан програми. Засноване на абстракції машини Тьюринга-Поста як альтернативного визначення поняття алгоритму.
Це – мови Асемблер, Фортран, Алгол, Бейсик, Кобол, Паскаль, Си й багато інших.
Вирішуючи задачу, імперативний програміст спочатку створює модель у деякій формальній системі, а потім переписує рішення на імперативну мову в термінах комп'ютера. Але, по-перше, для людини міркувати в термінах комп'ютера досить неприродно. По-друге, переписування рішення на мову програмування, по-суті, не має відношення до розв'язку вихідного завдання. Часто імперативні програмісти навіть розділяють роботу відповідно до двох вказаних етапів: постановники задач формулюють розв'язок задачі у мові специфікації, а інші – кодують його у мові програмування.
Неструктурне програмування допускає використання в явному виді команди безумовного переходу (типу GOTO). Імперативна програма схожа на природно мовні накази, команди, які повинен виконати комп’ютер. В усіх мовах директивного програмування команди зводяться або до присвоювання змінній деякого значення, або до вибору наступної команди. Присвоюванню може передувати ряд арифметичних і інших операцій, а команди вибору реалізуються у вигляді умовних операторів і операторів повторення (циклів).
Для класичних директивних мов характерно, що послідовність виконуваних команд однозначно визначається її вхідними даними, тобто поведінка імперативної програми повністю детермінована.
Директивне програмування – один з найприродніших для людини стилів написання програм, які призводять зрештою до обчислення шуканих величин.
Даний стиль успадкований від програм мовою асемблера, оскільки там команда переходу є обов'язковою. Однак у мовах високого рівня наявність команди переходу спричинює масу серйозних недоліків:
програма перетворюється в “спагетті” з нескінченними переходами нагору-униз, її дуже важко супроводжувати й модифікувати;
фактично неструктурний стиль програмування не дозволяє розробляти великі проекти;
первісне навчання програмуванню на базі неструктурної мови приводить до величезних труднощів при переході на більш сучасні стилі. Як зазначав відомий голандський учений Е. Дейкстра, “програмісти, початково орієнтовані на Бейсик, розумово неповноцінні без надії на зцілення”.
Директивне програмування стали називати процедурним, коли в процесі збільшення складності моделюємих систем і розміру одержуваних програм виникла концепція підпрограм, називаних також процедурами, функціями або методами. Підпрограма дозволяє локалізувати в ній процес виконання певної дії, яка може бути повторена багаторазово за допомогою механізму виклику.
СтруктУрне програмУВАННЯ — методологія розробки програмного забезпечення, в основі якої лежить подання програми у вигляді ієрархічної структури блоків. Запропонована в 1968 році Е. Дейкстрой на противагу необгрунтово частому використанню програмістами оператора goto безумовного переходу, розроблена й доповнена Н. Віртом.
Відповідно до даної методології
Кожен програмний модуль (блок, функція, процедура) повинен мати лише один вхід і тільки один вихід. Задача розбивається на велике число дрібних підзадач, кожна з яких вирішується своєю процедурою або функцією (декомпозиція задачі). Проектування програми йде за принципом зверху вниз: спочатку визначаються необхідні для розв'язку програми модулі, їх входи й виходи, а потім уже розробляються ці модулі. Такий підхід разом з локальними іменами змінних дозволяє розробляти проект силами великої кількості програмістів.
Будь-який алгоритм можна реалізувати, використовуючи лише три керуючі конструкції:
послідовне виконання — однократне виконання операцій у тому порядку, у якому вони записані в тексті програми;
розгалуження — однократне виконання однієї із двох або більш операцій, залежно від виконання деякої заданої умови;
цикл з передумовою, або із постумовою — багатократне виконання однієї й тієї ж операції доти, поки виконується деяка задана умова (умова продовження циклу).
У програмі базові конструкції можуть бути вкладені довільним чином, але інших засобів (зокрема, команди GOTO) керування послідовністю операцій не передбачається
Логічно цілісні обчислювальні блоки (повторювані або не повторювані) можуть оформлятися у вигляді процедур або функцій. Тоді в тексті основної програми, замість поміщеного в підпрограму фрагмента, вставляється інструкція виклику підпрограми. При виконанні такої інструкції виконується викликана підпрограма, після чого виконується інструкція, наступна за командою виклику підпрограми.
В 1966 році італійськими математиками К. Бомом і Дж. Якопини була сформульована теорема, як можна уникнути використання оператора переходу GOTO.