在計算機科學中，通 信順序程序（，縮寫為 CSP），又譯為交 談循序程式、交換訊息的循序程式，是一種形式語言，用來描述並行性系統間進行互動的模式。它是叫做程序代數或程序演算的關於併發的數學理論家族的一員，基於了透過通道的訊息傳遞。CSP 高度影響了 Occam 的設計，INMOS document 72 occ 45 03，也影響了程式語言如 Limbo、、Go、 和 Clojure 的 coreasync 等。 CSP 最早出現於東尼霍爾在 1978 年發表的論文，但在之後又經過一系列的改善。CSP 已經實際的應用在工業之中，作為一種工具去各種不同系統的併發狀況，比如 T9000 Transputer，還有安全電子商務系統。CSP 的理論自身仍是活躍研究的主題，包括了增加它的實際可應用性的範圍（比如增大可以跟蹤分析的系統的規模）。 歷史 在 Hoare 的 1978 年論文中提出的 CSP 版本在本質上不是一種程序演算，而是一種併發程式語言，它有四類命令：並行命令，賦值命令，輸入和輸出命令，交替（alternation）和重複命令。它有著與後來版本的 CSP 在實質上不同的語法，不擁有數學上定義的語義，不能體現。最初的 CSP 程式被寫為一組固定數目的順序程序的並行複合（composition），它們相互之間嚴格透過同步訊息傳遞來進行通訊。與後來版本的 CSP 相對比，每個程序都被賦予了一個顯式的名字，透過指定意圖傳送或接收的程序的名字，定義訊息的來源和目標，沒有采用等價的命名的通道方式。例如，定義程序： COPY ccharacter westc eastc 它是重複的從叫作 west 的程序接收一個字元，再將這個字元傳送到叫作 east 的程序。接著定義逐行讀取打孔卡再輸出字串流到叫作 X 的程序的 DISASSEMBLE 程序，和從叫作 X 的程序讀取字串流再逐行列印到行式印表機的 ASSEBLE 程序。並行複合： westDISASSEMBLE XCOPY eastASSEMBLE 它賦予名字 west 至 DISASSEMBLE 程序，名字 X 至 COPY 程序，名字 east 至 ASSEMBLE 程序，併發的執行這三個程序。 在最初版本的 CSP 出版之後，Hoare、Stephen Brookes 和 A W Roscoe 發展並精煉了 CSP 的理論，使之成為現代的程序代數形式。將 CSP 發展成程序代數的方式受到 Robin Milner 關於（CCS）的工作的影響，反之亦然。最初提出 CSP 的理論上的版本的是 Brookes、Hoare 和 Roscoe 的 1984 年的文章，和後來 Hoare 的 1985 年出版的書籍《通訊順序程序》。CSP 的理論在 Hoare 的書籍出版之後仍繼續有細小的變更。這些變更大多由 CSP 程序分析和驗證的自動工具的出現所推動。Roscoe 在 1997 年出版的《併發的理論和實踐》描述了更新版本的 CSP。 非形式描述 如其名字所提示的那樣，CSP 允許依據構件程序來描述系統，它們獨立運作，並只通過訊息傳遞通訊來相互互動。但是 CSP 名字中 順序 這個詞有時導致誤解，因為現代 CSP 允許構件程序被定義為二者：順序程序和多個更原始的程序的並行複合。在不同程序之間的關係，和每個程序與它的環境通訊的方式，是使用各種程序代數算符（operator）描述的。使用這種代數方式，可以從原始元素輕易的構造出非常複雜的程序描述。 原語 CSP 在它的程序代數中提供兩類原語（primitive）： 事件 事件表示通訊或互動。它們被假定為是不可分的和瞬時的。它們可以是原子名字（比如 mathrm on、mathrm off），複合名字（比如 mathrm valveopen、mathrm valveclose），輸入 輸出事件（比如 mathrm mousexy、mathrm screenbitmap）。 原始程序 原始程序表示基本的行為：例子包括 mathrm STOP（什麼都不通訊的程序，也叫作死鎖）和 mathrm SKIP（它表示成功終止）。 代數算符 CSP 有範圍廣泛的代數算符。主要的有： 字首 字首算符，將一個事件和一個程序結合起來產生一個新程序。例如： a rightarrow P 是想要與它的環境通訊 a 的程序，而且在 a 之後，表現得如同程序 P。 確定性選擇 確定性（或外部）選擇算符，允許將程序的將來演變定義為，在兩個構件程序之間進行選擇，並允許環境透過通訊這兩程序之一的初始事件，來解決這個選擇。例如： left a rightarrow Pright Box left b rightarrow Qright 是想要通訊初始事件 a 和 b 的程序，並依據環境決定與之通訊的是哪個初始事件，隨後表現為要麼 P 要麼 Q。如果 a 和 b 二者同時被通訊，則選擇將被非確定性的解決。 非確定性選擇 非確定性（或內部）選擇運算元，允許將程序的將來演變定義為，在兩個構件程序之間的選擇，但是不允許環境對哪個構件程序將被選擇的任何控制。例如： left a rightarrow Pright sqcap left b rightarrow Qright 可以表現得如同要麼 left a rightarrow Pright 要麼 left b rightarrow Qright。它可以拒絕接受 a 或 b，並只在環境提供了 a 和 b 二者時，被強制去通訊。如果要選擇的兩邊的初始事件是同一的，非確定性也可能被介入到確定性選擇中。例如： left a rightarrow a rightarrow mathrm STOPright Box left a rightarrow b rightarrow mathrm STOPright 等價於 a rightarrow left left a rightarrow mathrm STOPright sqcap left b rightarrow mathrm STOPrightright 交錯 交錯（interleaving）算符，代表完全獨立的併發活動。程序： P vertvertvert Q 表現為 P 和 Q 二者同時。來自二者程序的事件在時間上是任意交錯的。 介面並行 介面（interface）或廣義（generalized）並行算符，代表併發活動要求在構件程序之間的同步：在介面集合中的任何事件，只能在所有程序都能應允（engage）這個事件的時候出現。例如，程序： P leftvertleft left a right rightrightvert Q 要求 P 和 Q 必須在事件 a 可以發生前能夠進行這個事件。例如，程序： left a rightarrow Pright leftvertleft left a right rightrightvert left a rightarrow Qright 可以應允事件 a，而變成程序： P leftvertleft left a right rightrightvert Q 然而 left a rightarrow Pright leftvertleft left a b right rightrightvert left b rightarrow Qright 將會簡單的死鎖。 隱藏 隱藏算符，透過使某些事件不可察見，提供了一種抽象程序的方式。隱藏的一個平凡的例子是： left a rightarrow Pright setminus lefta right 假定事件 a 不出現在 P 中，它簡單的歸約成： P 例子 一個原型的 CSP 例子是，一個巧克力售貨機和它與一個想要買巧克力的人之間互動的抽象表示。這個售貨機可以執行兩個不同事件，mathrm coin 和 mathrm choc，分別表示插入硬幣和投遞巧克力。這個機器在提供巧克力之前想要貨款（現金）可以寫為： mathrm VendingMachine mathrm coin rightarrow mathrm choc rightarrow mathrm STOP 一個人可以選擇投幣或刷卡支付可以建模為： mathrm Person mathrm coin rightarrow mathrm STOP Box mathrm card rightarrow mathrm STOP 這兩個程序可以放置為並行，這樣它們可以相互互動。這種複合程序的行為依賴於這兩個程序必須同步於其上的那些事件。因此： mathrm VendingMachine leftvertleft left mathrm coin mathrm card rightrightrightvert mathrm Person equiv mathrm coin rightarrow mathrm choc rightarrow mathrm STOP 然而如果同步只要求 mathrm coin，我們會得到： mathrm VendingMachine leftvertleft left mathrm coin rightrightrightvert mathrm Person equiv left mathrm coin rightarrow mathrm choc rightarrow mathrm STOPright Box left mathrm card rightarrow mathrm STOPright 如果我們透過隱藏 mathrm coin 和 mathrm card 來抽象後者這個複合程序，也就是： left left mathrm coin rightarrow mathrm choc rightarrow mathrm STOPright Box left mathrm card rightarrow mathrm STOPright right setminus leftmathrm coin cardright 我們得到非確定性程序： left mathrm choc rightarrow mathrm STOPright sqcap mathrm STOP 這是一個要麼提供 mathrm choc 事件並接著停止，或者就地停止的程序。換句話說，如果我們把這個抽象當作對這個系統的外部檢視（比如未看到這個人的做出如何決定的某個人），就已經介入了。 形式定義 語法 CSP 的語法定義了程序和事件可以組合的 合法 方式。設 e 是一個事件，X 是一個事件集合。CSP 的基本語法可以定義為： begin arraylcll Proc mathrm STOP mathrm SKIP e rightarrow Proc text prefixing Proc Box Proc text external text choice Proc sqcap Proc text nondeterministic text choice Proc vertvertvert Proc text interleaving Proc X Proc text interface text parallel Proc setminus X text hiding Proc Proc text sequential text composition mathrm if b mathrm then Proc mathrm else Proc text boolean text conditional Proc triangleright Proc text timeout Proc triangle Proc text interrupt end array 注意：為得到簡要性，上述提供的語法省略了 mathbf div 程序，它表示，還有各種算符，比如字母化並行、管道、索引選擇。 有關的形式化 從經典無時序的 CSP 已經派生出一些其他的規定語言和形式化，包括： Timed CSPTimed CSP ，它結合了時序資訊用於關於即時系統的推理。 Receptive Process TheoryReceptive Process Theory，專門化的 CSP，假定了非同步（就是）傳送操作。 CSPPCSPP HCSPHCSP TCOZTCOZ，整合有時序的 CSP 於。 CircusCircus，整合 CSP 和基於的。 CMLCML （COMPASS 建模語言），合併了為（SoS）開發的 Circus 和。 CspCASLCspCASL，集成了 CSP 的擴充套件。 ，結合了 CSP 與特徵的國際標準。 參見 ，跟蹤的一般性理論。 和 XC VerilogCSP，向 Verilog HDL 增加的一組宏，用來支援通訊順序程序通道通訊。 ，是 Brinch Hansen 在大約 1989 年開發的基於 CSP 原理的程式語言。 ，是 Brinch Hansen 開發的程式語言，受到 CSP 和他早期創作的 Joyce 的影響。 Ada，實現了 CSP 特徵比如約會。 DirectShow，是 DirectX 內的影片框架，它使用了 CSP 概念來實現音訊和影片過濾器。 ，是正式開發的網路為中心分散式 RTOS，基於了 CSP 的務實超集。 並行程式設計模型 延伸閱讀 本書已經被的更新，新版可以於網站 Using CSPUsing CSP 自由的下載獲取為 PDF 檔案。應用了版權限制，下載前參看頁面文字。 一些與本書有關的連結可見於網站 The Theory and Practice of Concurrency 。全文可從 Bill Roscoe 的學術出版列表下載獲取為 PSPS 或 PDFPDF 檔案。 引用 外部連結 WoTUG CSP 和 occam 風格系統的使用者組，包含了關於 CSP 和有用連結的一些資訊。 Category 併發計算 Category 程序演算