Occam

**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 
* 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å «[[:en:Occam (programming language)|Occam (programming language)]]» frå ,  den 27. mars 2006.*  

## Bakgrunnsstoff
* The occam Archive 
* WoTUG: occam (Informasjon og realisering)
* The Transterpreter, ei virtuell occam-maskin 
* KRoC - Kent Retargettable occam Compiler
* occam «tutorial» 
* Internet Parallel Computing Archive: occam (Documentasjon og realiseringar, men som ikkje lenger vert haldne ved like)