Реактивное программирование
Реактивное программирование — парадигма программирования, ориентированная на потоки данных и распространение изменений. Это означает, что должна существовать возможность легко выражать статические и динамические потоки данных, а также то, что нижележащая модель исполнения должна автоматически распространять изменения благодаря потоку данных.
К примеру, в императивном программировании присваивание a = b + c
будет означать, что переменной a
будет присвоен результат выполнения операции b + c
, используя текущие (на момент вычисления) значения переменных. Позже значения переменных b
и c
могут быть изменены без какого-либо влияния на значение переменной a
.
В реактивном же программировании значение a
будет автоматически пересчитано, основываясь на новых значениях.
Современные табличные процессоры представляют собой пример реактивного программирования. Ячейки таблицы могут содержать строковые значения или формулу вида «=B1+C1», значение которой будет вычислено исходя из значений соответствующих ячеек. Когда значение одной из зависимых ячеек будет изменено, значение этой ячейки будет автоматически обновлено.
Другой пример — это языки описания аппаратуры (HDL), такие как Verilog. Реактивное программирование позволяет моделировать изменения в виде их распространения внутри модели.
Реактивное программирование предлагалось как путь для лёгкого создания пользовательских интерфейсов, анимации или моделирования систем, изменяющихся во времени.
К примеру, в MVC архитектуре с помощью реактивного программирования можно реализовать автоматическое отражение изменений из Model в View и наоборот из View в Model.
Реактивные подходы к программированию
Императивное реактивное программирование
Можно соединить парадигмы реактивного и императивного программирования. В такой связке императивные программы могли бы работать над реактивными структурами данных.
Объектно-ориентированное реактивное программирование
Объектно-ориентированное реактивное программирование (ООРП) — это комбинация объектно-ориентированного подхода с реактивным. Вероятно, наиболее естественный способ сделать это состоит в том, что вместо методов и полей у объектов есть реакции, которые автоматически пересчитывают значения, и другие реакции зависят от изменений этих значений.
Функциональное реактивное программирование
Функциональное программирование является наиболее естественным базисом для реализации реактивной архитектуры, хорошо сочетаясь с параллелизмом.
Функциональное реактивное программирование (ФРП) сформировалось в 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 — событийно-реактивный язык для программирования веб-приложений
- ReactiveX — мультиплатформенная реализация реактивного программирования для Java, JS, C#, Scala, Clojure, Swift и др.
- Reactive.jl — FRP-реализация для Julia
- ObservableComputations — мультиплатформенная реализация для .NET
Ссылки
- Functional Reactive Animation
- Mun Hon Cheong. Functional Programming and 3D Games. — The University of New South Wales, 2005.
- Paul Hudak. Modular Domain Specific Languages and Tools. — IEEE Computer Society Press, Department of Computer Science, Yale University, 1998. Архивировано 17 октября 2013 года.