定義類型和範圍
Occam同
Pascal等其他高級語言一樣,要求程式中用到的每一個項都要有一個類型和每一項類型在某進程使用它之前進行定義。Occam不允許程式設計師定義新的類型。
名字:Occam中名字的長度不限,但它必須以字母表中的字母開頭。名字的其餘部分可由字母、數字和字元構成。大小寫在Occam中區分識別,所以fred和Fred是兩個不同的名字。
數據類型:變數可有多種數據類型。下面是Occam中經常使用的
數據類型:
BYTE——0和255之間的整數,經常用以表示
字元。
B00L——邏輯值TRUE或FALSE。
通道類型:通道的類型為“CHAN OF類型”。對通道傳送的值,要對其數據類型和數據結構進行定義。目前,我們把通道看作只傳送單數據類型的單個值,就像變數一樣。
傳送單個整型值的通道可定義為:
CHAN OF INT chan3:
其中INT定義通過通道chan3的數據類型。chan3的類型是:
CHAN OF INT。
字元和
字元串:Occam沒有任何CHAR或STRING類型來表達字母、字元或字詞。Occam中字母、字元用BYTE類型的數來表達,字元串用BYTE類型的數組來表達。
布爾類型:通過測試比較運算符的運算,產生布爾值。
常量:給某常數定一個名字,可通過“VAL類型名字IS值”來定義。
作用域:在Occam中,變數、通道和其他命名項都是屬於某個進程的,進程緊跟在對應的命名項的定義後面。
進程
一個進程可以認為是執行一段程式,它啟動、執行一定的動作,然後中止或結束。
Occam語言有三個基本進程;
將表達式的值賦給變數。
(2)輸出進程:通道!表達式
將表達式的值輸出到通道。
(3)輸入進程:通道?變數
將從通道輸入的值賦給變數。
Occam語言還有兩個特殊進程:SKIP和STOP。SKIP進程開始執行後不做任何動作就結束。STOP進程開始執行後不再向下執行也不終止,稱之為中止。
同步和通道
進程間通信是同步的,意即當一個通道用於一個進程的輸入,並用於另一個進程的輸出時,只有當這兩個進程都準備好,通信才會發生。
通道是單向的,是從一個進程到另一個進程的點對點的通信鏈。輸入輸出的方向是一定的,不可改變的,一個通道僅能連線兩個進程。雙向傳輸就需要兩個通道。
通道上的傳輸實際上是拷貝工作,將一個值原封不動地拷貝到另一個地方。在Occam語言中,可以認為變數是用來存儲值的,通道是用來傳輸值的,在下面的結構一段中,可以看到,為什麼不能用變數來傳輸值。
總的來說,通道在以下兩方面不同於變數:
1、一個通道可在同一計算機上運行的兩個進程間,或者在不同計算機上運行的兩個進程問傳送信息。在第一種情況下,通道實際上是記憶體中的某個地址,這有點像變數;在第二種情況下,通道可以表示一條硬體鏈,如Transputer鏈或其他串列通信鏈。在Occam程式中,這兩種情況表達是相同的,只是在第二種情況中,需要用Occam語言的擴展語言進行鏈地址定位。
因此,Occam語言用抽象的方法來描述
通信,它不依賴於物理實現,程式設計師可在單個處理器上用通道來編寫程式,而不必擔心不同進程具體在何處被執行。待證明程式正確後,可將不同進程分到各處理器上,這隻要在程式開頭做一些說明,如上面提到的“鏈地址定位”等即可。在單個處理器上所用的通道稱之為軟通道。
2、通道是有耐心的。若一個輸入進程發現需輸入值沒準備好,它會等待,反之亦然,不需程式設計師給出明確的指令,這減輕了程式設計師的負擔。
結構
結構本身也是進程,結構可以嵌套,通過結構將數個組元進程結合起來。結構以一個Occam關鍵字開頭,該關鍵字說明組元進程的組合方式。Occam語言有以下結構:
(1)串列結構:SEQ
{進程}
結構啟動後,順序執行結構中各進程,直到最後一個組元進程執行完,結構結束。此結構的執行與傳統的程式語言相同,即順序執行。注意Occam語言用結構關鍵字下縮進兩個字元來表示進程的作用域,而其他語言是用如begin…end等特殊字元達到這一目的。
(2)並行結構:PAR
{進程}
結構啟動後,並行執行結構中各進程,待所有組元進程執行完,結構結束。此結構是Occam語言特有的。有些問題需特別注意,如:PAR結構中組元進程不允許使用共享變數,見例:
INT J,K: ——說明兩個整型變數J,K:
PAR ——J,K局部於PAR進程
SEQ ——PAR下組元進程
J:=2 ——“……”表示一系列進程
SEQ ——PAR下另一個組元進程
K:=J ——用共享變數,非法
對編程者,這是個限制,但這是必要的,因為兩個組元進程並行執行時,變數賦值的時序是不確定的,即第二個組元進程的J值不能確定是在第一個組元進程賦值前還是賦值後的值。這裡就說明了“在Occam語言中,用變數存儲值,用通道傳輸值”的道理了,若將此處的賦值改為通道傳輸,第二個組元進程就等待第一個組元進程的J值準備好再輸入,這時變數傳輸的時序是確定的。
(3)條件結構IF
IF可帶有任意數目的進程,每進程前都有一條件測試,條件測試與後面的進程一起組成一個組元進程。實際上只能執行一個組元進程,該進程是(按書寫順序)測試結果首先為TRUE的進程:
IF
X=1
Chanl!y
X=2
Chan2!Y
在這段程式中(假設x,y,thanl,chan2已在其他地方說明),y值是輸出到chanl還是chan2將取決於x的值是等於1還是等於2:
(4)擇一結構ALT
IF結構根據變數的數值做選擇,而ALT結構是根據通道狀態作選擇。
同IF一樣,ALT可將任意數目的組元結合到單個結構中,但ALT的組元部分——稱為擇一項,要比IF結構的選擇項複雜得多。
最簡單的一種ALT結構是其每一擇一項包含有一個輸入,緊跟著一個執行進程。ALT檢測所有輸入進程並執行與第一個準備好的輸入相關的進程。這樣,簡單說來ALT結構就是一個在一組通道問“首先通過通道的競賽”,僅有獲勝者的進程才被執行。
(5)條件循環結構WHILE
Occam語言中包含了兩種循環結構,一是重複執行一定次數的循環;二是條件循環,由WHILE結構構成,其中包括一個像x<o或fred=100這樣的條件測試。當測試結果為真時,進程被執行,當測試結果為假時,循環結束。