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 < 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å ,  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)

occam