**Occam** er eit programmeringsspråk som er spesielt utvikla for å uttrykkje parallellitet. Occam byggjer på same formalisme som Communicating Sequential Processes (CSP). Occam (occam vert som regel skive med liten «o», i alle fall midt i ei setning) er oppattkalla etter filosofen William of Ockham, som er best kjent for (Ockham sin barberkniv). 

Occam er eit imperativt programmeringsspråk, med ein stor grad av ortogonalitet og ein enkel Algol/Pascal-liknande syntaks. Occam vart utvikla av det engelske firmaet Inmos for å nyttast saman med ein noko spesiell mikroprosessor kalla Transputer.

Oversyn
-------

Rett innrykksnivå og formatering er kritisk for «parsinga» av occam. Tilordningar vert ikkje avslutta med spesielle tegn, som til dømes «;», men ved at linja tek slutt, lister av tilordningar må ha same innrykksnivå (akkurat som i Pyton, Haskel, Icon, Miranda og ABC). 

Eit occam-program vil ha fleire prosessar (som i denne samanheng er sekvensiell kode). Dei ymse prosessane kommuniserer med kvarandre vis namngjevne blokkerande kanalar. Ein prosess sender data ut på ein kanal via «!». Prosessen kjem ikkje vidare før ein annan prosess les inn via «?» det som vart sendt ut. Ein prosessen som les inn data frå ein kanal (via «?») vert òg blokkert og kjem ikkje vidare før ein annan kanal sender data ut på kanalen (via «!». Døme («keyboard» og «screen» er kanalar, medan «c» er ein variabel):

```
 keyboard ? c
 screen ! c
```

Kodeordet «SEQ» markerer starten på ei liste med sekvensielle tilordningar. Døme:

```
 SEQ
   x := x + 1
   y := x * x
```

Kodeordet «PAR» markerer starten på ei liste med prosessar som *kan* utførast i parallell (samtidig). Døme («p1()» og «p2()» er sekvensielle prosessar):

```
 PAR
   p1()
   p2()
```

Kodeordet «ALT» markerer starten på ei liste av «vakta» kommandoar. Desse vaktene er kombinasjonar av boolske føresetnadar og kanalinnlesingar (begger er opsjonale). Kvar vakt som er sann og som kan lesa frå kanalen vil «lukkast» og den etterfølgjande kodeblokka vil verta utført. Om fleire alternativ lukkast samstundes er det tilfeldig kva alternativ som vert utført. Døme: 

```
 ALT
   tellar1 < 100 & c1 ? data
     SEQ
       tellar1 := tellar1 + 1
       blanda ! data
   tellar2 < 100 & c2 ? data
     SEQ
       tellar2 := tellar2 + 1
       blanda ! data
   status ? request
     SEQ
       ut !  tellar1
       ut !  tellar2
```

Denne koden vil lese inn data frå kanalane «c1» og «c2» (når ein av dei, eller begge, er klar) og sende den ut på kanalen «blanda». Om ein av variablane «tellar1» eller «tellar2» får verdien 100, vil vakta blokkere for at det vert lese meir data frå kanalen som vart vakta. Ein førespurnad på kanalen «status» vert svara med å sende variablane «tellar1» og «tellar2» ut på kanalen «ut».

Versjonar
---------

#### Occam 1 (proto occam)

Occam 1 (som kom i 1983) var ein prototypeversjon. Denne versjonen hadde berre ein datatype, VAR, som var eit heiltat av same ordlengd som prosessoren som køyrde koden. Berre eindimensjonale tabellar var tilgjengelege. Occam 1 vart berre nytta av Inmos og academiske miljø som studerte parallellprosessering. 

#### Occam 2

Occam 2, som kom i 1987, var ein forbetra versjon av occam 1. Occam 2 hadde flytkommaaritmetikk, funksjonar, multidimensjonale tabellar og fleire heiltalstypar: INT, INT16, INT32 og Byte. Occam 2 var nok utvikla til at det kunne nyttast for praktiske programmeringsoppgåver. 

#### Occam 2.1

Occam 2.1, som kom i 1988, var ein etter måten omfattande revisjon av occam 2. Dette var den siste revisjonen som Inmos stod for. Mellom forbetringane kan ein nemna: 

* Namngjevne datatypar (DATA TYPE x IS y)
* Namngjevne register
* Pakka register
* Meir fleksibel typekonvertering
* Nye operatorar, som til dømes BYTESIN
* Kanal-typetying (retyping)
* Kanal-tabellar
* Funksjonar kunne returnere tabellar (av fast lengd)

#### Occam 3

Occam 3 vart definert av ein av dei mest erfarne programmerarane hjå Inmos. Spesifikasjonen vart distribuert for kommentering i miljøet, men på grunn av finansielle problem hjå Inmos vart det ikkje lage nokon kompilator for denne versjonen. Occam 3 hadde mange endringar, som i stor grad gjekk ut på å gjera språket betre for simulering og gjera det enklare å få til kodedeling og gjenbruk. 

#### Occam 2.5 (occam-pi)

Occam 2.5 refererer til ein forbetra versjon av occam 2.1, realisert i form av den sokalla «Kent Retargettable occam Compiler» (KroC). Denne versjonen tek opp i seg mange av forbetringane i spesifikasjonen til occam 3. Som døme på forbetringar i høve til occam 2.1 kan ein namna:

* Fletta protokollar
* Prosess-oppretting medan programmet køyrer
* Mobile kanalar, data og prosessar
* Rekursion
* Protokoll-arv
* Tabell-konstruktørar
* Utvida møte (rendezvous)

KroC-lompilatoren er tilgjengeleg for nedlasting frå nettsida til KroC-gruppa. På grunn av at språket nyttar idear frå pi-kalkulaus har namnet i ettertid vorte endra til occam-pi.

Kjelder
-------

* *Denne artikkelen bygger på «Occam (programming language)» frå Wikipedia på engelsk, den 27. mars 2006.*

Bakgrunnsstoff
--------------

* The occam Archive Arkivert 2005-10-28 ved Wayback Machine.
* WoTUG: occam (Informasjon og realisering)
* The Transterpreter, ei virtuell occam-maskin Arkivert 2017-03-03 ved Wayback Machine.
* KRoC - Kent Retargettable occam Compiler
* occam «tutorial» Arkivert 2005-04-04 ved Wayback Machine.
* Internet Parallel Computing Archive: occam (Documentasjon og realiseringar, men som ikkje lenger vert haldne ved like)