88 lines
3.1 KiB
Plaintext
88 lines
3.1 KiB
Plaintext
.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.
|