Differenze tra le versioni di "Brainfuck"

nessun oggetto della modifica
Etichetta: Sequenze di caratteri ripetuti da parte di un nuovo utente o IP
 
L'obiettivo di Müller era di creare un semplice linguaggio di programmazione completo per una [[macchina di Turing]] che potesse essere implementato con il [[compilatore]] più piccolo possibile. Il linguaggio consiste di otto istruzioni. La versione 2 del compilatore originale, scritta per il [[68k|68000]] dell'[[Amiga]], occupa soltanto 240 [[byte]]. È stato ispirato dal linguaggio [[FALSE]], un altro [[linguaggio di programmazione esoterico]], il cui compilatore occupava 1024 byte.
 
Come il nome suggerisce, i programmi scritti in Brainfuck tendono ad essere difficili da comprendere. Tuttavia Brainfuck è un linguaggio Turing-completo, e si può utilizzare per implementare qualunque algoritmo eseguibile con una [[macchina di Turing]]. Trascurando l'enorme difficoltà nella programmazione di certi algoritmi con Brainfuck, è certamente possibile scrivere il relativo codice.
 
Il linguaggio è basato su un modello molto semplice consistente in un array di byte inizializzato a zero, un [[puntatore (programmazione)|puntatore]] all'array (inizializzato per puntare al primo byte dell'array) e due [[Stream (informatica)|stream]] di byte per l'input e l'output.
++++++++++
<nowiki>[</nowiki>
>+++++++>++++++++++>+++>+<<<<-
<nowiki>]</nowiki>
>++. Loop iniziale (dopo viene stampata una H)
,[.,]
 
Un ciclo continuo che prende del testo in input dalla tastiera e lo scrive sullo schermo. Da notare che si assume che la cella sia impostata a 0 quando un comando '<code>,</code>' viene eseguito dopo la fine dell'input (alle volte chiamata end-of-file o "EOF"); le implementazioni differiscono in questo punto. Per implementazioni che impostano la cella a -1 o EOF, oppure che non modificano il valore della cella, questo programma andrebbe scritto rispettivamente "<code>,+[-.,+]</code>" o "<code>,[.[-],]</code>"
 
==== Manipolazione dei puntatori ====
==== Copiare un [[byte]] ====
 
Brainfuck non include nessuna operazione per copiare byte. Questo deve essere fatto con i costrutti di ciclo e gli operatori aritmetici. Muovere un byte è abbastanza semplice; muovere il valore di [0] a [1] può essere fatto come segue:
 
[->+<]
(Ora le cose iniziano a diventare un po' più complicate. Noi possiamo riferirci ai byte nell'array come [0], [1], [2], e così via.)
 
Il primo numero è inserito in [0], e gli si sottrae 48 per ottenere la cifra corrispondente (i codici ASCII per i numeri da 0 a 9 sono infatti quelli da 48 a 57). Questo è fatto mettendo un 6 in [1] ed usando un ciclo per sottrarre 8 da [0] il numero corrispondente di volte. (Questo è un metodo comune di sommare o sottrarre grandi numeri) Successivamente, si inserisce il segno di somma in [1]; si inserisce infine il secondo numero, sovrascrivendo il simbolo di somma.
 
Il ciclo successivo <code>[<+>-]</code> fa il vero lavoro, muovendo il secondo numero sopra il primo, sommandoli insieme ed azzerando [1]. A ogni loop, esso aggiunge uno a [0] e sottrae uno da 1; così [1] viene alla fine azzerato, e la quantità aggiunta a [0] è esattamente quella rimossa da [1]. Viene quindi inserito un valore di ritorno in [1]. (Non stiamo controllando possibili errori sull'input.)
Utente anonimo