Парадигмы программирования
Всё о парадигмах программирования: особенности, механизмы, какие языки поддерживают и т.д.
Императивное программирование
Вычислительная техника создавалась для решения математических задач – расчета баллистических траекторий, численного решения уравнений и т.д. Для этого же предназначены первые языки программирования, такие как Fortran, Алгол, реализованные в парадигме императивного программирования.
Характеристики:
- в исходном коде программы записаны инструкции (команды);
- инструкции должны выполняться последовательно;
- данные, полученные при выполнении инструкции, могут записываться в память;
- данные, получаемые при выполнении предыдущих инструкций, могут читаться из памяти последующими инструкциями.
Основные механизмы управления:
- последовательное исполнение команд;
- использование именованных переменных;
- использование оператора присваивания;
- использование ветвления (оператор
if
); - использование безусловного перехода (оператор
goto
).
Ключевой идеей императивного программирования является работа с переменными, как с временным хранением данных в оперативной памяти.
Структурное программирование
Структурная парадигма программирования нацелена на сокращение времени разработки и упрощение поддержки программ за счёт использования блочных операторов и подпрограмм. Отличительная черта структурных программ – отказ от оператора безусловного перехода (goto
), который широко использовался в 1970-х годах.
Основные механизмы управления:
- последовательное исполнение команд;
- использование именованных переменных;
- использование оператора присваивания;
- использование ветвления (оператор if);
- использование циклов;
- использование подпрограмм (функций).
Объектно-ориентированное программирование
В объектно-ориентированной парадигме программа разбивается на объекты – структуры данных, состоящие из полей, описывающих состояние, и методов – функций, применяемых к объектам для изменения или запроса их состояния.
Объектно-ориентированную парадигму программирования поддерживают:
- Python;
- C#;
- Java;
- C++;
- JavaScript;
- и другие.
Основные механизмы управления:
- абстракция;
- класс;
- объект;
- полиморфизм;
- инкапсуляция;
- наследование.
Декларативное программирование
Декларативное программирование – парадигма программирования, в которой задаётся спецификация решения задачи, то есть описывается ожидаемый результат, а не способ его получения. Противоположностью декларативного является императивное программирование, при котором на том или ином уровне детализации требуется описание последовательности шагов для решения задачи. В качестве примеров декларативных языков обычно приводят HTML и SQL. При создании HTML с помощью тегов описывается, какую нужно получить страничку в браузере, а не то, как нарисовать на экране заголовок статьи, оглавление и текст.
К подвидам декларативного программирования также зачастую относят функциональное и логическое программирование. Несмотря на то, что программы на таких языках нередко содержат алгоритмические составляющие, архитектура в императивном понимании (как нечто отдельное от кодирования) в них также отсутствует: схема программы является непосредственно частью исполняемого кода.
Логическое программирование
При использовании логического программирования программа содержит описание проблемы в терминах фактов и логических формул, а решение проблемы система находит с помощью механизмов логического вывода.
В конце 60-х годов XX века Корделл Грин предложил использовать резолюцию как основу логического программирования. Алан Колмеро создал язык логического программирования Prolog в 1971 году. Логическое программирование пережило пик популярности в середине 80-х годов XX века, когда было положено в основу проекта разработки программного и аппаратного обеспечения вычислительных систем пятого поколения.
Важное его преимущество – достаточно высокий уровень машинной независимости, а также возможность откатов, возвращения к предыдущей подцели при отрицательном результате анализа одного из вариантов в процессе поиска решения.
Один из концептуальных недостатков логического подхода – специфичность класса решаемых задач.
Недостаток практического характера – сложность эффективной реализации для принятия решений в реальном времени, скажем, для систем жизнеобеспечения.
Функциональное программирование
Основной инструмент функционального программирования (ФП) – математические функции.
Математические функции выражают связь между исходными данными и итогом процесса. Процесс вычисления также имеет вход и выход, поэтому функция – вполне подходящее и адекватное средство описания вычислений. Именно этот простой принцип положен в основу функциональной парадигмы программирования.
Функциональная программа – набор определений функций. Функции определяются через другие функции или рекурсивно через самих себя. При выполнении программы функции получают аргументы, вычисляют и возвращают результат, при необходимости вычисляя значения других функций.
Основные идеи функционального программирования:
- неизменяемые переменные – в функциональном программировании можно определить переменную, но изменить ее значение нельзя;
- чистая функция – это функция, результат работы которой предсказуем. При вызове с одними и теми же аргументами, такая функция всегда вернет одно и то же значение. Про такие функции говорят, что они не вызывают побочных эффектов;
- функции высшего порядка – могут принимать другие функции в качестве аргумента или возвращать их;
- рекурсия – поддерживается многими языками программирования, а для функционального программирования обязательна. Дело в том, что в языках ФП отсутствуют циклы, поэтому для повторения операций служит рекурсия. Использование рекурсии в языках ФП оптимизировано, и происходит быстрее, чем в языках императивного программирования;
- лямбда-выражения – способ определения анонимных функциональных объектов.
Сильные стороны функционального программирования:
- повышенная надёжность кода;
- удобство организации модульного тестирования;
- возможности оптимизации при компиляции;
- возможности параллелизма.
Недостатки: отсутствие присваиваний и замена их на порождение новых данных приводят к необходимости постоянного выделения и автоматического освобождения памяти, поэтому в системе исполнения функциональной программы обязательным компонентом становится высокоэффективный сборщик мусора.
