Whitespace

Da Wikipedia, l'enciclopedia libera.

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[modifica | modifica sorgente]

Il 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[modifica | modifica sorgente]

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[modifica | modifica sorgente]

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[modifica | modifica sorgente]

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[modifica | modifica sorgente]

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 è negativo
[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[modifica | modifica sorgente]

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[modifica | modifica sorgente]

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)

   
   	  	   
		    	
   		  	 	
		    	 
   		 		  
		    		
   		 		  
		    
	  
   		 				
		    	 	
   	 		  
		    		 
   	     
		    			
   			 			
		  
  	   
   		 				
		    	  	
   			  	 
		    	 	 
   		 		  
		    	 		
   		  
	  
		    		  
   	    	
		    		 	
   		 	
		    			 
   	 	 
		    				
    
	
	     
empty-line
    	
empty-line
 			 
empty-line
	  	 
	
     	
	   
empty-line
  	
empty-line
   	 
empty-line
empty-line/EOF

Collegamenti esterni[modifica | modifica sorgente]