In computer programming, dataflow programming is a programming paradigm that models a program as a directed graph of the data flowing between operations, thus implementing dataflow principles and architecture. Dataflow programming languages share some features of functional languages, and were generally developed in order to bring some functional concepts to a language more suitable for numeric processing. Some authors use the term Datastream instead of Dataflow to avoid confusion with Dataflow Computing or Dataflow architecture, based on an indeterministic machine paradigm.
Properties of dataflow programming languages
Traditionally, a program is modeled as a series of operations happening in a specific order; this may be referred to as sequential:p.3, procedural, Control flow (indicating that the program chooses a specific path), or imperative programming. The program focuses on commands, in line with the von Neumann:p.3 vision of sequential programming, where data is normally "at rest":p.7
In contrast, dataflow programming emphasizes the movement of data and models programs as a series of connections. Explicitly defined inputs and outputs connect operations, which function like black boxes:p.2. An operation runs as soon as all of its inputs become valid. Thus, dataflow languages are inherently parallel and can work well in large, decentralized systems.:p.3 
One of the key concepts in computer programming is the idea of state, essentially a snapshot of various conditions in the system. Most programming languages require a considerable amount of state information, which is generally hidden from the programmer. Often, the computer itself has no idea which piece of information encodes the enduring state. This is a serious problem, as the state information needs to be shared across multiple processors in parallel processing machines. Most languages force the programmer to add extra code to indicate which data and parts of the code are important to the state. This code tends to be both expensive in terms of performance, as well as difficult to read or debug. Explicit parallelism is one of the main reasons for the poor performance of Enterprise Java Beans when building data-intensive, non-OLTP applications.
Where a linear program can be imagined as a single worker moving between tasks (operations), a dataflow program is more like a series of workers on an assembly line, each doing a specific task whenever materials are available. Since the operations are only concerned with the availability of data inputs, they have no hidden state to track, and are all "ready" at the same time.
Dataflow programs are represented in different ways. A traditional program is usually represented as a series of text instructions, which is reasonable for describing a serial system which pipes data between small, single-purpose tools that receive, process, and return. Dataflow programs start with an input, perhaps the command line parameters, and illustrate how that data is used and modified. The flow of data is explicit, often visually illustrated as a line or pipe.
In terms of encoding, a dataflow program might be implemented as a hash table, with uniquely identified inputs as the keys, used to look up pointers to the instructions. When any operation completes, the program scans down the list of operations until it finds the first operation where all inputs are currently valid, and runs it. When that operation finishes, it will typically output data, thereby making another operation become valid.
For parallel operation, only the list needs to be shared; it is the state of the entire program. Thus the task of maintaining state is removed from the programmer and given to the language's runtime. On machines with a single processor core where an implementation designed for parallel operation would simply introduce overhead, this overhead can be removed completely by using a different runtime.
A pioneer dataflow language was BLODI (BLOck DIagram), developed by John Larry Kelly, Jr., Carol Lochbaum and Victor A. Vyssotsky for specifying sampled data systems. A BLODI specification of functional units (amplifiers, adders, delay lines, etc.) and their interconnections was compiled into a single loop that updated the entire system for one clock tick.
More conventional dataflow languages were originally developed in order to make parallel programming easier. In Bert Sutherland's 1966 Ph.D. thesis, The On-line Graphical Specification of Computer Procedures, Sutherland created one of the first graphical dataflow programming frameworks. Subsequent dataflow languages were often developed at the large supercomputer labs. One of the most popular was SISAL, developed at Lawrence Livermore National Laboratory. SISAL looks like most statement-driven languages, but variables should be assigned once. This allows the compiler to easily identify the inputs and outputs. A number of offshoots of SISAL have been developed, including SAC, Single Assignment C, which tries to remain as close to the popular C programming language as possible.
A more radical concept is Prograph, in which programs are constructed as graphs onscreen, and variables are replaced entirely with lines linking inputs to outputs. Incidentally, Prograph was originally written on the Macintosh, which remained single-processor until the introduction of the DayStar Genesis MP in 1996.
There are many hardware architectures oriented toward the efficient implementation of dataflow programming models. MIT's tagged token dataflow architecture was designed by Greg Papadopoulos.
Data flow has been proposed as an abstraction for specifying the global behavior of distributed system components: in the live distributed objects programming model, distributed data flows are used to store and communicate state, and as such, they play the role analogous to variables, fields, and parameters in Java-like programming languages.
The most popular dataflow languages include National Instruments' LabVIEW. It was originally intended to make linking data between lab equipment easy for non-programmers, but has since become more general-purpose. Another is VEE, optimized for use with data acquisition devices like digital voltmeters and oscilloscopes, and with source devices like arbitrary waveform generators and power supplies.
- Agilent VEE
- AviSynth scripting language, for video processing
- BMDFM Binary Modular Dataflow Machine
- Cassandra-vision - A Visual programming language with OpenCV support and C++ extension API
- Hartmann pipelines
- LabVIEW, G
- MaxCompiler - Designed by Maxeler Technologies and is compatible with OpenSPL
- Microsoft Visual Programming Language - A component of Microsoft Robotics Studio designed for Robotics programming
- OpenWire - adds visual dataflow programming capabilities to Delphi via VCL or FireMonkey components and a graphical editor (homonymous binary protocol is unrelated)
- OpenWire Studio - A visual development environment which allows the development of software prototypes by non developers.
- Oz now also distributed since 1.4.0
- Pipeline Pilot
- Pure Data
- Quartz Composer - Designed by Apple; used for graphic animations and effects
- SAC Single Assignment C
- Scala (with a library SynapseGrid)
- SIGNAL (a dataflow-oriented synchronous language enabling multi-clock specifications)
- System Verilog
- Tersus - Visual progamming platform (open source)
- Vignette's VBIS language for business processes integration
- Widget Workshop, a "game" designed for children which is technically a simplified dataflow programming language.
- XEE (Starlight) XML Engineering Environment
Application programming interfaces
- DC: Library that allows the embedding of one-way dataflow constraints in a C/C++ program.
- SystemC: Library for C++, mainly aimed at hardware design.
- Actor model
- Data-driven programming
- Digital signal processing
- Event-driven programming
- Flow-based programming
- Functional reactive programming
- Glossary of reconfigurable computing
- High-performance reconfigurable computing
- Incremental computing
- Partitioned global address space
- Signal programming
- Stream processing
- Yahoo Pipes
- Johnston, Wesley M.; J.R. Paul Hanna, Richard J. Millar (March 2004). "Advances in Dataﬂow Programming Languages". ACM Computing Surveys 36: 1–34. Retrieved 15 August 2013.
- Wadge, William W.; Edward A. Ashcroft (1985). Lucid, the Dataflow Programming Langugage (illustrated ed.). Academia Press. ISBN 9780127296500. Retrieved 15 August 2013.
- "Dataflow Programming Basics". Getting Started with NI Products. National Instruments Corporation. Retrieved 15 August 2013.
- Harter, Richard. "Data Flow languages and programming - Part I". Richard Harter's World. Retrieved 15 August 2013.
- "Why Dataflow Programming Languages are Ideal for Programming Parallel Hardware". Multicore Programming Fundamentals Whitepaper Series. National Instruments Corporation. Retrieved 15 August 2013.
- John L. Kelly Jr., Carol Lochbaum, V. A. Vyssotsky (1961). "A block diagram compiler". Bell System Tech. J. 40: 669–678.
- W.R. Sutherland (1966). The On-line Graphical Specification of Computer Procedures. MIT.
- Basics of Dataflow Programming in F# and C#
- Dataflow Programming - Concept, Languages and Applications
- Static Scheduling of Synchronous Data Flow Programs for Digital Signal Processing
- Handling huge loads without adding complexity The basic concepts of dataflow programming, Dr. Dobb's, Sept. 2011