简介
提示:此条目的主题不是OCaml。 occam编程范型指令式, 过程式, 并发设计者David May(英语:David May (computer scientist))实现者Inmos(英语:Inmos)发行时间1983年,40年前(1983)派生副语言occam-π(英语:occam-π)启发语言通信顺序进程影响语言Ease(英语:Ease (programming language)), Go, Handel-C, XCoccam,一种并发编程语言,主要基于通信顺序进程的程序代数,以及它的许多特色而实现。它的名称来自于奥卡姆的威廉提出的奥卡姆剃刀(Occam’s razor)原则。occam是一种类似于Pascal的指令式过程式编程语言。这个语言于1983年出现,由英国计算机科学家David May(英语:David May (computer scientist)),以及Inmos(英语: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 (formal language theory))(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)