Reactive programming

Reactive programming

Reactive programming is a programming paradigm oriented around data flows and the propagation of change. This means that it should be possible to express static or dynamic data flows with ease in the programming languages used, and that the underlying execution model will automatically propagate changes through the data flow.

For example, in an imperative programming setting, a := b + c would mean that a is being assigned the result of b + c in the instant the expression is evaluated. In reactive programming it could instead mean that we set up a dynamic data-flow from b and c to a. whenever the value of c or b is changed, then a is automatically updated.

Reactive programming has foremost been proposed as a way to simplify the creation of interactive user interfaces, animations or in real time systems, but is essentially a general programming paradigm.

Concepts

Degrees of explicitness

Reactive programming languages can range from very explicit ones where data flows are set up by using arrows, to implicit where the data flows are derived from language constructs that looks similar to those of imperative or functional programming. For example, in implicitly lifted FRP a function call might implicitly cause a node in a data flow graph to be constructed. Reactive programming libraries for dynamic languages (such as the Lisp "Cells" and Python "Trellis" libraries) can construct a dependency graph from runtime analysis of the values read during a function's execution, allowing data flow specifications to be both implicit and dynamic.

Sometimes the term reactive programming refers to the architectural level of software engineering, where individual nodes in the data flow graph are ordinary programs that communicate with each other.

Higher order reactive programming

Reactive programming can be purely static where the data flows are set-up statically, or be dynamic where the data flows can change during the execution of a program.

The use of data switches in the data flow graph could to some extent make a static data flow graph appear as dynamic, and blur the distinction slightly. True dynamic reactive programming however could use imperative programming to reconstruct the data flow graph. Also, reactive programming could be said to be of higher order, if it supports the idea that data flows could be used to construct other data flows. That is, the resulting value out of a data flow is another data flow graph that is executed using the same evaluation model as the first.

Data flow differentiation

Ideally all data changes are propagated instantly, but this cannot be assured in practice. Instead it might be necessary to give different parts of the data flow graph different evaluation priorities. This can be called differentiated reactive programming.

For example, in a word processor the marking of spelling errors need not be totally in sync with the inserting of characters. Here differentiated reactive programming could potentially be used to give the spell checker lower priority, allowing it to be delayed while keeping other data-flows instantaneous.

However, such differentiation introduces additional design complexity. For example, deciding how to define the different data flow areas, and how to handle event passing between different data flow areas.

Evaluation models of RP

Evaluation of reactive programs is not necessarily based on how stack based programming languages are evaluated. Instead, when some data is changed, the change is propagated to all data that is derived partially or completely from the data that was changed. This change propagation could be achieved in a number of ways, where perhaps the most natural way is an invalidate/lazy-revalidate scheme.

One reason it could be problematic to just naively propagate a changes using a stack, is because of potential exponential update complexity if the data structure has a certain shape. One such shape can be described as "repeated diamonds shape", and has the following structure:An->Bn->An+1, An->Cn->An+1, where n=1,2... This problem could be overcome by propagating invalidation only when some data is not already invalidated, and later re-validate the data when needed using lazy evaluation.

One inherent problem for RP is that most computations that would be evaluated and forgotten in a normal programming language, needs to be represented in the memory as data-structures.fact|date=June 2008 This could potentially make RP highly memory consuming. However, research on what is called lowering, could potentially overcome this problem. [http://portal.acm.org/citation.cfm?id=1244381.1244393]

On the other side, RP is a form of what could be described as "explicit parallelism", and could therefore be beneficial for utilizing the power of parallel hardware.

Similarities with Observer pattern

Reactive programming has principal similarities with the Observer pattern commonly used in OOP. However, integrating the data flow concepts into the programming language would make it easier to express them, and could therefore increase the granularity of the data flow graph. For example, the observer pattern commonly describes data-flows between whole objects/classes, whereas OORP could target the members of objects/classes.

The stack based evaluation model of common object orientation is also not entirely suitable for data flow propagation, as occurrences of the "repeated diamond shape" in the data structures could make the program face exponential complexities. But because of its relatively limited use, and low granularity, this is rarely a problem for the observer pattern in practice.

Reactive Programming Approaches

Reactive Imperative Programming

It is possible to fuse reactive programming with ordinary imperative programming. In such a paradigm, there would be imperative programs operating upon reactive data structures. Such a set-up is analogous to constraint imperative programming, but where constraint imperative programming manages bi-directional constraints, reactive imperative programming just manages a-cyclic data-flows. Reactive imperative programming could be seen as the smaller brother of constraint imperative programming.

Object Oriented Reactive Programming (OORP)

OORP is a combination of object oriented programming and reactive programming. Perhaps the most natural way to make such a combination is as follows: Instead of methods and fields, objects have "reactions" that automatically re-evaluate when the other reactions they depend on have been modified.

If an OORP programming language maintains its imperative methods, it would also fall under the category of imperative reactive programming.

Functional Reactive Programming

Functional reactive programming (FRP) is reactive programming in the settings of functional programming languages.

External links

* [http://www-sop.inria.fr/mimosa/rp/generalPresentation/index.html MIMOSA Project of INRIA - ENSMP] , a general site about Reactive Programming.
* [http://www.cs.nott.ac.uk/~nhn/FoPAD2007/Talks/nhn-FoPAD2007.pdf Yampa] , an attempt at functional reactive programming.
* [http://code.enthought.com/projects/traits/ Traits] A Python module that supports basic reactive programming using explicitly-registered dependency notifications
* [http://bc.tech.coop/blog/030911.html Experimenting with Cells] Demonstration of a simple reactive programming application in Lisp, using the Cells library
* [http://common-lisp.net/project/cells/ Cells] A dataflow extension for Common Lisp that supports higher-order reactive programming (including imperative and OO RP) using automatically-determined dependencies
* [http://pypi.python.org/pypi/Trellis Trellis] A Python package that supports higher-order reactive programming (including imperative and OO RP in a software transactional memory) using automatically-determined dependencies
* [http://homepage.mac.com/jeanferdinandsusini/SugarCubes.html SugarCubes] A set of classes for reactive programming in Java


Wikimedia Foundation. 2010.

Игры ⚽ Нужно решить контрольную?

Look at other dictionaries:

  • Functional reactive programming — ( FRP for short) is a programming paradigm for reactive programming using the building blocks of functional programming [cite web|author=Henrik Nilsson|title=Functional Reactive Programming Research|url=http://www.haskell.org/frp/|accessdate=2006 …   Wikipedia

  • Programming paradigm — Programming paradigms Agent oriented Automata based Component based Flow based Pipelined Concatenative Concu …   Wikipedia

  • Programming in the large and programming in the small — Programming paradigms Agent oriented Automata based Component based Flow based Pipelined Concatenative Concurrent computin …   Wikipedia

  • Dataflow programming — Programming paradigms Agent oriented Automata based Component based Flow based Pipelined Concatenative Concurrent computing …   Wikipedia

  • Synchronous programming language — A synchronous programming language is a computer programming language optimized for programming reactive systems, systems that are often interrupted and must respond quickly. Many such systems are also called realtime systems, and are found often …   Wikipedia

  • Subtext (programming language) — Schematic tables. An alpha build of the Subtext environment, which illustrates the unique polymorphic conditionals present in the IDE. Subtext is a moderately visual programming language and environment, for writing application software. It is an …   Wikipedia

  • Racket (programming language) — Racket Paradigm(s) Multi paradigm: Functional, Procedural, Modular, Object oriented, Reflective, Meta Appeared in 1994 Developer …   Wikipedia

  • Arrows in functional programming — In computer science, arrows provide a more general interface to computation than monads. Monads essentially provide a sequential interface to computation: one can build a computation out of a value, or sequence two computations together. Arrows… …   Wikipedia

  • Object-oriented programming — Programming paradigms Agent oriented Automata based Component based Flow based Pipelined Concatenative Concurrent computing …   Wikipedia

  • List of programming languages by category — Programming language lists Alphabetical Categorical Chronological Generational This is a list of programming languages grouped by category. Some languages are listed in multiple categories. Contents …   Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”