Data flow programming languages must satisfy two criteria
Two general properties of language which make it possible to meet these criteria:
Determining how code fragments affect each other made much harder by reusing variable names and GOTO statements. Can make easier by having definite scope or received as arguments.
Necessary to make sure data dependencies are the same as sequencing of constraints. Much harder than locality. Most common form is modifying variables in the calling program. Avoid global variables and control variable scope. Pointers to complex data structures make this hard, but can use call by value or const.
Efficiency is still an open question. If everything is pass by value and no side-effects.