概述
Occam語言是根據C.A.R.Hoare提出的CSP(Communicating Sequential Process)語言模型而設計的一種並發程式設計語言,0ccam語言是用14世紀英國牛津哲學家William of occam的名字命名的。William of occam有這樣一種哲學觀點:任何問題,用最簡單的方法能解決的途徑是最好的途徑。簡明性是Oceam語言的特點。
Oeeam語言與Transputer晶片是同時相互對應進行設計開發的,因此它們之間的結合所獲得的效率,是一般語言望塵莫及的。可以這樣說,Occam語言對於Transputer系統設計的作用,就如同布爾爾代數對於邏輯門電路設計的作用。Occam程式中的進程,可以映射到一個Transputer系統的有關Transputer單元中去,用Occam語言為一個並發系統所編的程式,實際上起著該Transputer系統的作業系統的作用。
Occam語言是建立在並發和通信基礎上的新的並發程式語言,它把一個並發系統描述成一組並發進程,進程間通過命名通道來實現通信。
大量的調試工作在Transputer開發系統(如TDS2)中用軟體手段來完成,避免了通常多處理器在硬體上進行調試的麻煩。隨著Occam語言在不同機型中的實現,Occam還可用在其他晶片組成的系統中。
定義和類型和範圍
Occam同Pascal等其他高級語言一樣,要求程式中用到的每一個項都要有一個類型和每一項類型在某進程使用它之前進行定義。Occam不允許程式設計師定義新的類型。
(1)名字:Occam中名字的長度不限,但它必須以字母表中的字母開頭。名字的其餘部分可由字母、數字和字元構成。大小寫在Occam中區分識別,所以fred和Fred是兩個不同的名字。
(2)數據類型:變數可有多種數據類型。下面是Oceam中經常使用的數據類型:
INT——整型。
BYTE——0和255之間的整數,經常用以表示字元。
B00L——邏輯值TRUE或FALSE。
(3)通道類型:通道的類型為“CHAN OF類型”。對通道傳送的值,要對其數據類型和數據結構進行定義。目前,我們把通道看作只傳送單數據類型的單個值,就像變數一樣。
傳送單個整型值的通道可定義為:
CHAN OF INT chan3:
其中INT定義通過通道chan3的數據類型。chan3的類型是CHAN OF INT。
(4)字元和字元串:Occam沒有任何CHAR或STRING類型來表達字母、字元或字詞。Occam中字母、字元用BYTE類型的數來表達,字元串用BYTE類型的數組來表達。
(5)布爾類型:通過測試比較運算符的運算,產生布爾值。
(6)常量:給某常數定一個名字,可通過“VAL類型名字IS值”來定義。
(7)作用域:在Occam中,變數、通道和其他命名項都是屬於某個進程的,進程緊跟在對應的命名項的定義後面。
進程
一個進程可以認為是執行一段程式,它啟動、執行一定的動作,然後中止或結束。
Occam語言有三個基本進程;
(1)賦值進程:變數:=表達式
將表達式的值賦給變數。
(2)輸出進程:通道!表達式
將表達式的值輸出到通道。
(3)輸入進程:通道?變數
將從通道輸入的值賦給變數。
Occam語言還有兩個特殊進程:SKIP和STOP。SKIP進程開始執行後不做任何動作就結束。STOP進程開始執行後不再向下執行也不終止,稱之為中止。
同步和通道
進程間通信是同步的,即當一個通道用於一個進程的輸入,並用於另一個進程的輸出時,只有當這兩個進程都準備好,通信才會發生。
通道是單向的,是從一個進程到另一個進程的點對點的通信鏈。輸入輸出的方向是一定的,不可改變的,一個通道僅能連線兩個進程。雙向傳輸就需要兩個通道。
通道上的傳輸實際上是拷貝工作,將一個值原封不動地拷貝到另一個地方。在Occam語言中,可以認為變數是用來存儲值的,通道是用來傳輸值的。
總的來說,通道在以下兩方面不同於變數:
1、一個通道可在同一計算機上運行的兩個進程間,或者在不同計算機上運行的兩個進程間傳送信息。在第一種情況下,通道實際上是記憶體中的某個地址,這有點像變數;在第二種情況下,通道可以表示一條硬體鏈,如Transputer鏈或其他串列通信鏈。在Occam程式中,這兩種情況表達是相同的,只是在第二種情況中,需要用Occam語言的擴展語言進行鏈地址定位。
因此,Occam語言用抽象的方法來描述通信,它不依賴於物理實現,程式設計師可在單個處理器上用通道來編寫程式,而不必擔心不同進程具體在何處被執行。待證明程式正確後,可將不同進程分到各處理器上,這隻要在程式開頭做一些說明,如上面提到的“鏈地址定位”等即可。在單個處理器上所用的通道稱之為軟通道。
2、通道是有耐心的。若一個輸入進程發現需輸入值沒準備好,它會等待,反之亦然,不需程式設計師給出明確的指令,減輕了程式設計師的負擔。