occam,一種並行程式語言,主要基於交談循序程式的程式代數[1],以及它的許多特色而實作。它的名稱來自於奧卡姆的威廉提出的奧卡姆剃刀(Occam's razor)原則。
occam是一種類似於Pascal的指令式程序式程式語言。這個語言於1983年出現,由英國電腦科學家David May,以及Inmos公司的科學家,在東尼·霍爾提供顧問意見後,共同研發而成。
概述
在下列例子中,縮排和格式對於分析代碼是關鍵性的:表達式以行結束來終止,表達式的列表需要在縮排的相同水平上。這個特徵叫做越位規則,也能在其他語言比如Haskell和Python中見到。occam有指令式語言的基本要素和常規構造:變數,資料類型,表達式,條件構造IF
,選擇構造CASE
,重複構造WHILE
,作為命名行程的過程,和作為值過程的函式,過程不可以遞迴。
在行程之間的通訊使用命名的通道完成的。通道是有類型的,定義了兩個行程間的通訊協定,可以作為參數傳遞給過程,可以建立通道的陣列。一個行程通過!
向一個通道輸出資料,而另一個行程用?
從它輸入資料。輸入和輸出不能進行,直到另一端已經準備好接受或提供資料。行程在不能進行的情況下,經常稱呼為它阻塞在這個通道之上,它不會阻塞其他獨立行程的執行。阻塞行為不會是自旋(spin)或輪詢(poll),而會是其他機制如等待(wait)、掛起(hang)或讓位(yield)。下舉一例,其中c
是變數:
keyboard ? c screen ! c
occam還有對應交談循序程式的如下構造和機制:
SEQ
順序構造,介入要被順序求值的表達式的一個列表。順序執行不是隱含的,大多數其他語言無這種顯式構造。例如:
SEQ x := x + 1 y := x * x
ALT
交替(alternation)構造,指定有守衛的命令的一個列表。守衛(guard)起源於Edsger W. Dijkstra在1976年提出的守衛命令語言[2],是一個布林條件和一個輸入表達式的組合(二者都是可選的)。其條件為真並且輸入通道已經就緒的守衛是成功的。選擇一個成功的交替者(alternative)來執行,如果沒有成功者則等待;如果有多個成功,語言不明確規定會執行其中哪一個,這不同於選擇構造。例如:
ALT count1 < 100 & c1 ? data SEQ count1 := count1 + 1 merged ! data count2 < 100 & c2 ? data SEQ count2 := count2 + 1 merged ! data status ? request SEQ out ! count1 out ! count2
它將從通道c1或c2讀取資料(哪個就緒了都行)並把它傳遞到叫作合併的通道。如果countN達到100,從對應通道的讀取將停用。在叫作狀態的通道讀取要求,將通過輸出這些計數來回答。
PAR
並列(parallel)構造,開始一個可以被並行(concurrent)求值的表達式的列表。並列構造可溯源至Edsger W. Dijkstra在1965年提出的「協同順序行程」(cooperating sequential processes)[3],例如:
PAR p() q()
構造SEQ IF ALT PAR
,都是可以複製的。複製的PAR
的例子:
PAR farmer() PAR i = 0 FOR 4 worker(i)
它產生5個並行的求值,等價於:
PAR farmer() PAR worker(0) worker(1) worker(2) worker(3)