数据流程编程

程序设计中,数据流程编程是将程序建模为在运算操作(operation)之间数据流动的有向图编程范型,从而实现了数据流程原理和架构。 数据流程编程语言共享了函数式语言的某些特征,并且一般而言是它们为了向语言增加更适合数值处理的那些函数式概念而开发的。一些作者使用术语“datastream”替代“dataflow”,用以避免混淆于数据流程计算或数据流程架构,它基于了非确定型机器范型。数据流程编程由Jack Dennis和他在MIT的研究生于1960年代开创。

数据流程编程语言的特性

传统上,程序被建模为按照特定次序发生的一系列运算操作;这称为指令式编程,也叫做顺序式[1]过程式[2]控制流程[2](意指程序选择某个特定路径)编程。程序聚焦于命令,符合于冯·诺伊曼的顺序式编程愿景[1],而数据通常是“静止的”[2]

与之相对,数据流程编程强调了数据的流动,并将程序建模为一系列的连接。显式的定义输入和输出间的连接运算操作,它的功能类似于黑箱[2]。一个运算操作在它的所有输入成为有效时立即运行[3]。因此,数据流程语言是天然并行的,并可在大型的、去中心化的系统上运作[1][4][5]

状态

计算机编程的关键概念之一是状态(state)的概念,它本质上是在系统中各种状况的快照(snapshot)。多数编程语言需要相当数量的状态信息,它们通常对编程者是隐蔽的。计算机自身经常完全不知道哪部份信息编码了持久状态。这是一个严重问题,因为状态信息在并行处理机器中需要在多个处理器之间共享。多数语言强制编程者增加额外代码来指示哪些数据和哪部份代码对于状态而言是重要的。这种代码趋向于在性能方面是代价昂贵的,并且难于阅读和调试。

如果将顺序式程序想象为在任务(运算操作)之间移动的一个单一工人,则数据流程程序更像是在一个装配线上的一系列工人,每个人都在材料可获得的时候作一份特定任务。因为运算操作只关心数据输入的可获得性,它们没有隐蔽的状态要追踪,都是同时“准备好的”。

体现

数据流程程序可以用不同方式来体现。一个传统程序通常体现为一序列的正文指令,这对于描述某种连续系统是合理的,它在小型、单一用途的接收、处理并返回的工具之间管接(pipe)数据。数据流程程序开始于一个输入,可能有命令行参数,并说明数据被怎样使用和修改。数据的流程是显式的,经常用连线(line)或管道(pipe)来说明。

在编码方面上,数据流程程序可以被实现为一个散列表,具有以可唯一性被标别的输入作为键(key),用它来查找转至指令的指针。当任何运算操作完成时,程序逐项扫描运算操作的一个列表,直到找到第一个全部输入都当前有效的运算操作并运行它。当运算操作结束时,它典型的会输出数据,因而使得另一个运算操作变为有效。

对于并行运算操作,只有这个列表需要被共享;它是整个程序的状态。因此维护状态的任务从编程者移交给了语言的运行时系统。在有着单一处理器核心的机器上,设计用于并行运算操作的实现只会简单的产生开销,这种开销可以使用不同的运行时系统来完全去掉。

历史

先驱的数据流程语言是BLODI(BLOck DIagram),它是John Larry Kelly, Jr.、Carol Lochbaum和Victor A. Vyssotsky采样数据系统专门开发的[6]

最初开发更常规的数据流程语言是为了使并行编程更加容易。在Bert Sutherland的1966年博士论文《计算机过程的在线图形规定》中[7], Sutherland建立了第一个图形数据流程编程框架。后续的数据流程语言大多是在大型的超级计算机实验室中开发的。其中最流行的是SISAL,它是劳伦斯利弗莫尔国家实验室开发的。SISAL看起来很像大多数的语句驱动语言,但是变量必须是单赋值的。这允许编译器容易的识别输入和输出。SISAL已经发展出了很多分支,包括SAC,即单赋值C语言,它力求尽可能的接近流行的C编程语言。

美国海军在1980年代早期开发了ACOS和SPGN(信号处理图式表示法)。它今天仍用于很多实战平台中[8]。更激进的概念是Prograph,在其中程序用屏幕上的图形来构造,而变量被完全替代为连接输入和输出的连线。

数据流程被提议用作规定分布式系统构件的全局行为的抽象方法:在现场分布式对象编程模型中,使用分布式数据流程来存储和沟通状态,因而它们扮演了类似于类Java编程语言中变量、字段和参数的角色。

语言

数据流程编程语言包括:

  • ASCET
  • AviSynth,用于视频处理的脚本语言
  • BMDFM,二进制模块数据流程机器
  • CAL
  • Cuneiform函数式工作流程语言
  • CMS管道
  • Hume
  • Joule
  • Keysight VEE
  • KNIME,一个免费和开源的数据分析、报表和集成平台
  • LabVIEW[3]
  • Linda
  • Lucid[2]
  • Lustre
  • Max/MSP
  • Microsoft可视编程语言
  • Orange,一个开源的可视编程工具用于数据挖掘、统计数据分析机器学习
  • Oz
  • Pipeline Pilot
  • Prograph
  • Pure Data
  • Quartz Composer
  • SAC,单赋值C语言
  • SIGNAL,启用多时钟规定的面向数据流程的同步语言
  • Simulink
  • SISAL
  • SystemVerilog,一种硬件描述语言
  • Verilog,在2009年被吸收入SystemVerilog标准的硬件描述语言
  • VHDL,一种硬件描述语言
  • VSXu
  • XEE (Starlight),XML工程环境
  • XProc

应用编程接口

  • Apache Beam:Java/Scala SDK,统一的串流(和批量)处理,支持多种执行引擎(SparkFlinkGoogle Cloud Dataflow等)。
  • Apache Flink:Java/Scala库,允许串流(和批量)计算运行于分布式Hadoop(或其他)集群之上。
  • SystemC:C++库,主要用于硬件设计。
  • TensorFlow:基于数据流程编程的一个机器学习库。

参见

引用

  1. Johnston, Wesley M.; J.R. Paul Hanna; Richard J. Millar. (PDF). ACM Computing Surveys. March 2004, 36: 3 [15 August 2013]. doi:10.1145/1013208.1013209. (原始内容 (PDF)存档于2018-05-16).
  2. Wadge, William W.; Edward A. Ashcroft. illustrated. Academia Press. 1985: 7 [15 August 2013]. ISBN 9780127296500.
  3. . Getting Started with NI Products. National Instruments Corporation. [15 August 2013]. (原始内容存档于2014-02-14).
  4. Harter, Richard. . Richard Harter's World. [15 August 2013]. (原始内容存档于8 December 2015).
  5. . Multicore Programming Fundamentals Whitepaper Series. National Instruments Corporation. [15 August 2013]. (原始内容存档于2018-12-21).
  6. John L. Kelly Jr.; Carol Lochbaum; V. A. Vyssotsky. . Bell System Tech. J. 1961, 40 (3): 669–678. doi:10.1002/j.1538-7305.1961.tb03236.x.
  7. W.R. Sutherland. . MIT. 1966.
  8. Underwater Acoustic Data Processing, Y.T. Chan

外部链接

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.