# Occam (linguaggio di programmazione)

occam è un linguaggio di programmazione per architetture parallele sviluppato dalla INMOS per la programmazione di reti di INMOS Transputer e successivamente implementato anche per altre piattaforme. Il nome si riferisce al principio del rasoio di Occam: nella progettazione del linguaggio, la Inmos si è limitata a un insieme minimo di costrutti, evitando di introdurre ciò che non pareva "strettamente necessario" per gli scopi del linguaggio. In effetti occam si può anche descrivere come un linguaggio di programmazione relativamente a basso livello, quasi una sorta di assembly. Il modello a cui il linguaggio si ispira sono i Communicating Sequential Processes (CSP) descritti da C. A. R. Hoare nel celebre libro omonimo.

## Panoramica del linguaggio
### Canali

La comunicazione fra processi avviene attraverso canali dotati di nome. Un processo invia dati su un canale attraverso l'operatore ! e legge da un canale con ?. Questi operatori hanno una semantica basata sul rendezvous, ovvero un processo che tenti di inviare o ricevere dati su un canale rimarrà sospeso finché un altro processo non diventa disponibile a eseguire l'operazione complementare (cioè a ricevere o inviare) su quello stesso canale. Sintatticamente, output e input assumono la seguente forma (c è una variabile):
Si noti che in tutti gli esempi di codice riportati in questo articolo (a differenza di quanto ci si aspetterebbe da un linguaggio ad alto livello) l'indentazione e l'uso di spazi bianchi sono significativi (altri linguaggi hanno questa caratteristica; alcuni esempi sono Python, Haskell e ABC).

### Strutture di controllo

Le strutture di controllo di occam sono ispirate a quelle della programmazione strutturata, ma reinterpretate ed estese nel contesto della programmazione parallela. La struttura di controllo SEQ introduce una lista di istruzioni che vengono eseguite in sequenza (nella maggior parte dei linguaggi strutturati, questa modalità di esecuzione è implicita):
Come si può facilmente immaginare, := è l'operatore di assegnamento.
La struttura di controllo PAR specifica invece che le successive istruzioni devono essere eseguite in parallelo (contemporaneamente)
Il PAR ammette anche una forma più complessa che presenta alcune analogie con un ciclo for, e viene coerentemente indicata con le parole chiave PAR-FOR. Il seguente frammento di codice acquisisce un dato intero da quattro canali in parallelo.
L'analogia con il "ciclo for" riguarda l'uso del "contatore" i. Come un ciclo for tradizionale, il frammento di codice riportato esegue le operazioni indicate cinque volte, "per i che va da 0 a 4"; tuttavia, le cinque operazioni di input non sono svolte sequenzialmente, bensì in parallelo.
La struttura di controllo ALT realizza il concetto di comando con guardia dei CSP. Una guardia è una combinazione di una condizione booleana e una istruzione di input/output (entrambi gli elementi sono opzionali). Una guardia "ha successo" se la sua condizione booleana è vera e la sua istruzione di input è "pronta" (ovvero c'è già un altro processo disponibile al rendezvous, cioè a inviare il dato richiesto o ricevere il dato inviato). A ciascuna guardia è associata una istruzione che può essere eseguita se la guardia ha successo:
Quando l'istruzione composta ALT viene raggiunta dal flusso del programma, le guardie vengono valutate. Se più di una ha successo, una di esse viene scelta (arbitrariamente) e la corrispondente istruzione viene eseguita.

## Occam 2

occam 2 è una estensione di occam realizzata da INMOS nel 1987. In pratica, occam 2 si può considerare come la prima versione "utilizzabile" del linguaggio, mentre la prima versione aveva più la connotazione di prototipo. Fra le principali aggiunte di occam 2 ci sono un sistema di tipi più ricco (con numeri in virgola mobile, caratteri, numeri interi di diverse dimensioni) e le subroutine ("funzioni").

## Occam 2.1

occam 2.1 è la seconda estensione del linguaggio, sviluppata da INMOS nel 1995. A dispetto del nome (che secondo le convenzioni normali indicherebbe modifiche "minori"), occam 2.1 introduce numerose e rilevanti novità, fra cui:
* possibilità di dare nomi definiti dal programmatore ai tipi;
* record
* nuovi operatori (p. es. BYTESIN)
* possibilità di definire array di canali (questa caratteristica è stata usata negli esempi riportati sopra)
* possibilità di includere gli array come tipo restituito delle funzioni
Per una lista completa delle caratteristiche di occam 2.1, che a oggi è la versione "definitiva" del linguaggio, vedi il manuale di riferimento.

## Altre versioni

La INMOS ha prodotto le specifiche per una nuova versione di occam (occam 3), disponibili in linea, ma non sono state realizzate implementazioni del linguaggio. Alcune delle innovazioni di occam 3 sono state incluse in un compilatore per occam 2.1 sviluppato da un team indipendente noto come team KRoC, dall'acronimo con cui è noto il compilatore: Kent Retargettable Occam compiler. Il linguaggio compilato da KRoC fu poi informalmente ribattezzato come occam 2.5, numero di versione che vorrebbe indicare il fatto che il linguaggio è in qualche modo "a metà strada" fra occam 2 e occam 3.