Реактивное программирование

Материал из DZWIKI
Перейти к навигации Перейти к поиску
Парадигмы программирования

Рефлексивность
Гомоиконность

Реактивное программирование — парадигма программирования, ориентированная на потоки данных и распространение изменений. Это означает, что должна существовать возможность легко выражать статические и динамические потоки данных, а также то, что нижележащая модель исполнения должна автоматически распространять изменения благодаря потоку данных.

К примеру, в императивном программировании присваивание a = b + c будет означать, что переменной a будет присвоен результат выполнения операции b + c, используя текущие (на момент вычисления) значения переменных. Позже значения переменных b и c могут быть изменены без какого-либо влияния на значение переменной a.

В реактивном же программировании значение a будет автоматически пересчитано, основываясь на новых значениях.

Современные табличные процессоры представляют собой пример реактивного программирования. Ячейки таблицы могут содержать строковые значения или формулу вида «=B1+C1», значение которой будет вычислено исходя из значений соответствующих ячеек. Когда значение одной из зависимых ячеек будет изменено, значение этой ячейки будет автоматически обновлено.

Другой пример — это языки описания аппаратуры (HDL), такие как Verilog. Реактивное программирование позволяет моделировать изменения в виде их распространения внутри модели.

Реактивное программирование предлагалось как путь для лёгкого создания пользовательских интерфейсов, анимации или моделирования систем, изменяющихся во времени.

К примеру, в MVC архитектуре с помощью реактивного программирования можно реализовать автоматическое отражение изменений из Model в View и наоборот из View в Model.

Концепции

Реактивное программирование — это программирование с асинхронными потоками(streams) данных (парадигма программирования, ориентированная на потоки данных и распространение изменений).

Реактивная архитектура позволяет программистам создавать событийно-ориентированные, масштабируемые, отказоустойчивые и отзывчивые приложения — приложения, работающие в реальном времени и обеспечивающие хорошее время реакции, основанные на масштабируемом и отказоустойчивом стеке и которые легко развернуть на многоядерных и облачных архитектурах. Эти особенности критически важны для реактивности.

The Reactive Manifesto

Message Driven (Ориентированность на события)

В событийно-ориентированном приложении компоненты взаимодействуют друг с другом путём отправки и получения сообщений — дискретных частей информации, описывающих факты. Эти сообщения отправляются и принимаются в асинхронном и неблокирующем режиме.

Приложения, использующие асинхронную модель, намного лучше обеспечивают слабую связанность, чем приложения, базирующиеся на чисто синхронных вызовах. Отправитель и получатель могут быть реализованы, не оглядываясь на детали того, как события распространяются в системе.

Событийно-ориентированные системы более склонны к push-модели, нежели чем к pull или poll. Т.е. они проталкивают данные к своим потребителям, когда данные становятся доступными, вместо того чтобы впустую тратить ресурсы, постоянно запрашивая или ожидая данные.

Elastic (Масштабируемость)

The system stays responsive under varying workload (при изменяющейся нагрузке).

Событийно-ориентированная система, базирующаяся на асинхронной передаче сообщений, является основой масштабируемости. Слабая связанность и локационная независимость компонентов и подсистем позволяют разворачивать систему на множестве узлов, оставаясь в пределах той же самой программной модели с той же семантикой. При добавлении новых узлов возрастает пропускная способность системы.

Resilient (Отказоустойчивость)

The system stays responsive in the face of failure.

Событийно-ориентированная модель, которая даёт масштабируемость, также предоставляет необходимые примитивы для решения проблемы отказоустойчивости. Слабая связанность в событийно-ориентированной модели снабжает нас полностью изолированными компонентами, в которых сбои инкапсулируются в сообщения вместе с необходимыми деталями и пересылаются другим компонентам, которые в свою очередь анализируют ошибки и решают, как реагировать на них.

Responsive (Отзывчивость)

The system responds in a timely manner if at all possible (приложения реального времени). Отзывчивый определяется словарём Merriam-Webster как «отвечающий быстро или реагирующий надлежащим образом».

Наблюдаемые модели позволяют другим системам получать события, когда их состояние изменяется. Это обеспечивает связь в реальном времени между пользователями и системами.

Потоки событий образуют базовую абстракцию, на которой строятся такие связи. Сохраняя их реактивными, мы избегаем блокировок и позволяем преобразованиям и коммуникациям быть асинхронными и неблокирующими.

Реактивные подходы к программированию

Императивное реактивное программирование

Можно соединить парадигмы реактивного и императивного программирования. В такой связке императивные программы могли бы работать над реактивными структурами данных.

Объектно-ориентированное реактивное программирование

Объектно-ориентированное реактивное программирование (ООРП) — это комбинация объектно-ориентированного подхода с реактивным. Вероятно, наиболее естественный способ сделать это состоит в том, что вместо методов и полей у объектов есть реакции, которые автоматически пересчитывают значения, и другие реакции зависят от изменений этих значений.

Функциональное реактивное программирование

Шаблон:Falseredirect Функциональное программирование является наиболее естественным базисом для реализации реактивной архитектуры, хорошо сочетаясь с параллелизмом.

Функциональное реактивное программирование (ФРП) сформировалось в 1997 году, с предложением языка Fran[1]. Позже были разработаны такие языки как Fruit, FRP и RT-FRP, FAL, Frob, Fvision, Yampa[2].

Простейшее функциональное реактивное выражение имеет следующую форму[3]:

b1 `until` e => b2

что буквально означает «вести себя как b1 до возникновения события e, после этого вести себя как b2».

Реализации

  • Elm — функциональный реактивный язык программирования, компилирующийся в HTML, CSS и JavaScript
  • Flapjax[en] — событийно-реактивный язык для программирования веб-приложений
  • ReactiveX — мультиплатформенная реализация реактивного программирования для Java, JS, C#, Scala, Clojure, Swift и др.
  • Reactive.jl — FRP-реализация для Julia
  • ObservableComputations — мультиплатформенная реализация для .NET

Примечания

  1. Functional Reactive Animation. Дата обращения: 8 сентября 2015. Архивировано 11 ноября 2020 года.
  2. Mun Hon Cheong. Functional Programming and 3D Games. — The University of New South Wales, 2005.
  3. Paul Hudak. Modular Domain Specific Languages and Tools. — IEEE Computer Society Press, Department of Computer Science, Yale University, 1998. Архивировано 17 октября 2013 года.

Ссылки