Supercomputer/Occam
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
modificaCanali
modificaLa 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):
canale1 ? c canale2 ! c
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 è significativo.
Strutture di controllo
modificaLe 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):
SEQ x := x + 1 y := x * x
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)
PAR x := x + 1 y := y * 2
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 acquisce un dato intero da quattro canali in parallelo.
PAR i=0 FOR 4 INT n c[i] ? n[i]
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:
ALT count1 < 100 & c1 ? data SEQ count1 := count1 + 1 merged ! data count2 < 100 & c2 ? data SEQ count2 := count2 + 1 merged ! data status ? request SEQ out ! count1 out ! count2
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
modificaOccam 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 versione precedente 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
modificaOccam 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 tornato delle funzioni
Per una lista completa delle caratteristiche di Occam 2.1, che a oggi è la versione "definitiva" del linguaggio, ved il Manuale di riferimento.