Проблемний ряд парадигм і мов програмування

Прагматичний характер інформатики передбачає постійне порівняння її складових. Залишається те, що в прагматичному відношенні найбільш ефективно: все інше або вибраковується, або переосмислюється і в результаті оновлюється. У цьому зв'язку особливий інтерес представляють парадигми програмування, оскільки їх стан в значній мірі визначає якість програмного забезпечення. У концептуальному відношенні парадигми програмування передують мовам програмування і програмам. Таблиця 4.5 дає уявлення про парадигмах програмування, число яких не встановлено точно.

Таблиця 4.5. Парадигми програмування

Парадигма

Основні ідеї

1

Автоматно-орієнтоване

програмування

Програма або її фрагмент осмислюються як модель будь-якого формального автомата

2

Імперативне програмування

Процес обчислення описується у вигляді інструкцій, змінюють стан програми

3

Процедурне програмування

Здається послідовність операторів (інструкцій), що визначають процедуру вирішення завдання

4

Функціональне програмування

Процес обчислення трактується як визначення значень функцій в математичному розумінні останніх (на відміну від функцій як підпрограм в процедурному програмуванні;

5

Логічне програмування

Вирішальне значення надається теорії і апарату математичної логіки

6

Декларативне програмування

Описує щось, а не його створення. Протиставляється імперативному програмуванню

7

Структурне програмування

Програма проектується у вигляді структури блоків

8

Об'єктно-орієнтоване програмування

Вирішальне значення надається концепту об'єкта, який розуміється як неподільне ціле, що належить класу і володіє певною формою поведінки

9

Аспектно-орієнтоване

програмування

Аспект розуміється як модуль або клас, який реалізує наскрізну функціональність

10

Аплікативного програмування

Систематичне здійснення застосування одного об'єкта до іншого

11

Подієво-орієнтоване програмування

Вибирається головний цикл додатки

Введення концепту "парадигма програмування" пов'язано з необхідністю усвідомити варіабельність мов високого ступеня концептуальності, або, як часто виражаються, абстрактності. У період домінування машинних кодів, ассемблеров і ранніх компіляторів, потреба в концепті парадигми програмування не відчувалася. Все, що стосувалося програмування, здавалося відносно простим і зрозумілим. Після появи зоопарку мов програмування ситуація кардинальним чином змінилася. У 1960-і рр. були введені подання про імперативний, функціональному та процедурному програмуванні, в 1970-ті - про структурний програмуванні, в 1980-ті - про об'єктно-орієнтованому програмуванні, яке у багатьох аспектах досі утримує пальму першості.

Концепт "парадигма програмування" в 1979 р в інформатику ввів американський учений Р. Флойд1. При цьому він тричі процитував філософа Т. Куна, який відомий як засновник вчення про парадигмах в рамках філософії науки. Але аргументація Флойда істотно відрізняється від доводів Куна, який в основному обігравав синонімічність термінів "парадигма" і "зразок". Згідно з Куном, парадигма є зразком, який дозволяє вирішувати головоломки. Флойд ж пов'язував концепт парадигми програмування по перевазі з двома іншими факторами: по-перше, зі своєрідністю мов програмування, а по-друге, з необхідністю виділення концептуальних підстав вживаються програмістом зусиль. Слід віддати належне Р. Флойду: йому вдалося досить точно визначити епістемологічний статус парадигм програмування. Прагматичний аспект справи вважався досить очевидним: парадигми потребують постійного вдосконалення.

Парадигми в інформатиці виступають як концептів, що нагадують за своєю природою принципи. Парадигми програмування, з одного боку, мають дуже загальним змістом, а з іншого - дають початок ланцюгах трансдукції, які, зокрема, наводять безпосередньо до програм. Якби Р. Флойд у своєму аналізі орієнтувався не стільки на концепт Кунівська парадигми, скільки на поняття наукового принципу, то, треба думати, він не залишився б у програші. У строго науковому сенсі слова парадигма програмування є не якимсь зразком, як це передбачається етимологією грецького слова, а саме науковим принципом.

Основні підходи до інтерпретації парадигм програмування. Розглянемо тепер питання про можливість упорядкування принципів програмування. Неважко помітити, що кожен з них має відносну самостійність, і лише всі разом вони утворюють єдине ціле. У табл. 4.5 вказано 11 парадигм. Такий список надмірний. Його доцільно скоротити, виділяючи в більш виразно вигляді актуальні для аналізу інформатики концептуальні одиниці. У цьому зв'язку резонно звернутися до кільком підходам, кожен з яких містить кілька парадигм:

  • (2) Алгоритмічний підхід (орієнтований на алгоритми).
  • (3) Логіко-математичний підхід (орієнтований на логіко-математичні засоби). Він включає функціональну і логічну парадигми.
  • (4) Процедурний підхід. Зазвичай в цю рубрику включають поряд з процедурної також імперативну парадигму. Його вершиною стало структурне програмування.
  • (5) Об'єктно-орієнтований підхід, який сходить до структурної парадигмі, зв'язавши воєдино дані і програми, об'єкти і процеси. У своїх специфікаціях цей підхід включає аспектне і подієве програмування. Що стосується аплікативного парадигми, то вона органічна як для об'єктно-орієнтованого, так і для логіко-математичного підходу.

Неважко бачити, що багатоланковий концептуальний перехід

знаменує собою цілком певний проблемний ряд зростаючій концептуальності. В історичному плані той чи інший культивований підхід завжди піддавався якоїсь модифікації, що призводило до появи принципово нової концептуальної одиниці. Читач детально ознайомлений з необхідністю супроводу проблемного ряду інтерпретаційним ладом. Треба думати, для нього не є несподіванкою інтерпретаційний лад

який означає, що при бажанні з'ясувати сенс того чи іншого підходу необхідно керуватися в першу чергу об'єктно-орієнтованим підходом. Досить часто перші три підходи з табл. 4.5 вважаються всього лише прелюдією до сучасного стану програмування. У такому випадку об'єктно-орієнтований підхід порівнюється з процедурним.

Об'єктно-орієнтоване програмування.

У ході неодноразових спроб відокремити той чи інший підхід від об'єктно-орієнтованого завжди з'ясовувалося, що такого роду ізоляція якщо і продуктивна, то лише до певних меж. Апаратний і алгоритмічний підходи дозволяють розглянути актуальні приклади комп'ютерної вичислімості, але не створити її всеосяжну теорію. Логіко-математичний підхід пропонує високі зразки концептуальності, але їм явно бракує комп'ютерної конкретики. Процедурний підхід зустрічається з істотними труднощами при необхідності врахування специфіки і, отже, структури даних. Якщо цим обліком можна знехтувати, то процедурний підхід виявляється цілком доречним. Таким чином, найбільш ємним у концептуальному відношенні є об'єктно-орієнтований підхід, так само як і та парадигма, яка складає його основний зміст.

Сутність цієї парадигми в деталях розглянув американський дослідник Г. Буч. У об'єктному програмуванні першорядне значення надається концептам об'єкта, класу і суперкласу (батьківського класу). Об'єкт є екземпляром класу, а той, у свою чергу, суперкласу. Не без підстав вважається, що таким чином концептуально відтворюється ієрархічну будову будь-яких систем. Що стосується алгоритмів, то вони відносяться до об'єктів. Використовуючи лінгвістичні терміни, можна сказати, що сенс дієслова визначається тим підметом, з яким він співвідноситься. Світ складається з речей і їх проявів, у якості яких виступають дії і поведінку. Всі об'єкти даного класу поводяться однаковим чином. Але що таке об'єкт?

Повсюдно поширене переконання, згідно з яким об'єктом є щось, що визначено за допомогою його істотних ознак. Це означає, що продовжує панувати досить наївна теорія абстракцій, яка не раз піддавалася гострій критиці. Об'єкт - це те, що має ознаками, а самі ознаки визначаються виходячи зі змісту відповідних наук. Коли дана обставина ігнорується, то доводиться заново винаходити велосипед.

Суть об'єктно-орієнтованого програмування полягає не в теорії абстракцій, а в переході на науково виправдані концептуальні позиції. Поряд з концептом абстракції ентузіасти об'єктно-орієнтованого програмування надають великого значення концептам інкапсуляції, успадкування та поліморфізму.

Інкапсуляція полягає в перенесенні уваги з пристрою об'єкта на його зовнішні відносини. Предметом уваги є не внутрішній устрій об'єкта, а його зовнішня поведінка. Маючи це на увазі, часто говорять, що внутрішній зміст об'єкта, будучи поміщеним у капсулу, ховається від користувача, який взаємодіє з об'єктом за допомогою інтерфейсу. Концепт інкапсуляції фіксує, по-перше, дискретність інформаційних систем, відмінність всередині-об'єкта і поза-об'єкта, а по-друге, необхідність і плідність різних способів аналізу та поведінки, що реалізуються як програмістом, так і користувачем.

Спадкування стосується відносини між класами. Воно має місце у випадку, якщо новий клас успадковує властивості і методи класу-предка, тобто до характеристик класу-предка додаються нові риси. Спадкування меті відобразити ієрархічність світу інформатики: воно завжди має деякі кордону.

Поліморфізм реалізується як управління різними типами даних за допомогою одного і того ж інтерфейсу. Це можливо, якщо в класі-нащадку зміна реалізації методу класу-предка супроводжується збереженням сигнатури останнього, зокрема типів аргументів і їх кількості.

Таким чином, основне досягнення об'єктно-орієнтованого підходу полягає в його концептуальної чистоті, прекрасно поєднаної з уроками концептуального аналізу з різних наук.

Критика об'єктно-орієнтованого підходу

У науковій літературі зустрічається величезна число критичних зауважень на адресу об'єктно-орієнтованого підходу. Однак найчастіше критика відноситься не до його концептуальним підстав, які цікавлять нас в першу чергу. Як правило, критики нарікають на невдале використання потенціалу об'єктно-орієнтованого програмування. Але, мабуть, найбільш різка оцінка міститься в статті Річарда Гебріела, який стверджує, що "об'єктна парадигма провалилася". Він закінчує свою статтю наступним висновком: "Врешті-решт, ніхто не агітує міняти те, як ми працюємо з об'єктами і об'єктно-орієнтованими мовами. Ні, просто необхідно різноманітність, необхідно працювати над новими парадигмами, щоб" дати розквітати тисячам квітів ". Самовідновлюватися , розподілені і складні системи, що самоорганізуються, адаптуються, зростаючі по крупицях як живі організми, що використовують статистичне поводження, що еволюціонують, що використовують надмірність заради безаварійності - системи, в основі яких можуть бути ще сотні різних перспективних ідей і підходів, про які ми ще й не думали , - все повинно бути дозволено і підтримано для руху вперед. Зараз саме час для визначення нової і зміни старої парадигми. Часто нове взагалі не виглядає науково, або раціонально, статті і розмови, що пояснюють нові

ідеї можуть звучати як пропаганда, як фантастика, або навіть як поезія; дійсність же грає більшу роль, ніж теореми або точні результати. Можна сказати, що це не буде наукою в нашому звичному розумінні. У світлі всього вищесказаного, можна з упевненістю заявити, що об'єктна парадигма обдурила наші очікування ".

Як бачимо, Річард Гебріел не знаходить альтернативи об'єктно-орієнтованого підходу. Він цілком правомірно виступає проти спроб насадження універсальної точки зору. Різноманітність, звичайно, необхідно, але при цьому, як очевидно, не варто очікувати зречення від старого. Було б дуже необачно в передчутті нового відмовитися від тих концептуальних досягнень, яких добилася наука сьогоднішнього дня. Гай Став у відповідь на критику Гебріела мав усі підстави заявити наступне: "Зрозуміло, об'єкти не вирішують всі проблеми програмування. Наприклад, вони не забезпечують поліморфічне абстрагування типів (тобто настроюються типів). Вони не забезпечують синтаксичного абстрагування (тобто макросів). Процедурне програмування раніше використовується при кодуванні методів. Але заявляти, що об'єкти провалилися, оскільки вони не вирішують все можливі проблеми, - це все одно, що говорити, що вуглеводи провалилися, оскільки ви не можете жити на чистому цукрі. Об'єктно -орієнтуватися програмування нагадує гроші зі старої жарти - це, може бути, і не всі, але на голову обганяє все, що може перебувати на другому місці ".

Завершуючи коротку характеристику об'єктно-орієнтованого підходу, відзначимо, що його назва здатне ввести в оману. Можна подумати, що мова йде про об'єкти в тому їх вигляді, в якому вони зустрічаються в реальному світі. Але в такому випадку об'єктам слід було б протиставляти мову і ментальність. Насправді ж акцент робиться не на онтології або, принаймні, далеко не тільки на ній одній. Строго кажучи, мова йде про концептуально адекватному відтворенні світу інформатики.

Мови програмування. Підходи та принципи програмування визначають можливість конструювання різних сімейств мов інформатики. Оскільки парадигми програмування утворюють висхідну лінію концептуальності, то не дивно, що більшість сучасних мов програмування мультипарадигмальной (табл. 4.6).

Таблиця 4.6. Парадигмальних мов програмування

Парадигмальних мов програмування

Цікаво відзначити, що мови програмування утворюють деякі сімейства, кожне з яких володіє певною спрямованістю. У найпростішому випадку її можна зобразити у вигляді лінійної структури. Однак найчастіше родовід мов програмування має досить гіллясту деревну структуру, при цьому розвинений мова програмування завжди є підсумком значного зростання інформаційного знання.

Приклад проблемного ряду мови програмування

Керуючись таблицею розвитку мов програмування, складеної Е. Левенецом2, представимо у скороченому вигляді родовід найпопулярнішого на сьогоднішній день мови С #:

У наявності не що інше, як цілком певний проблемний ряд. Кожен наступний мову перевершує попередній за деякими параметрами. Якби справи йшли по-іншому, то взагалі не було б необхідності у використанні нових мов.

Між проблемними рядами мов програмування існують поперечні зв'язки: вони еволюціонують не незалежні один від одного. Наприклад, мова Ruby (1993) увібрав багато ідей, спочатку з'явилися в мовах CLU (1974), Smalltalk (1980), Common USP (1984), Python (1991).

Мови програмування специфицируются не тільки у відповідності зі змістом певних парадигм, а й за типами завдань, серед яких особливо часто зустрічаються: 1) паралельні обчислення; 2) фізико-математичні розрахунки; 3) питання штучного інтелекту; 4) проблеми, пов'язані з розробкою інтерфейсу; 5) проектування програм-оболонок і систем; 6) оформлення документів і розробка баз даних.

Маючи на увазі метод концептуальної трансдукції, не без задоволення відзначаємо, що в інформатиці вона представлена незвичайно виразно. У будь-якої наукової теорії виявляються численні проблемні ряди, але не стільки і не в такому яскравому вигляді, як в інформатиці, зокрема в наростаючому потоці мов програмування. Концептуальна трансдукція в інформатиці починається з зразків обчислень, набуває більшу визначеність в парадигмах програмування, а потім виливається в повінь мов програмування, де чітко проглядаються окремі потоки. Таким чином, в цілому програмування виступає як могутній потік концептуальної трансдукції, початком якого є певні принципи, зосереджені в підходах, часто званих парадигмами, і розбивається потім на безліч течій, що утворюють проблемні ряди і строї.

Висновки

1. Сенс парадигм програмування переноситься на мови програмування, які також утворюють проблемні і інтерпретаційні ряди.

 
< Попер   ЗМІСТ   Наст >