Brainfuck
Brainfuck (lett. "fottere il cervello") è un linguaggio di programmazione esoterico per computer, creato da Urban Müller intorno al 1993. Il linguaggio viene in taluni casi denominato Brainf*ck, Brainf*** o anche soltanto BF per evitare di offendere la sensibilità altrui. Struttura del linguaggioL'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 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 a 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 all'array (inizializzato per puntare al primo byte dell'array) e due stream di byte per l'input e l'output. IstruzioniLe istruzioni del linguaggio sono otto, ciascuna consiste in un singolo carattere e sono:
In alternativa, Una terza versione equivalente, scarsamente considerata, è: I sorgenti per Brainfuck possono essere transcodificati in C utilizzando la seguente tabella di sostituzione, assumendo che
EsempiHello world!Il seguente codice mostra "Hello world" sullo schermo e manda a capo il cursore ++++++++++
[
>+++++++>++++++++++>+++>+<<<<-
]
>++. Loop iniziale (dopo viene stampata una H)
>+. e
+++++++. l
. l
+++. o
>++.
<<+++++++++++++++.
>.
+++.
------.
--------.
>+.
>.
Per mantenere leggibile il listato, viene iniziata una nuova linea dopo ciascun punto, che rappresenta il comando di output. Le lettere H, e, l, l e o sono state inserite nel codice esclusivamente come commenti. Il Brainfuck considera tutti i caratteri a eccezione di Il loop sulla prima linea imposta il valore iniziale dell'array: La linea successiva sposta il puntatore all'array in alto di una posizione, poi aggiunge uno. Dal momento che la lettera 'l' è la settima lettera dopo la 'e', per mostrare la 'l'aggiungiamo sette ( 'o' è la terza lettera dopo la 'l', quindi incrementiamo tre volte il valore dell'array e mandiamo in output il risultato. La parte rimanente del programma prosegue esattamente come illustrato finora. Per lo spazio e la lettera maiuscola, vengono selezionati diversi puntatori, che sono poi incrementati o decrementati secondo necessità. SempliciLoop semplice,[.,]
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 Manipolazione dei puntatori>,[.>,]
Una versione dell'ultimo esempio che salva anche tutto l'input in un array per uso futuro, muovendo il puntatore ogni volta. Sommare[->+<]
Questo somma la locazione corrente (distruttivamente, essa viene messa a zero) alla locazione successiva. Istruzioni condizionali,----------[----------------------.,----------]
Questo esempio prenderà input scritti in minuscolo dalla tastiera e li farà diventare maiuscoli. Per uscire, premere il tasto invio. In primo luogo, inseriamo il primo carattere usando il comando Successivamente lo visualizzeremo. Ora inseriamo il prossimo carattere, e ancora sottraiamo 10. Se questo carattere fosse un linefeed, usciamo dal ciclo; altrimenti, ritorneremo all'inizio del ciclo, sottrarremo un altro 22, lo visualizzeremo, e così via. Quando usciamo dal ciclo, il programma termina, siccome non ci sono più comandi. Copiare un byteBrainfuck 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 [->+<]
Comunque, questo resetta il valore di [->+>+<<]
Possiamo prendere vantaggio di questo per ripristinare il valore [->+>+<<]>>[-<<+>>]
ComplessiSomma,>++++++[<-------->-],,[<+>-],<.>.
Questo programma aggiunge due numeri a singola cifra e visualizza il risultato correttamente se anch'esso è composto da una sola cifra: 4+3 7 (Ora le cose iniziano a diventare un po' più complicate. Noi possiamo riferirci ai byte nell'array come Il primo numero è inserito in Il ciclo successivo Poi il puntatore viene spostato indietro a Moltiplicazione,>,,>++++++++[<------<------>>-]
<<[>[>+>+<<-]>>[<<+>>-]<<<-]
>>>++++++[<++++++++>-],<.>.
Come il precedente esempio, ma esegue la moltiplicazione, non l'addizione. Il primo numero è inserito in Ora entriamo nel ciclo principale della moltiplicazione. L'idea base è che ogni volta attraverso esso noi sottraiamo uno da Ora aggiungiamo 48 al prodotto, inseriamo un risultato in Linguaggi di programmazione similiUna lista di linguaggi simili:
Voci correlateAltri progetti
Collegamenti esterni
|
Portal di Ensiklopedia Dunia