数据流程编程

在程序设计中,数据流程编程是一种编程范型,它将程序建模为数据在运算(operation)之间流动的有向图,从而实现了数据流程原理和架构。数据流程编程语言,共享了纯函数式语言的某些特征,比如单赋值,并且开发它们的动因,通常是为了向更适合数值处理的语言,增加函数式编程概念。

历史
先驱的数据流程语言是BLODI(BLOck DIagram),它是John Larry Kelly, Jr.、Carol Lochbaum和专门开发的,用于采样数据系统。最初开发更常规的数据流程语言,是为了使并行编程更加容易。在1966年的博士论文《计算机过程的在线图形规定》中,Sutherland建立了第一个图形数据流程编程框架。

数据流程编程,是1960年代由和他在MIT的研究生开创。为了避免混淆于数据流程计算或,它基于了非确定型机器范型,一些作者使用术语“数据串流”(datastream)替代“数据流程”。

后续的数据流程语言,大多是在大型的超级计算机实验室中开发的。其中最流行的是1983年发行的SISAL,它是劳伦斯利弗莫尔国家实验室开发的。SISAL看起来很像大多数的语句驱动语言,但是变量必须是单赋值的。这允许编译器容易的识别输入和输出。SISAL已经发展出了很多分支,包括SAC,即单赋值C语言,它力求尽可能的接近流行的C编程语言。

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

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

特性
传统上,程序被建模为,按照特定次序发生的一系列运算;这称为指令式编程,这种编程方式也叫做顺序式、过程式、控制流程。因此,数据流程语言是天然并行的,并可在大型的、去中心化的系统上运作。

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

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

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

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

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

语言
数据流程编程语言包括:

*
*AviSynth,用于视频处理的脚本语言
*,二进制模块数据流程机器
*
*Cuneiform,函数式工作流程语言
*
*
*
*
*Agilent VEE
*,一个免费和开源的数据分析、报表和集成平台
*LabVIEW
*
*Lucid
*Lustre
*
*
*,一个开源的可视编程工具用于数据挖掘、统计数据分析和机器学习
*
*
*
*Pure Data
*Quartz Composer
*SAC,单赋值C语言
*,启用多时钟规定的面向数据流程的同步语言
*Simulink
*SISAL
*SystemVerilog,一种硬件描述语言
*Verilog,在2009年被吸收入SystemVerilog标准的硬件描述语言
*VHDL,一种硬件描述语言
*,XML工程环境
*

应用编程接口

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

参见

  • 数据驱动编程
  • 基于流程编程
  • 函数式反应式编程
  • 管道 (软件)

*

  • 串流处理

引用
外部链接
*[https://web.archive.org/web/20131017033905/http://deepfriedcode.com/ Book: Dataflow and Reactive Programming Systems]
*[http://www.codeproject.com/Articles/107121/Basics-of-Dataflow-Programming-in-F-and-C Basics of Dataflow Programming in F# and C#]

*[http://ptolemy.eecs.berkeley.edu/publications/papers/87/staticscheduling/ Static Scheduling of Synchronous Data Flow Programs for Digital Signal Processing]

评论 (0)

  • 还没有评论,来抢沙发吧。