Andiamo alla scoperta delle specifiche del Whitespace, il linguaggio di programmazione minimalista messo a punto da Chris Morris ed Edwin Brady nel 2003.
Abbiamo a che fare con un linguaggio esoterico, il cui nome è dovuto al fatto che esso usa unicamente, come elementi sintattici, ritorni a capo, tabulazioni e spazi bianchi. Ciò significa che tutti gli altri caratteri non vengono considerati, e sono qualificati come un commento. Dal punto di vista tecnico, il linguaggio Whitespace include ventinove istruzioni che vengono suddivise in cinque categorie.
Alcune di queste istruzioni necessitano di un parametro, vale a dire un’etichetta o un numero. Prima di ogni istruzione, inoltre, è indispensabile porre il cosiddetto Instruction Modification Parameter (abbreviato nella sigla IMP), che non è altro che l’identificatore che segnala la categoria di appartenenza dell’istruzione.
Il carattere [Spazio] indica lo 0, mentre l’1 è indicato dal carattere [Tab]. Vale la pena di menzionare il fatto, inoltre, che i numeri sono rappresentati in formato binario (possono essere di qualsiasi lunghezza) attraverso la sequenza di [Tab] e [Spazio] conclusa con il [Ritorno a capo]. Il significato di [Spazio] è la manipolazione dello Stack, mentre quello di [Ritorno a capo] è Controllo di flusso.
Quando ci si riferisce alla manipolazione dello stack si parla dello stack di dati cui si può accedere attraverso quattro diverse istruzioni dell’Imp. Esse sono lo [Spazio], che mette in cima allo stack il numero passato come parametro, il [Tab][Spazio], che copia in cima allo stack l’ennesimo elemento dello stack, [Ritorno a capo][Spazio], che duplica il primo elemento dello stack, e infine [Ritorno a capo][Ritorno a capo], che elimina il primo elemento dello stack.
Occorre ricordare che l’etichetta è sempre indicata con una sequenza a piacere di [Tab] e [Spazio], mentre il segno del numero è indicato dal suo primo bit: 1 per negativo e 0 per positivo. L’IMP [Tab][Ritorno a capo] rappresenta l’I/O di periferiche, mentre l’accesso casuale alla memoria è gestito da [Tab][Tab].
Con Whitespace è possibile eseguire operazioni aritmetiche: [Spazio][Ritorno a capo] per la moltiplicazione, [Spazio][Tab] per la sottrazione, [Tab][Spazio] per la divisione e [Spazio][Spazio] per l’addizione.
Per l’accesso casuale alla memoria, l’istruzione [Spazio] memorizza un dato, mentre il recupero di un dato avviene con l’istruzione [Tab]: per recuperarlo è sufficiente posizionare sullo stack l’indirizzo in cui è stato memorizzato.
Concludiamo segnalando una curiosità: il linguaggio Whitespace è diventato famoso il primo aprile del 2003, quando venne descritto dai suoi inventori su Slashdot. Gli utenti ritennero che si trattasse di un Pesce d’aprile… ma si sbagliavano.