title: COW (linguaggio di programmazione)
text: # COW (linguaggio di programmazione)
  
  COW è un linguaggio di programmazione esoterico, creato all'inizio del 2003 da Alex van Oostenrijk e Martijn van Beek. Esso utilizza un set di undici istruzioni, composta dalle lettere M e O. Le istruzioni del linguaggio sono case-sensitive.
  
  ## Struttura del linguaggio
  
  Il linguaggio è strutturato come la macchina di Turing (Turing equivalente): esso fornisce un vettore di numeri interi e delle istruzioni per spostarsi e modificare i valori contenuti. Inoltre mette a disposizione un registro temporaneo in grado di contenere un numero intero.
  
  Come condizione iniziale avremo un puntatore che punta alla prima cella: la posizione 0, e un numero potenzialmente infinito di celle. All'interno di ogni cella è contenuto inizialmente il valore 0.
  
  ## Istruzioni
  
  Le istruzioni del linguaggio sono undici, ciascuna consiste in tre caratteri e sono:
  
  | Codice | Istruzione | Significato |
  | - | - | - |
  | 0 | moo | Questo comando è connesso al comando MOO. Quando viene incontrato questa istruzione durante la normale esecuzione, l'interprete ricerca il comando MOO senza eseguire le istruzioni che incontra, ed esegue l'istruzione successiva al MOO trovato. (Vedi MOO) |
  | 1 | moO | Incrementa il puntatore |
  | 2 | mOo | Decrementa il puntatore |
  | 3 | mOO | Esegue l'istruzione con codice dell'istruzione uguale al contenuto della cella corrente. Se la cella contiene il valore 3 è non valido, perché si incorrerebbe in un ciclo infinito. |
  | 4 | Moo | Se il valore della cella corrente è 0, allora legge un singolo carattere ASCII dalla tastiera (più precisamente standard input) e lo salva nella cella corrente. Se invece la cella non contiene 0, allora stampa a video (standard output) il carattere ASCII corrispondente. |
  | 5 | MoO | Incrementa il valore della cella di 1 |
  | 6 | MOo | Decrementa il valore della cella di 1 (le istruzioni 5 e 6 prima erano invertite, cfr pagina del creatore di COW) |
  | 7 | MOO | Se il contenuto della cella è 0, allora torna alla chiamata effettuata con il comando moo. Se invece il valore della cella non è 0, allora continua con l'istruzione successiva. |
  | 8 | OOO | Imposta il valore della cella a 0 |
  | 9 | MMM | Se non c'è nessun valore nel registro, allora copia al suo interno il valore corrente della cella. Se invece c'è un valore, incolla tale valore nella cella corrente e svuota il registro. |
  | 10 | OOM | Stampa a video (più precisamente nello standard output) il valore della cella come numero intero |
  | 11 | oom | Legge un numero intero da tastiera (più precisamente dallo standard input) e lo salva nella cella corrente |
  
  ## Esempi
  
  MoO moO MoO mOo MOO OOM MMM moO moO MMM mOo mOo moO MMM mOo MmM mom moO MOO MOo mOo MoO moO moo mOo mOo moo
  
  