Brainfuck JS (interpreter & debugger)
7 03 2008Negli ultimi giorni mi sono dilettato con il linguaggio di programmazione più “esoterico” e minimale che esista, il Brainfuck. Ho creato un piccolo IDE in Javascript che gira su Firefox e Safari con le seguenti caratteristiche:
-
interprete di Brainfuck
-
debugger con play/pause/stop/step-by-step
-
inserimento di breakpoint
-
numerosi programmi già pronti di esempio
-
esecuzione in pseudo-thread che non blocca il browser in caso di cicli infiniti
Apri Brainfuck JS (interpreter & debugger)
++[>+++++++++++++++++++++++<-] ><+++[>++++++++++++++++++++++++<-] >+. . . <+++[>------------------------<-] >-. <+++++++++++++++++++++++++++++++[>++<-] >. <++[>+<-] >+. <++[>+<-] >+. <+++++++[>--<-] >. <++[>-<-] >-. <+++++[>++<-] >+. <+++[>---<-] >. <+++[>++++<-] >. <++[>-<-] >-. <+++++++++++++++++++++++++++++++[>--<-] >. <+++++++++++++[>++++<-] >+. <+++[>++++<-] >. <+[>-<-] >-.
Da wikipedia:
Brainfuck è un linguaggio di programmazione per computer, di tipo minimalista, creato da Urban Müller intorno al 1993. […] 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 l’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 all’array (inizializzato per puntare al primo byte dell’array) e due stream di byte per l’input e l’output.
Istruzioni
Le istruzioni del linguaggio sono otto, ciascuna consiste in un singolo carattere e sono:
Carattere Significato > incrementa il puntatore < decrementa il puntatore + incrementa il byte al puntatore - decrementa il byte al puntatore . output dal byte al puntatore (ASCII) , input al byte al puntatore (ASCII) [ salta in avanti all’istruzione dopo il corrispondente ] se il byte al puntatore è zero ] salta indietro all’istruzione dopo il corrispondente [ se il byte al puntatore non è zero
Il mio interprete

Ho creato un interprete scritto in Javascript che è in grado di eseguire qualsiasi programma scritto in Brainfuck, e addirittura di debuggarlo step-by-step. Diversamente da altri interpreti scritti in giro il mio esegue il programma Brainfuck in uno pseudo thread in javascript, in questo modo si possono eseguire tranquillamente programmi molto lunghi o addirittura cicli infiniti senza bloccare definitivamente il browser. Con un apposito pulsante si può bloccare l’esecuzione del programma in brainfuck ed evitare blocchi disastrosi.
Il mio debugger
E’ possibile attivare il debugger ed eseguire il proprio programma in Brainfuck in modalità rallentata, metterlo in pausa, ed avanzare di un istruzione alla volta (step-by-step). Inoltre con il carattere # si possono impostare dei breakpoint, che fermano l’esecuzione in quel punto per poi proseguire di un passo alla volta. Nel pannello di debug viene visualizzato il buffer del programma e la posizione del puntatore, mentre nel codice sorgente viene evidenziata il punto di esecuzione corrente.

Programmi Brainfuck di esempio
Sono già preparati (caricabili in un sol colpo di mouse) parecchi programmi Brainfuck, tra cui: Hello world!, Addition, Multiplication, Division, Uppercase a string, Brainfuck to C translator, Brainfuck interpreter, Factorial, Number graphic display, Square numbers from 1 to 10000, ecc
L’interprete Brainfuck scritto in Brainfuck
Incredibile ma vero (e soprattutto: funziona sul serio!): tra gli esempi proposti c’è anche Brainfuck interpreter, che è un programma scritto in Brainfuck che riesce a interpretare ed eseguire un altro programma in brainfuck passato come stringa di input…





