occam
occam,一種並發程式語言,主要基於通信順序進程的程式代數[1],以及它的許多特色而實作。它的名稱來自於奧卡姆的威廉提出的奧卡姆剃刀(Occam's razor)原則。
編程範型 | 指令式, 過程式, 並發 |
---|---|
設計者 | David May |
實作者 | Inmos |
面市時間 | 1983年 |
衍生副語言 | |
occam-π | |
啟發語言 | |
通信順序進程 | |
影響語言 | |
Ease, Go, Handel-C, XC |
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
順序構造,介入要被順序求值的表達式的一個列表。順序執行不是隱含的,大多數其他語言無這種顯式構造。例如:
SEQ x := x + 1 y := x * x
ALT
編輯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
編輯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)
參見
編輯引用
編輯- ^ occam 2.1 Reference Manual (PDF). SGS-Thomson Microelectronics Ltd. 1995-05-12 [2020-05-05]. (原始內容存檔 (PDF)於2020-08-01). Inmos document 72 occ 45 03
- ^ Edsger W. Dijkstra, Guarded commands, nondeterminacy and formal derivation of programs. (頁面存檔備份,存於網際網路檔案館) August 1975. Communications of the ACM.
Dijkstra, Edsger W. A Discipline of Programming. Prentice Hall. 1976. ISBN 978-0132158718. - ^ Edsger W. Dijkstra, Cooperating sequential processes (頁面存檔備份,存於網際網路檔案館).January 1965.Technical Report EWD-123.
延伸閱讀
編輯- Roscoe, Andrew William; Hoare, Charles Antony Richard. The Laws of Occam Programming. Programming Research Group, Oxford University. 1986 [2020-05-05]. (原始內容存檔於2012-12-07).
外部連結
編輯- Information, compilers, editors and utilities at the WoTUG occam pages(頁面存檔備份,存於網際網路檔案館)
- Compilers, documentation, examples, projects and utilities at the Internet Parallel Computing Archive(頁面存檔備份,存於網際網路檔案館) (no longer maintained)
- Occam books on Transputer.net(頁面存檔備份,存於網際網路檔案館)
- The occam-pi language(頁面存檔備份,存於網際網路檔案館).
- Tock occam compiler(頁面存檔備份,存於網際網路檔案館) – (translator from occam to C from Kent) a Haskell-based compiler for occam and related languages.