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