Occam

occam，一種并发程式語言，主要基於通信顺序进程的程式代數，以及它的許多特色而實作。它的名稱來自於奥卡姆的威廉提出的奥卡姆剃刀（Occam's razor）原則。

occam是一種類似於Pascal的指令式过程式編程語言。這個語言於1983年出現，由英國計算機科學家，以及公司的科學家，在東尼·霍爾提供顧問意見後，共同研發而成。

概述
在下列例子中，缩进和格式对于分析代码是关键性的：表达式以行结束来终止，表达式的列表需要在缩进的相同水平上。这个特征叫做越位规则，也能在其他语言比如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年提出的守卫命令语言，是一个布尔条件和一个输入表达式的组合（二者都是可选的）。其条件为真并且输入通道已经就绪的守卫是成功的。选择一个成功的交替者（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），例如：

  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)

参见
XC (编程语言)，它基于occam但具有C风格语法。
Handel-C
并发编程语言

引用

延伸阅读

外部链接 
 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.

并发编程语言
过程式编程语言
1983年建立的程式語言