管道 (軟件)

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

管道(pipeline),本源是使用消息傳遞進程間通信機制,它構成自鏈接起來的處理元素(進程線程協程函數等),它們被安置為每個元素的輸出都是下一個元素的輸入;這個名字類比於物理上的管道運輸。在連貫的元素之間,通常會提供一定數量的緩衝區。在管道中流動的信息,經常是記錄字節(stream),而管道的元素可以叫做過濾器英語Filter (software)。將元素連接成管道類似於函數複合英語Function composition (computer science)。在軟件工程中,稱之為管道與過濾器設計模式[1]

概述[編輯]

管道的概念是在Unix的發源地貝爾實驗室Douglas McIlroy在Unix開發期間主張的[2][3]。與Unix的管道有關的更早期獨立工作是Ken Lochner在1960年代為Dartmouth分時系統英語Dartmouth Time Sharing System開發的「通信文件」[4][5]Tony Hoare在1978年提出的通信順序進程(CSP),進一步發展了McIlroy的管道,但它用於通信的無緩衝區通道不是頭等對象[6]CMS管道英語CMS Pipelines是開始於1980年的將管道想法向IBMVM/CMS英語VM (operating system)z/OS系統的移植[7]

狹窄些說,管道是線性的和單向的,最典型的是Unix shell最初提供的管道語法。但是這個術語有時也應用於更一般性的流(flow)。例如,一個基本上單向的管道,可以有在另一個方向上一些通信,叫做「返回通道」或「反向通道」,就像在lexer hack英語lexer hack中那樣,也有管道可以是完全雙向的。有着單向樹和有向無環圖拓撲的流[8][9],由於沒有環路而相對簡單,使得它們表現得類似於(線性的)管道,因此也可以寬泛的稱為「管道」[10]

除了基於字節流(stream)的管道,還有對象管道。在對象管道中,處理元素輸出對象而非文本。Windows PowerShell包含了一種內部的對象管道,在PowerShell運行時系統之內於函數之間傳輸.NET對象。在Limbo編程語言中的通道,是這種隱喻英語Scientific community metaphor的另一個例子。

管道和過濾器英語Filter (software),可以被看作使用字節流作為數據對象的一種形式的函數式編程;更具體的說,它們可以被看作是特定形式的I/O單子[11]

參見[編輯]

注釋[編輯]

  1. ^ Jorge L. Ortega-Arjona. The Pipes and Filters Pattern. A Functional Parallelism Architectural Pattern for Parallel Programming. January 2005.
  2. ^ Mahoney, Michael S. The Unix Oral History Project: Release.0, The Beginning. [2020-05-04]. (原始內容存檔於2021-04-21). McIlroy: It was one of the only places where I very nearly exerted managerial control over Unix, was pushing for those things, yes. 
  3. ^ Advice for pipe from M. D. McIlroy.. [2020-05-04]. (原始內容存檔於2021-02-22). 
  4. ^ 存档副本. [2020-05-05]. (原始內容存檔於2021-02-25). 
  5. ^ The Evolution of the Unix Time-sharing System頁面存檔備份,存於網際網路檔案館).
  6. ^ Russ Cox, Bell Labs and CSP Threads頁面存檔備份,存於網際網路檔案館).
  7. ^ VM and the VM Community, Melinda Varian (PDF). [2020-05-04]. (原始內容存檔 (PDF)於2021-04-21). 
  8. ^ Tom Duff. Rc — The Plan 9 Shell頁面存檔備份,存於網際網路檔案館). 1990.
  9. ^ Diomidis Spinellis, Marios Fragkoulis. Extending Unix Pipelines to DAGs. April 2017. IEEE Transactions on Computers PP(99):1-1. 
  10. ^ dgsh — directed graph shell頁面存檔備份,存於網際網路檔案館).
  11. ^ "Monadic I/O and UNIX shell programming". [2020-05-04]. (原始內容存檔於2020-11-09). 

外部連結[編輯]