Яка різниця між імперативними, логічними та функціональними мовами програмування?


Відповідь 1:

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

Імперативне програмування, представлене Java, JavaScript, PHP, Visual Basic, C # та багатьма іншими (і теоретично найближче до машини Тюрінга), полягає в тому, щоб просто надати інструкції своєму комп’ютеру (звідси назва - ви прямо говорите своєму комп'ютеру, як це зробити робимо все крок за кроком.) Прочитайте введення з периферійних пристроїв, виконайте цей арифметичний обчислення, вивчіть цю позицію пам'яті для певного вмісту, перейдіть до наступної, якщо її немає, збережіть результат у цій змінній. У проекті та традиціях, що вкладається в це визначення, є безпосереднє управління обчислювальними ресурсами. Ви точно говорите своєму комп’ютеру, як щось робити.

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

Ось сума над елементами масиву в імперативному псевдокоді. Це здебільшого для порівняння з кодом для інших парадигм.

int y = 0; for (int i = 0; i 

Функціональне програмування має свою основу на іншій обчислювальній моделі, ніж машина Тьюрінга під назвою «Ламбда обчислення». Елементарним складовим елементом є функції (більш відповідні математичним видам, ніж їх еквіваленти в інших парадигмах), а не інструкції. Насправді вся програма розглядається як одна велика функція, яка виробляє набір вихідних даних із вашого вводу.

Якщо придивитись більш детально, функціональна програма складається виключно з функцій, складених у вирази, що описують набір даних рішення (частковий або остаточний) як відображення набору вхідних даних. Відмінність глибша, ніж це здається спочатку: навіть основні операції (наприклад, арифметичні) визначаються як самі функції. Ви відмовляєтесь від прямого контролю над обчислювальними ресурсами і довіряєте компілятору обробляти їх за вас, описуючи, як виглядає набір даних результатів від його зв’язку з вихідними даними. Ви також (в основному) відкладаєте руйнівні руйнівні дані, щоб вибрати обчислення посередницьких результатів: незмінність стає актуальною та сприяє безпечнішій програмі та одночасності створення програми. Слід зазначити також поняття функцій вищого порядку: функції, які приймають інші функції як параметри і, можливо, повертають нову функцію в результаті, і отримання кривих, що дозволяє частково оцінити функцію з і неповним набором параметрів, залишаючи вам нова функція, яка очікує лише відсутніх параметрів. Ці концепції піднімають повторне використання на абсолютно новий рівень.

Функціональне програмування в більшій мірі покладається на рекурсію (тобто функції, які викликають себе), ніж імперативне програмування, яке замість цього вдається до явних циклів. Розрахунок суми, еквівалентної фрагменту коду вище, показаний тут у функціональному псевдокоді. Хоча я визначав суму для цього прикладу, більшість функціональних мов мають готові інструменти для скорочення набору даних (див. Зменшення в Lisp або foldr в Haskell) або обходу. Зверніть увагу, як функцію можна по-різному визначати для різних шаблонів.

sum acum [] = acum - тривіальний випадок - (порожній список) sum acum [голова: відпочинок] = сума (acum + голова) відпочинок - рекурсія по - не порожній список хай y = сума 0 масив

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

сума (0, []). сума (Y, [H | T]): - сума (S, T), Y = H + S.

Мої роки логічного програмування значно відстають, але я вважаю, що цього псевдокоду достатньо, щоб натякнути на суть. Подібно до функціонального програмування, логічне програмування не відповідає управлінню ресурсами. Перший рядок встановлює аксіому: ми визначаємо, що підсумок порожнього списку визначено як нуль, оскільки немає термінів для накопичення; після присудка ви бачите лише термінатор правила (період у даному випадку), який вказує, що правило не залежить від інших умов дійсності. Наступний рядок показує нам правило, яке дійсно залежить від певних розділених комами клавішів "Ріг" (це позначення використовується в Prolog, де кома ефективно розглядається як форма логічних "і"): якщо перший елемент є H і сума решти елементів (T) дорівнює S, тоді H + S повинна бути дорівнює загальній Y.

Як було сказано раніше, кроки можна використовувати як для перевірки, так і для створення. Коли змінні типу Y або H не пов'язані зі значенням, час виконання намагається призначити їм значення, використовуючи будь-яке правило, з якого воно може неоднозначно визначити його. Він буде вивчати правила, встановлені вперед і назад, зупиняючись лише до тих пір, поки не знайдеться рішення або не буде вичерпано пошуковий простір. У наступному прикладі:

Вони є (Петро, ​​Іван). Вони є (Джон, Майк). онук (X, Y): - є (X, Y), є (Y, Z).

Після введення вищезазначених правил користувач Prolog може запитувати син (john, X) або онук (Y, mike), дозволяючи системі заповнювати значення для змінних X і Y (вони починаються з великих літер; все інше є постійною або ім'я правила), а також спробуйте перевірити, що онук (пітер, мій). Син запиту (Майк, Z) шукав би в усьому просторі правила сина будь-які збіги, але в кінцевому рахунку не вдасться. Ця функція пошуку та зворотного відстеження відрізняє логічне програмування від інших підходів, де дослідження наборів даних здебільшого явні.

Я сподіваюся, що це допомагає.


Відповідь 2:

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

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


Відповідь 3:

Імперативні мови програмування підтримують імперативні парадигми програмування (btw, їх є більше).

Логічні мови програмування підтримують парадигму логічного програмування (я знаю лише одну логічну парадигму програмування, хоча я не впевнений, чому сказати, що асистент перевірки не вважається іншою парадигмою логічного програмування).

Функціональні мови програмування підтримують функціональну парадигму програмування (їх також існує більше).

Більшість мов програмування мають функції, які сильно схиляються до певної парадигми, але деякі з них більш впевнені в порівнянні з іншими, і ви навіть можете змінитись у міру просування мови. Багато мов, спочатку розроблених для імперативної об'єктно-орієнтованої парадигми, застосовують все більше функцій, що підтримують функціональне програмування. Напевно, найбільша зміна в цьому напрямку відбулася в JavaScript, хоча в меншій мірі це робили C #, Java і навіть C ++.

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