AndreyMelnikov.MyBlog # мой блог: IT-марафон.

Все мои посты

Функциональное программирование. Другой взгляд на мир.

В своей сегодняшней статье, я хотел бы немного затронуть теорию программирования, а именно, поговорить о функциональном программировании. Дело в том, что рано или поздно человек, изучающий программирование, выходит за рамки всем привычной классической императивной модели, чтобы узнать больше, и взглянуть на процесс составления кода с другой стороны. Настало время и мне заглянуть за «забор» привычного и родного «двора», в котором уже многое знакомо, в котором я вырос.

На сегодняшний день во вселенной программирования существует несколько основных парадигм, т.е. совокупностей идей и понятий, определяющих стиль написания компьютерных программ. Есть много мнений по поводу классификации всех существующих методологий и парадигм. Я не стану ни с кем спорить, а просто выражу свое мнение. На мой взгляд, делать основное разделение стоит на Декларативное и Императивное программирование.

Для привычного многим императивного стиля понимания и написания кода, которому учат в школах и университетах в рамках общеобразовательных программ, и к которому большинство из нас так привыкло, свойственно последовательное выполнение команд. Т.е. компьютеру передается совокупность последовательных инструкций, выполнение которых неразрывно связано с изменением состояния этой программы. Вот почему в императивных языках обязательно присутствует понятие «переменная». А раз есть переменные — должен быть и оператор присваивания. Переменные используются как ячейки для хранения данных, которые по ходу программы могут быть переопределены, а данные перезаписаны.

Однако существует принципиально иной подход к разработке, а именно декларативное программирование. Данное направление также включает в себя несколько парадигм, одной из которых является функциональная парадигма. При этом подходе программа воспринимается уже не как набор инструкций, а как набор выражений. А поскольку выражения вычисляются путём применения функций к аргументам (то есть, по сути, к другим выражениям), там нет места ни переменным, ни оператору присваивания. Каждая функция в конечном итоге представляет собой выражение, вычисляемое посредством применения каких-то других функций к каким-то другим аргументам, тогда нам просто не нужно ничего присваивать.
Действительно, с функциональным программированием все иначе, нежели с императивным. Тут совсем другая философия, которая ближе к классической математике. Как я уже отметил, основным инструментом является функция. Функция может сделать только одно - рассчитать что-то и вернуть как результат. Данное свойство еще называют ссылочной прозрачностью или «чистой» функцией. Чистой называется такая функция, которая предельно прозрачна: её выходное значение определяется только её аргументами и более ничем. Именно поэтому чистая функция предельно надёжна, ведь она не может преподнести нам никаких сюрпризов. Это и есть функция в математическом смысле.

Если немного окунуться в историю, то функциональное программирование берет начало из формальной системы лямбда исчислений, которую разработал Алонзо Чёрч. Лямбда исчисления - это своего рода работа с абстрактными математическими головоломками, для изучения общих понятий вычислений, если сказать совсем кратко и не вдаваясь в академическое определение. В 1958 году появился язык обработки списков, List Processing language (Lisp). Lisp задумывался как имплементация Лямбда-исчисления Алонзо. В 1973 году группа программистов в лаборатории искусственного интеллекта в Массачусетском технологическом институте разработали железо, которое они назвали Lisp-машиной. Это была аппаратная реализация лямбда-исчислений Алонзо.

Функциональное программирование это не только теория программирования или computer since, данный подход используется и в продакшене. Например, Haskell — чистый функциональный язык с ленивой моделью вычислений и статической типизацией. Благодаря одному из свойств «чистых» функций, на Haskell можно спокойно писать коммерческий софт.
Вот для примера список компаний использующий Haskell в продакшене.
Вот как Facebook борется со спамом с помощью Хаскеля.

В следующих статьях я планирую более подробно поговорить, о том, что нового я узнал при изучении функционального программирования на примере LISP и его онлайн интерпетатора Scheme https://repl.it/languages/Scheme.

Для данной статьи были использованы материалы из следующих источников:

https://www.ohaskell.guide/immutability-n-purity.html

Книга Миран Липовача. Изучай Haskell во имя добра!

Назад к списку постов