occam

维基百科,自由的百科全书
跳转到导航 跳转到搜索
occam
File:1983 1988 Trademark occam and occam 2 INMOS Limited.jpg
编程范型指令式, 过程式, 并发
设计者David May英语David May (computer scientist)
实现者Inmos英语Inmos
发行时间1983年,​43年前​(1983
当前版本
    Module:EditAtWikidata第29行Lua错误:attempt to index field 'wikibase' (a nil value)
    网站{{URL|example.com|可选的显示文本}}Module:EditAtWikidata第29行Lua错误:attempt to index field 'wikibase' (a nil value)
    派生副语言
    occam-π英语occam-π
    受影响于
    通信顺序进程
    影响语言
    Ease英语Ease (programming language), Go, Handel-C

    occam,一种并发编程语言,主要基于通信顺序进程程序代数[1],以及它的许多特色而实现。它的名称来自于奥卡姆的威廉提出的奥卡姆剃刀(Occam's razor)原则。

    occam是一种类似于Pascal的指令式过程式编程语言。这个语言于1983年出现,由英国计算机科学家David May英语David May (computer scientist),以及Inmos英语Inmos公司的科学家,在东尼·霍尔提供顾问意见后,共同研发而成。

    概述[编辑]

    在下列例子中,缩进和格式对于分析代码是关键性的:表达式以行结束来终止,表达式的列表需要在缩进的相同水平上。这个特征叫做越位规则,也能在其他语言比如HaskellPython中见到。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 (formal language theory)(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
    

    它将从通道c1c2读取数据(哪个就绪了都行)并把它传递到叫作merged的通道。如果countN达到100,从对应通道的读取将停用。在叫作状态的通道读取要求,将通过输出这些计数来回答。

    并行[编辑]

    PAR 并行(parallel)构造,开始一个可以被并发(concurrent)求值的表达式的列表。并行构造可溯源至Edsger W. Dijkstra在1965年提出的“协同顺序进程”(cooperating sequential processes)[3],例如:

     PAR
       p()
       q()
    

    复制[编辑]

    构造SEQ IF ALT PAR,都是可以通过FOR复制英语Replication (computing)的(replicated)。复制的PAR的例子:

     PAR
       farmer()
       PAR i = 0 FOR 4
         worker(i)
    

    它产生5个并发的求值,等价于:

     PAR
       farmer()
       PAR
         worker(0)
         worker(1)
         worker(2)
         worker(3)
    

    参见[编辑]

    引用[编辑]

    1. ^ 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
    2. ^ 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. 
    3. ^ Edsger W. Dijkstra, Cooperating sequential processes页面存档备份,存于互联网档案馆).January 1965.Technical Report EWD-123.
    4. ^ Barnes, Fred; Welch, Peter. occam-pi: Blending the best of CSP and the pi-calculus. 2006-01-14 [2006-11-24]. 

    延伸阅读[编辑]

    • Roscoe, Andrew William; Hoare, Charles Antony Richard. The Laws of Occam Programming. Programming Research Group, Oxford University. 1986 [2020-05-05]. (原始内容存档于2012-12-07). Abstract. One of the attractive features of occam is the large number of memorable algebraic laws which exist relating programs. We investigate these laws and, by discovering a normal form for WHILE-free programs, show that they completely characterise the language's semantics. 

    外部链接[编辑]

    本条目部分或全部内容出自以GFDL授权发布的《自由在线电脑词典》(FOLDOC)。