La programmazione del flusso di dati è un modello utilizzato durante la concettualizzazione e l’implementazione del software. L’obiettivo della programmazione del flusso di dati è centrare la progettazione di un sistema sui dati che vengono elaborati rispetto al codice utilizzato per manipolare le informazioni. Il risultato è un sistema in cui le funzioni computazionali di base sono isolate in piccoli moduli noti come nodi; questi accettano alcuni dati quando viene raggiunto un certo stato, elaborano i dati e respingono l’output nel flusso di controllo del programma, passando potenzialmente le informazioni a un altro nodo. Questo è in contrasto con il normale paradigma della programmazione imperativa, in cui un elenco immediato di comandi definisce il flusso di controllo di un programma, non lo stato dei dati. Esistono diversi usi per i programmi basati su un flusso di dati, tra cui l’elaborazione parallela, i sistemi in tempo reale e i sistemi embedded.
Nella programmazione implicita, che è il tipo più comunemente usato di linguaggio di programmazione per computer, i programmi sono spesso costruiti da diagrammi di flusso che contengono una sequenza di chiamate di funzioni o metodi, con ogni chiamata che si dirama ad altre funzioni. Questo tipo di programmazione si concentra intrinsecamente sulle procedure utilizzate per manipolare i dati del programma. Quando viene utilizzata la programmazione del flusso di dati, l’attenzione viene rimossa dalle chiamate di funzione esplicite e si concentra invece sulla creazione di moduli astratti che accettano dati quando i dati o il programma hanno soddisfatto o raggiunto determinate condizioni. A questo punto, invece di chiamare una funzione, la progettazione del programma fa sì che i dati fluiscano verso i moduli, o nodi, dove entrano potenzialmente in un flusso per l’elaborazione da parte di più nodi.
Un esempio astratto di come funziona la programmazione del flusso di dati può essere visto quando si considera come riempire un bicchiere con l’acqua di un rubinetto. Un approccio imperativo sarebbe quello di generare funzioni per accendere l’acqua, spostare il bicchiere nel punto appropriato sotto il rubinetto e quindi riempire il bicchiere d’acqua. Attraverso un esempio di programmazione dataflow, il rubinetto attende invece che la tazza sia stata posizionata sotto di esso per iniziare a riempirla, e qualunque cosa stia muovendo la tazza aspetta che la tazza abbia raggiunto un certo stato, ad esempio pieno, per rimuoverla da sotto il rubinetto . Gli effettivi meccanismi di programmazione che modificano lo stato dei dati non sono l’interesse immediato del progetto.
Il vantaggio della programmazione del flusso di dati è un’applicazione o un sistema in cui i diversi nodi possono essere manovrati per creare flussi di dati completamente unici senza richiedere necessariamente che la relazione sia codificata. Inoltre, un programma che utilizza la programmazione del flusso di dati è preparato attivamente per elaborare i dati in ogni momento, invece di entrare esplicitamente in uno stato o un modello che blocca l’accesso o l’esecuzione da parte di uno o più nodi. Il design e il concetto dei nodi significano che le applicazioni di programmazione del flusso di dati possono essere facilmente progettate per l’uso su sistemi distribuiti e processori paralleli.