.NH
Introduction
.PP
Occam [1] is a programming language which is based on the concepts of
concurrency and communication. These concepts enable today's applications of
microprocessors and computers to be implemented more effectively. 
.PP
An Occam program consists of a (dynamically determined) number
of processes communicating through channels.
To communicate with the outside world some predefined channels are needed.
A channel has only one writer and one reader; it carries machine words and
bytes, at the reader/writer's discretion. The process with its communication
in Occam replaces the procedure with parameters in other languages (there are
no procedures in Occam).
.PP
In addition to the normal assignment statement, Occam has two more
information-transfer statements, the input and the output:
.DS
.ft CW
	chan1 ? x        -- reads a value from chan1 into x
	chan2 ! x        -- writes the value of x onto chan2
.ft
.DE
Both the outputting and the inputting processes wait until the other is there.
Channels are declared and given names. Arrays of channels are possible.
.PP
Processes come in 5 varieties: sequential, parallel, alternative,
conditional and repetitive. A process starts with a reserved word telling
its nature, followed by an indented list of other processes. (Indentation
is used to indicate block structure.) It may be preceded by declarations.
The processes in a sequential/parallel process are executed sequentially/in
parallel. The processes in an alternative process have guards based on the
availability of input; the first to be ready is executed (this is waiting
for multiple input). The conditional and repetitive processes are normal
\fBIF\fPs and \fBWHILE\fPs.
.PP
\fIProducer-consumer example:\fP
.DS
.ft CW
.nf
CHAN buffer:                    -- declares the channel buffer
PAR
  WHILE TRUE                    -- the producer
    VAR x:                      -- a local variable
    SEQ
      produce(x)                -- in some way
      buffer ! x                -- and send it
  WHILE TRUE                    -- the consumer
    VAR x:
    SEQ
      buffer ? x                -- get a value
      consume(x)                -- in some way
.ft
.fi
.DE
.bp
.PP
Processes can be replicated from a given template; this combines
with arrays of variables and/or channels.
.PP
\fIExample: 20 window-sorters in series:\fP
.DS
.ft CW
.nf
CHAN s[20]:                     -- 20 channels
PAR i = [ 0 FOR 19 ]            -- 19 processes
  WHILE TRUE
    VAR v1, v2:
    SEQ
      s[i] ? v1; v2             -- wait for 2 variables from s[i]
      IF
        v1 <= v2                -- ok
          s[i+1] ! v1; v2
        v1 > v2                 -- reorder
          s[i+1] ! v2; v1
.fi
.ft
.DE
.PP
A process may wait for a condition, which must include a comparison
with \fBNOW\fP, the present clock value.
.PP
Processes may be distributed over several processors; all processes
under a \fBVAR\fP declaration must run on the same processor. Concurrency can be
improved by avoiding \fBVAR\fP declarations, and replacing them by \fBCHAN\fP
declarations. Processes can be allocated explicitly on named processors and
channels can be connected to physical ports.
