数据流编程语言

88

什么是数据流编程语言?为什么要使用它?它有哪些好处?


1
谢谢,我刚学到了新东西。 - JoshBerke
数据流程序可以在空间中执行(想象工厂线),而标准的控制流程序则是按时间执行的。请参见http://www.openspl.org/what-is-openspl/获取更多信息。 - Nemanja Trifunovic
10个回答

114
在控制流语言中,你拥有一系列操作外部数据的指令流。条件执行、跳转和过程调用会改变要执行的指令流。这可以看作是指令通过数据流动(例如,指令操作加载了数据的寄存器 - 除非指令流将其移动,否则数据是静态的)。控制流的“if”语句跳转到指令流中的正确分支,但数据不会被移动。
在数据流语言中,你拥有一系列数据流,这些数据从一个指令传递到另一个指令进行处理。条件执行、跳转和过程调用会将数据路由到不同的指令。这可以看作是数据流经过静态指令,就像电信号流经电路或水流经管道一样。数据流的“if”语句会将数据路由到正确的分支。
一些数据流特性和语言的例子:

文本语言

可视化语言

嵌入了可视化数据流语言的产品:


添加到不太为人知的列表中: - Beef
另一个被称为expecco,带有GUI(可在Google上下载演示版)。 - blabla999
大多数未列出的编程语言,如C ++、Java、Python、COBOL以及几乎所有其他命令式语言,大多数面向对象语言,大多数函数式语言,像Prolog这样的逻辑编程语言等等。 - user21037
3
为什么没有人把Unix管道作为数据流编程的常见例子呢?即使维基百科也没有提到。这是因为有什么不合格的地方吗? - Sridhar Sarnobat
@masterxilo 我认为其中一个重要原因是,通过静态指令很容易将数据流可视化,因此这种编程范式(或其众多变体之一:数据流实际上是一个非常宽泛的术语,涵盖了许多不同的风格)非常适合于视觉表达,因此通常以这种方式呈现。我个人对既有文本又有可互换视觉表示的语言很感兴趣。对于命令式语言来说,很难将数据流可视化,因此你能做的最好的事情就是将指令之间的关系可视化(例如流程图)。 - user21037
显示剩余8条评论

30

数据流编程语言是指专注于程序状态并根据状态的任何更改引起操作发生的编程语言。数据流编程语言本质上是并行的,因为操作依赖于输入,满足输入条件将会导致操作执行。这意味着,与普通程序不同,其中一个操作跟随另一个操作,数据流程序中操作只要满足输入就会执行,因此没有固定的顺序。

通常,数据流编程语言使用大型哈希表,其中键是程序的数据,表的值是指向程序操作的指针。这使得在数据流编程语言中创建多核程序更加容易,因为每个核心只需要哈希表即可工作。

数据流编程语言的一个常见示例是电子表格程序,该程序具有受其他数据列影响的数据列。如果一列中的数据发生变化,则其他列中的数据很可能也会随之变化。虽然电子表格程序是数据流编程语言的最常见示例,但它们大多数都是图形化语言。


1
+1 因为你分享了自己在提问后所学到的东西。 - edymtt
2
谢谢。比被接受的答案更易懂。 - tomekwi

20
一种数据流编程的方式是响应式编程。当这种编程风格用于函数式语言时,它被称为函数响应式编程。一个用于Web的函数响应式编程语言的例子是Flapjax
此外,anic是最近在Hacker News上讨论的一种数据流语言。
另一个例子是来自牛津的Martlet

1
+1 如果提到了响应式编程。 - Jus12
有趣的是,这个答案引发了一个关于SO的讨论:“https://dev59.com/jl0a5IYBdhLWcg3wH1ly”。 反应式编程和数据流是否相同可能取决于学术定义。我可以同意它是“一种数据流编程”。 - mihca

12
Dataflow编程语言提出将一些本地行为隔离在所谓的"actors"中,这些"actors"应该并行运行,并通过点对点通道交换数据。与冯·诺伊曼计算机模型不同,没有集中存储器(代码和数据)的概念。
这些"actors"从其输入中消耗数据令牌,并在其输出上生成新数据。
此定义不强制实践中运行的方式。然而,需要仔细分析数据的生产/消费:例如,如果B actor的消费速度不如A actor产生数据的速度,那么它们之间可能需要一个潜在无限的内存(FIFO)。许多其他问题也可能会出现,比如死锁
在许多情况下,由于内部行为的交错是棘手的(超出了今天正式方法的范围),因此此分析将失败。
尽管如此,dataflow编程语言在许多领域仍然具有吸引力
  • 例如,为了定义视频编码的参考模型:纯C程序无法完成此任务,因为它假设所有内容都作为一系列操作运行,这在计算机上并不正确(管线、VLIW、多核和VLSI)。也许您可以看一下这个最近的博士论文。CAL数据流语言被提出作为下一代视频编解码器参考的统一语言。
  • 在需要安全性的关键任务中:如果您对数据的生产/消费添加一些强烈的假设,那么您将得到一种具有强大代码生成、证明等潜力的语言(请参见同步语言)。

6

Excel(以及其他电子表格)本质上是数据流语言。数据流语言与函数式编程语言非常相似,但整个程序图的叶节点处的值实际上并不是值,而是变量(或值流),因此当它们发生变化时,这些变化会在整个图中扩散和传递。


1
我不同意;约束求解器通常通过传播约束在搜索空间中发现最优解。电子表格传播值,而不是约束。 - Barry Kelly
2
解决方案是大多数人不使用的补充功能。而且,树也是图;此外,如果任何两个单元格都引用相同的第三个单元格,则它们形成一个有向无环图,不再是一棵树。 - Barry Kelly
5
"电子表格传递数值而非限制条件"。是的,数值的流动使其成为"数据流"。 - user21037

6

Mozart支持类似数据流的同步,它也有一些商业应用。你还可以认为make是一种数据流编程语言。


1
谢谢提到make。这就是我来这里的原因。楔形文字似乎是它的一般化。 - masterxilo
1
莫扎特的链接不存在 - undefined
莫扎特的最新链接已更新。 - undefined

3

这实际上是一个相当古老的概念 - 在20世纪70年代,甚至有一种语言+机器专门用于高效的数据流编程和执行(曼彻斯特数据流 机器)。

它的优点在于它与Haskell等惰性函数式语言的双重性。因此,如果您的处理步骤是纯函数式的,并且您有足够的处理单元来评估它们并传递结果,那么您可以自动获得最大的并行性,而无需任何编程工作!


2

许多ETL工具也属于这个领域。MS SSIS中的数据流任务是一个很好的例子。在这种情况下,使用了图形化工具。


1
你可以尝试使用看似易用的Cameleon: www.shinoe.org/cameleon。 它是一种图形化的函数式编程语言,采用数据(工作)-流方法。
它是用C++编写的,但可以调用任何编写在任何编程语言中的本地或远程程序。
它采用多级方法,并且似乎是Turing complete(这是Petri net扩展)。

a |> f = f a. 这是Haskell中的数据流吗(它从1..200的项目列表中获取平均值)?[1..200] |> map (*5) |> filter (> 66) |> dup ( sum, length) |> uncurry (div),其中dup (f1,f2) v = (f1 v,f2 v)。 - aoeu256

1

在某些领域,数据流编程更加合理。实时媒体就是一个例子,两个广泛使用的图形化数据流编程环境Pure Data和Max/MSP都专注于实时媒体编程。我想他们的视觉特性也很好地映射到了数据流编程中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接