在程式設計中,數據流程編程是一種程式設計範式,它將程式建模為數據在運算(operation)之間流動的有向圖,從而實現了數據流程原理和架構。數據流程程式語言,共用了純函數式語言的某些特徵,比如單賦值,並且開發它們的動因,通常是為了向更適合數值處理的語言,增加函數式程式設計概念。
歷史
先驅的數據流程語言是BLODI(BLOck DIagram),它是John Larry Kelly, Jr.、Carol Lochbaum和Victor A. Vyssotsky專門開發的,用於採樣數據系統[1]。最初開發更常規的數據流程語言,是為了使並列編程更加容易。在1966年Bert Sutherland的博士論文《電腦過程的線上圖形規定》中[2],Sutherland建立了第一個圖形數據流程編程框架。
數據流程編程,是1960年代由Jack Dennis和他在MIT的研究生開創[3]。為了避免混淆於數據流程計算或數據流程架構[4],它基於了非確定型機器範式,一些作者使用術語「數據串流」(datastream)替代「數據流程」。
後續的數據流程語言,大多是在大型的超級電腦實驗室中開發的。其中最流行的是1983年發行的SISAL,它是勞倫斯利弗莫爾國家實驗室開發的。SISAL看起來很像大多數的陳述式驅動語言,但是變數必須是單賦值的。這允許編譯器容易的辨識輸入和輸出。SISAL已經發展出了很多分支,包括SAC,即單賦值C語言,它力求儘可能的接近流行的C程式語言。
在1980年代早期,美國海軍開發了ACOS和SPGN(訊號處理圖式表示法)。它今天仍用於很多實戰平台中[5]。更激進的概念是Prograph,在其中程式用螢幕上的圖形來構造,而變數被完全替代為連接輸入和輸出的連線。
數據流程已被提議,用作規定分散式系統構件的全域行為的抽象方法:在現場分散式對象編程模型中,使用分散式數據流程來儲存和溝通狀態,因而它們扮演了類似於類Java程式語言中變數、欄位和參數的角色。
特性
傳統上,程式被建模為,按照特定次序發生的一系列運算;這稱為指令式編程,這種編程方式也叫做順序式[6]、程序式[7]、控制流程[7](意指程式選擇某個特定路徑)。程式聚焦於命令,符合於馮·諾伊曼的順序式編程願景[6],而數據通常是「靜止的」[7]。
與之相對,數據流程編程強調了數據的流動,並將程式建模為一系列的連接。顯式的定義輸入和輸出的連接運算,它的功能類似於黑箱[7]。一個運算在它的所有輸入成為有效時立即執行[8]。因此,數據流程語言是天然並列的,並可在大型的、去中心化的系統上運作[6][9][10]。
電腦編程的關鍵概念之一,是狀態(state)的概念,它本質上是在系統中各種狀況的快照(snapshot)。多數程式語言需要相當數量的狀態資訊,它們通常對編程者是隱蔽的,電腦自身經常完全不知道哪部份資訊編碼了持久狀態。這是一個嚴重問題,因為在並列處理機器中,狀態資訊需要在多個處理器之間共用。多數語言強制編程者增加額外代碼,來指示哪些數據和哪部份代碼,對於狀態而言是重要的。這種代碼趨向於在效能方面是代價昂貴的,並且難於閱讀和除錯。
如果將順序式程式想像為,在任務(運算)之間移動的一個單一工人,則數據流程程式,更像是在一個裝配線上的一系列工人,每個人都在材料可獲得的時候,作一份特定任務。因為運算只關心數據輸入的可獲得性,它們沒有隱蔽的狀態要追蹤,都是同時「準備好的」。
數據流程程式,可以用不同方式來體現。一個傳統程式,通常體現為一系列的正文指令,可以合理的描述一個串行系統,它在小型單一用途的,接收、處理並返回的工具之間,用管道連通數據。數據流程程式開始於一個輸入,可能有命令列參數,並說明數據被怎樣使用和修改。數據的流程是顯式的,經常用連線或管道來說明。
在編碼方面上,數據流程程式,可以被實現為一個雜湊表,具有以可唯一性辨識的輸入作為鍵(key),用它來尋找轉至指令的指標。當任何運算完成時,程式逐項掃描運算的一個列表,直到找到第一個全部輸入都當前有效的運算,並執行它。當運算結束時,它典型的會輸出數據,因而使得另一個運算變為有效。
對於並列運算,只有這個列表需要被共用;它是整個程式的狀態。因此維護狀態的任務,從編程者移交給了語言的執行時系統。在有着單一處理器核心的機器上,設計用於並列運算的實現,只會簡單的產生開銷,要完全去掉這種開銷,可以使用一種不同的執行時系統。
語言
數據流程程式語言包括:
- ASCET
- AviSynth,用於影片處理的手稿語言
- BMDFM,二進制模組數據流程機器
- CAL
- Cuneiform,函數式工作流程語言
- CMS管道
- Hume
- Id
- Joule
- Agilent VEE
- KNIME,一個免費和開源的數據分析、報表和整合平台
- LabVIEW[8]
- Linda
- Lucid[7]
- Lustre
- Max/MSP
- Microsoft可視程式語言
- Orange,一個開源的可視編程工具用於數據探勘、統計數據分析和機器學習
- Oz
- Pipeline Pilot
- Prograph
- Pure Data
- Quartz Composer
- SAC,單賦值C語言
- SIGNAL,啟用多時鐘規定的面向數據流程的同步語言
- Simulink
- SISAL
- SystemVerilog,一種硬件描述語言
- Verilog,在2009年被吸收入SystemVerilog標準的硬件描述語言
- VHDL,一種硬件描述語言
- XEE (Starlight),XML工程環境
- XProc
應用編程介面
- Apache Beam:Java/Scala SDK,統一的串流(和批次)處理,支援多種執行引擎(Apache Spark、Apache Flink、Google雲平台等)。
- Apache Flink:Java/Scala庫,允許串流(和批次)計算執行於分散式Apache Hadoop(或其他)叢集之上。
- SystemC:C++庫,主要用於硬件設計。
- TensorFlow:基於數據流程編程的一個機器學習庫。
參見
參照
外部連結
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.