跳至內容

數據流程編程

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

程序設計中,數據流程編程是一種編程范型,它將程序建模為數據在運算(operation)之間流動的有向圖,從而實現了數據流程原理和架構。數據流程編程語言,共享了純函數式語言的某些特徵,比如單賦值,並且開發它們的動因,通常是為了向更適合數值處理的語言,增加函數式編程概念。

歷史

[編輯]

先驅的數據流程語言是BLODI(BLOck DIagram),它是John Larry Kelly, Jr.、Carol Lochbaum和Victor A. Vyssotsky英語Victor A. Vyssotsky專門開發的,用於採樣數據系統[1]。最初開發更常規的數據流程語言,是為了使並行編程更加容易。在1966年Bert Sutherland英語Bert Sutherland的博士論文《計算機過程的在線圖形規定》中[2],Sutherland建立了第一個圖形數據流程編程框架。

數據流程編程,是1960年代由Jack Dennis英語Jack Dennis和他在MIT的研究生開創[3]。為了避免混淆於數據流程計算或數據流程架構英語Dataflow architecture[4],它基於了非確定型機器范型,一些作者使用術語「數據串流」(datastream)替代「數據流程」。

後續的數據流程語言,大多是在大型的超級計算機實驗室中開發的。其中最流行的是1983年發行的SISAL,它是勞倫斯利弗莫爾國家實驗室開發的。SISAL看起來很像大多數的語句驅動語言,但是變量必須是單賦值的。這允許編譯器容易的識別輸入和輸出。SISAL已經發展出了很多分支,包括SAC,即單賦值C語言,它力求儘可能的接近流行的C編程語言。

在1980年代早期,美國海軍開發了ACOS和SPGN(信號處理圖式表示法)。它今天仍用於很多實戰平台中[5]。更激進的概念是Prograph英語Prograph,在其中程序用屏幕上的圖形來構造,而變量被完全替代為連接輸入和輸出的連線。

數據流程已被提議,用作規定分布式系統構件的全局行為的抽象方法:在現場分布式對象英語Live distributed object編程模型中,使用分布式數據流程英語Distributed data flow來存儲和溝通狀態,因而它們扮演了類似於類Java編程語言中變量、字段和參數的角色。

特性

[編輯]

傳統上,程序被建模為,按照特定次序發生的一系列運算;這稱為指令式編程,這種編程方式也叫做順序式[6]過程式[7]控制流程[7](意指程序選擇某個特定路徑)。程序聚焦於命令,符合於馮·諾伊曼的順序式編程願景[6],而數據通常是「靜止的」[7]

與之相對,數據流程編程強調了數據的流動,並將程序建模為一系列的連接。顯式的定義輸入和輸出的連接運算,它的功能類似於黑箱[7]。一個運算在它的所有輸入成為有效時立即運行[8]。因此,數據流程語言是天然並行的,並可在大型的、去中心化的系統上運作[6][9][10]

狀態

[編輯]

計算機編程的關鍵概念之一,是狀態英語State (computer science)(state)的概念,它本質上是在系統中各種狀況的快照(snapshot)。多數編程語言需要相當數量的狀態信息,它們通常對編程者是隱蔽的,計算機自身經常完全不知道哪部份信息編碼了持久狀態。這是一個嚴重問題,因為在並行處理機器中,狀態信息需要在多個處理器之間共享。多數語言強制編程者增加額外代碼,來指示哪些數據和哪部份代碼,對於狀態而言是重要的。這種代碼趨向於在性能方面是代價昂貴的,並且難於閱讀和調試。

如果將順序式程序想象為,在任務(運算)之間移動的一個單一工人,則數據流程程序,更像是在一個裝配線上的一系列工人,每個人都在材料可獲得的時候,作一份特定任務。因為運算只關心數據輸入的可獲得性,它們沒有隱蔽的狀態要追蹤,都是同時「準備好的」。

體現

[編輯]

數據流程程序,可以用不同方式來體現。一個傳統程序,通常體現為一系列的正文指令,可以合理的描述一個串行系統,它在小型單一用途的,接收、處理並返回的工具之間,用管道連通數據。數據流程程序開始於一個輸入,可能有命令行參數,並說明數據被怎樣使用和修改。數據的流程是顯式的,經常用連線或管道來說明。

在編碼方面上,數據流程程序,可以被實現為一個散列表,具有以可唯一性識別的輸入作為鍵(key),用它來查找轉至指令的指針。當任何運算完成時,程序逐項掃描運算的一個列表,直到找到第一個全部輸入都當前有效的運算,並運行它。當運算結束時,它典型的會輸出數據,因而使得另一個運算變為有效。

對於並行運算,只有這個列表需要被共享;它是整個程序的狀態。因此維護狀態的任務,從編程者移交給了語言的運行時系統。在有着單一處理器核心的機器上,設計用於並行運算的實現,只會簡單的產生開銷,要完全去掉這種開銷,可以使用一種不同的運行時系統。

語言

[編輯]

數據流程編程語言包括:

應用編程接口

[編輯]

參見

[編輯]

引用

[編輯]
  1. ^ John L. Kelly Jr.; Carol Lochbaum; V. A. Vyssotsky. A block diagram compiler. Bell System Tech. J. 1961, 40 (3): 669–678. doi:10.1002/j.1538-7305.1961.tb03236.x. 
  2. ^ W.R. Sutherland. The On-line Graphical Specification of Computer Procedures. MIT. 1966. 
  3. ^ VAL Overview
  4. ^ Veen, Arthur H. Dataflow Machine Architecture. ACM Computing Surveys. December 1986, 18 (4): 365–396 [5 March 2019]. doi:10.1145/27633.28055. (原始內容存檔於2021-11-11). 
  5. ^ Underwater Acoustic Data Processing, Y.T. Chan
  6. ^ 6.0 6.1 6.2 Johnston, Wesley M.; J.R. Paul Hanna; Richard J. Millar. Advances in Dataflow Programming Languages (PDF). ACM Computing Surveys. March 2004, 36: 3 [15 August 2013]. doi:10.1145/1013208.1013209. (原始內容 (PDF)存檔於2018-05-16). 
  7. ^ 7.0 7.1 7.2 7.3 7.4 Wadge, William W.; Edward A. Ashcroft. Lucid, the Dataflow Programming Language illustrated. Academia Press. 1985: 7 [15 August 2013]. ISBN 9780127296500. 
  8. ^ 8.0 8.1 Dataflow Programming Basics. Getting Started with NI Products. National Instruments Corporation. [15 August 2013]. (原始內容存檔於2014-02-14). 
  9. ^ Harter, Richard. Data Flow languages and programming - Part I. Richard Harter's World. [15 August 2013]. (原始內容存檔於8 December 2015). 
  10. ^ Why Dataflow Programming Languages are Ideal for Programming Parallel Hardware. Multicore Programming Fundamentals Whitepaper Series. National Instruments Corporation. [15 August 2013]. (原始內容存檔於2018-12-21). 

外部連結

[編輯]