Хорошо, из базовых знаний и чтения страницы Википедии, на которую вы указали, кажется, что реактивное программирование - это что-то вроде вычисления потока данных, но с определенными внешними «стимулами», запускающими набор узлов для выполнения и выполнения их вычислений.
Это довольно хорошо подходит для дизайна пользовательского интерфейса, например, когда при касании элемента управления пользовательского интерфейса (скажем, элемента управления громкостью в приложении для воспроизведения музыки) может потребоваться обновить различные элементы отображения и фактическую громкость звука. Когда вы изменяете объем (скажем, слайдер), который соответствует изменению значения, связанного с узлом в ориентированном графе.
Различные узлы, имеющие ребра от этого узла «значение объема», будут автоматически запускаться, и любые необходимые вычисления и обновления будут естественным образом распространяться через приложение. Приложение «реагирует» на пользовательский стимул. Функционально-реактивное программирование было бы просто реализацией этой идеи на функциональном языке или вообще в рамках парадигмы функционального программирования.
Для получения дополнительной информации о «вычислениях потока данных», найдите эти два слова в Википедии или используя вашу любимую поисковую систему. Общая идея такова: программа представляет собой ориентированный граф узлов, каждый из которых выполняет простое вычисление. Эти узлы связаны друг с другом графическими ссылками, которые обеспечивают выходы некоторых узлов на входы других.
Когда узел запускает или выполняет свои вычисления, узлы, подключенные к его выходам, имеют свои соответствующие входы «сработали» или «помечены». Любой узел, имеющий все входы, сработавшие / помеченные / доступные, автоматически срабатывает. График может быть неявным или явным в зависимости от того, как именно реализовано реактивное программирование.
Узлы можно рассматривать как стреляющие параллельно, но часто они выполняются последовательно или с ограниченным параллелизмом (например, их может выполнять несколько потоков). Известным примером была машина потока данных Манчестера , которая (IIRC) использовала архитектуру тегированных данных для планирования выполнения узлов в графе через один или несколько исполнительных блоков. Вычисления потока данных довольно хорошо подходят для ситуаций, в которых запуск вычислений, асинхронно приводящий к каскадам вычислений, работает лучше, чем попытка заставить выполнение управляться часами (или часами).
Реактивное программирование импортирует эту идею «каскада выполнения» и, похоже, думает о программе в виде потока данных, но при условии, что некоторые узлы подключены к «внешнему миру», и каскады выполнения запускаются, когда эти сенсорные -подобные узлы меняются. Выполнение программы тогда будет выглядеть как нечто похожее на сложную рефлекторную дугу. Программа может или не может быть в основном сидячей между стимулами или может установиться в практически сидячем состоянии между стимулами.
«нереактивное» программирование - это программирование с совершенно другим представлением о потоке выполнения и взаимосвязи с внешними входами. Вероятно, это будет несколько субъективно, поскольку люди, скорее всего, будут испытывать искушение сказать что-либо, что реагирует на внешние воздействия, «реагирует» на них. Но если посмотреть на суть дела, программа, которая опрашивает очередь событий с фиксированным интервалом и отправляет любые события, найденные функциям (или потокам), менее реактивна (потому что она обслуживает только ввод данных пользователем с фиксированным интервалом). Опять же, в этом заключается суть: можно представить реализацию опроса с быстрым интервалом опроса в системе на очень низком уровне и программировать реагирующим образом поверх нее.