管道 (軟件)
管道(pipeline),本源是使用訊息傳遞的行程間通訊機制,它構成自連結起來的處理元素(行程、線程、協程和函數等),它們被安置為每個元素的輸出都是下一個元素的輸入;這個名字類比於物理上的管道運輸。在連貫的元素之間,通常會提供一定數量的緩衝區。在管道中流動的資訊,經常是記錄、位元組或位的流(stream),而管道的元素可以叫做過濾器。將元素連接成管道類似於函數複合。在軟件工程中,稱之為管道與過濾器設計模式[1]。
概述
管道的概念是在Unix的發源地貝爾實驗室由Douglas McIlroy在Unix開發期間主張的[2][3]。與Unix的管道有關的更早期獨立工作是Ken Lochner在1960年代為Dartmouth分時系統開發的「通訊檔案」[4][5]。Tony Hoare在1978年提出的交談循序程式(CSP),進一步發展了McIlroy的管道,但它用於通訊的無緩衝區通道不是頭等對象[6]。CMS管道是開始於1980年的將管道想法向IBM的VM/CMS和z/OS系統的移植[7]。
狹窄些說,管道是線性的和單向的,最典型的是Unix shell最初提供的管道語法。但是這個術語有時也應用於更一般性的流(flow)。例如,一個基本上單向的管道,可以有在另一個方向上一些通訊,叫做「返回通道」或「反向通道」,就像在lexer hack中那樣,也有管道可以是完全雙向的。有着單向樹和有向無環圖拓撲的流[8][9],由於沒有環路而相對簡單,使得它們表現得類似於(線性的)管道,因此也可以寬泛的稱為「管道」[10]。
除了基於位元組流(stream)的管道,還有對象管道。在對象管道中,處理元素輸出對象而非文字。Windows PowerShell包含了一種內部的對象管道,在PowerShell執行時系統之內於函數之間傳輸.NET對象。在Limbo程式語言中的通道,是這種隱喻的另一個例子。
管道和過濾器,可以被看作使用位元組流作為數據對象的一種形式的函數式程式設計;更具體的說,它們可以被看作是特定形式的I/O單子[11]。
參見
註釋
- ^ Jorge L. Ortega-Arjona. The Pipes and Filters Pattern. A Functional Parallelism Architectural Pattern for Parallel Programming. January 2005.
- ^ 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.
- ^ Advice for pipe from M. D. McIlroy.. [2020-05-04]. (原始內容存檔於2021-02-22).
- ^ 存档副本. [2020-05-05]. (原始內容存檔於2021-02-25).
- ^ The Evolution of the Unix Time-sharing System (頁面存檔備份,存於互聯網檔案館).
- ^ Russ Cox, Bell Labs and CSP Threads (頁面存檔備份,存於互聯網檔案館).
- ^ VM and the VM Community, Melinda Varian (PDF). [2020-05-04]. (原始內容存檔 (PDF)於2021-04-21).
- ^ Tom Duff. Rc — The Plan 9 Shell (頁面存檔備份,存於互聯網檔案館). 1990.
- ^ Diomidis Spinellis, Marios Fragkoulis. Extending Unix Pipelines to DAGs. April 2017. IEEE Transactions on Computers PP(99):1-1.
- ^ dgsh — directed graph shell (頁面存檔備份,存於互聯網檔案館).
- ^ "Monadic I/O and UNIX shell programming". [2020-05-04]. (原始內容存檔於2020-11-09).