title: Whitespace
text: # Whitespace
  
  Il Whitespace è un linguaggio di programmazione esoterico e minimalista, creato nel 2003 da Edwin Brady e Chris Morris. Il nome deriva dal fatto che il linguaggio utilizza solo spazi bianchi, tabulazioni e ritorni a capo come elementi sintattici. Ogni carattere diverso da questi tre viene ignorato e considerato come un commento.
  
  Whitespace divenne famoso quando il suo inventore lo descrisse su Slashdot il primo di Aprile 2003; in questo modo gli utenti pensarono ad un Pesce d'aprile, ovviamente sbagliandosi.
  
  ## Istruzioni
  
  Whitespace comprende 29 istruzioni, divise in 5 categorie; prima di ogni istruzione bisogna inserire un identificatore che indica a quale categoria appartiene l'istruzione, detto Instruction Modification Parameter o IMP. Alcune istruzioni richiedono un parametro, che può essere un numero o un'etichetta.
  
  I numeri possono essere di qualsiasi lunghezza e sono rappresentati in formato binario tramite una sequenza di [Spazio] e [Tab], terminata con [Ritorno a capo]. Il carattere [Spazio] indica lo 0, il [Tab] indica l'1. Il primo bit del numero indica il segno di quest'ultimo, 0 per positivo e 1 per negativo.
  
  Un'etichetta è invece indicata con una sequenza di [Spazio] e [Tab] a piacere, terminata con [Ritorno a capo]; ogni nome di etichetta deve essere diverso da tutti gli altri.
  
  Gli IMP e le categorie associate ad essi sono:
  
  | IMP | Significato |
  | - | - |
  | [Spazio] | Manipolazione dello Stack |
  | [Tab][Spazio] | Operazioni aritmetiche |
  | [Tab][Tab] | Accesso casuale alla memoria |
  | [Ritorno a capo] | Controllo di flusso |
  | [Tab][Ritorno a capo] | I/O di periferiche |
  
  ### Manipolazione dello stack
  
  Whitespace è basato su uno stack di dati, accessibile tramite quattro istruzioni distinte dall'IMP [Spazio]:
  
  | Istruzione | Significato |
  | - | - |
  | [Spazio] | Mette il numero passato come parametro in cima allo stack |
  | [Ritorno a capo][Spazio] | Duplica il primo elemento dello stack |
  | [Tab][Spazio] | Copia l'n-esimo elemento dello stack (n è passato come parametro) in cima allo stack |
  | [Ritorno a capo][Tab] | Scambia i primi due elementi dello stack |
  | [Ritorno a capo][Ritorno a capo] | Elimina il primo elemento dello stack |
  | [Tab][Ritorno a capo] | Spinge n elementi fuori dallo stack (n è passato come parametro), mantenendo intatto il primo elemento |
  
  ### Operazioni aritmetiche
  
  Le istruzioni aritmetiche, distinte dall'IMP [Tab][Spazio], operano sui primi due elementi dello stack (il primo è considerato essere a sinistra dell'operatore, il secondo a destra), considerandoli numeri interi, e sostituiscono questi due valori con il risultato dell'operazione:
  
  | Istruzione | Significato |
  | - | - |
  | [Spazio][Spazio] | Addizione |
  | [Spazio][Tab] | Sottrazione |
  | [Spazio][Ritorno a capo] | Moltiplicazione |
  | [Tab][Spazio] | Divisione intera |
  | [Tab][Tab] | Modulo della divisione intera |
  
  ### Accesso casuale alla memoria
  
  Le istruzioni di accesso casuale alla memoria, contraddistinte dall'IMP [Tab][Tab], si occupano di trovare gli indirizzi di dati da memorizzare o recuperare. Per memorizzare un dato, occorre mettere sullo stack prima l'indirizzo, poi il valore del dato; per recuperarlo invece occorre mettere sullo stack l'indirizzo dove lo si è memorizzato:
  
  | Istruzione | Significato |
  | - | - |
  | [Spazio] | Memorizza un dato |
  | [Tab] | Recupera un dato |
  
  ### Controllo di flusso
  
  Il controllo del flusso del programma (IMP [Ritorno a capo]) è un'operazione frequente in Whitespace come in ogni linguaggio di programmazione; le posizioni delle procedure e dei bersagli dei salti condizionati sono indicati con etichette. I programmi devono terminare con l'istruzione [Ritorno a capo][Ritorno a capo][Ritorno a capo].
  
  | Istruzione | Significato |
  | - | - |
  | [Spazio][Spazio] | Dichiara un'etichetta con il nome passato come parametro |
  | [Spazio][Tab] | Chiama la procedura con il nome dato come parametro |
  | [Spazio][Ritorno a capo] | Salta all'etichetta passata come parametro |
  | [Tab][Spazio] | Salta all'etichetta passata come parametro se il valore in cima allo stack è pari a zero |
  | [Tab][Tab] | Salta all'etichetta passata come parametro se il valore in cima allo stack è negativo |
  | [Tab][Ritorno a capo] | Termina una procedura e riporta il controllo all'istruzione successiva alla chiamata |
  | [Ritorno a capo][Ritorno a capo] | Termina il programma |
  
  ### I/O
  
  Le istruzioni di Input/Output (IMP [Tab][Ritorno a capo]) vengono usate per interagire con l'utente; con esse si possono manipolare numeri interi o caratteri:
  
  | Istruzione | Significato |
  | - | - |
  | [Spazio][Spazio] | Esegue l'output del carattere in cima allo stack |
  | [Spazio][Tab] | Esegue l'output del numero in cima allo stack |
  | [Tab][Spazio] | Legge un carattere e lo memorizza all'indirizzo in cima allo stack |
  | [Tab][Tab] | Legge un numero e lo memorizza all'indirizzo in cima allo stack |
  
  ## Codice esempio
  
  Di seguito un programma che stampa la scritta "Hello World!". Da notare che i caratteri spazio sono stati colorati in modo differente perché altrimenti sarebbero risultati invisibili. (Spazio, Tab)
  
  