Парадигма — это стиль написания исходного кода компьютерной программы. Существует несколько парадигм.
Императивное программирование (от англ. imperative — приказ) — это парадигма программирования, которая описывает процесс вычисления в виде инструкций, изменяющих состояние данных.
Программа — набор инструкций изменяющих состояние (данные). Мы говорим КАК выполнить задачу, описывает алгоритм, даем набор последовательных инструкций.
Для этой парадигмы характерно использование:
- именованных переменных;
- оператора присваивания;
- составных выражений;
- подпрограмм;
- циклов.
К подвидам императивного программирования относят Процедурное и Объектно-ориентированное программирование (ООП).
Декларативное программирование — это парадигма программирования, в которой задается спецификация решения задачи, то есть описывается, ЧТО представляет собой проблема и ожидаемый результат. Декларативные программы не используют состояния, то есть не содержат переменных и операторов присваивания. Программа — спецификация описывающая решение задачи.
К подвидам декларативного программирования относят Функциональное и Логическое программирование.
Функциональное программирование — программирование значениями (не используются присваивания). Предполагает обходиться вычислением результатов функций от исходных данных и результатов других функций, и не предполагает явного хранения состояния.
Для этой парадигмы характерно:
- функции первого класса (можно передавать как аргументы и возвращать из других функций);
- функции высшего порядка (принимают на вход другие функции);
- рекурсии;
- состояние никогда не меняется;
- не используется присваивание.
Функциональное программирование — это программирование значениями. Функциональный подход к программированию отличается от императивного отсутствием внутренних состояний. В функциональном программировании отсутствует присваивание как способ изменения значения.
Вы можете видеть в функциональных языках использование знака =, но в функциональных языках он оно называется “связывание“. Мы не изменяем никаких переменных, мы просто даем имя (алиас) какому-то выражению и потом обращаемся к этому выражению через это имя.
Основой для функционального программирования являются Лямбда-исчисления, многие функциональные языки можно рассматривать как «надстройку» над ними.
Лямбда-функции — это функции, у которой фактически нет имени. Лямда-выражения — анонимные функции. Понятие пришло из математики, где использовалась специальная форма записи функций, ликвидирующая неоднозначности функция/значение функции и пр.
Примеры языков
Императивные: Ruby, PHP, Python, C++, C#, Java, JavaScript, Swift и т.д.
Функциональные: Haksell, Erlang
Логические: Prolog
Мультипарадигменные: Clojure, Ocaml, Scale, F#
Функционально программировать можно практически в любом языке программирования.
Все функциональные языки имеют в своем арсенале инструменты для императивного программирования, потому что абсолютно декларативный язык не имел бы смысла (какой смысл от языка в котором вы не можете получившееся вычисление записать в файл/базу/отправить по сети/или вывести на экран).
Выводы
Еесли кратко: императивная — манипулирование состоянием; декларативная парадигма — отсутствие состояния.
В общем и целом, декларативное программирование идет от человека к машине, тогда как императивное — от машины к человеку.