Brainfuck Compiler

Brainfuck

Brainfuck é uma linguagem de programação. Assim como C, Pascal ou Java, ela é genérica, capaz de rodar qualquer programa computável, já que é equivalente a uma máquina de Turing. Entretanto, Brainfuck tem apenas oito símbolos válidos, o que a torna possivelmente a linguagem de programação mais concisa que existe.

A linguagem possui uma única variável: o Ponteiro. Ele pode se deslocar sobre um array que inicialmente é todo zerado. Brainfuck pode mover o Ponteiro para frente ou para trás, incrementar ou decrementar o conteúdo apontado pelo Ponteiro, ler no stdin ou escrever no stdout, e fazer loops. A tabela abaixo mostra a correspondência entre os oito comandos do Brainfuck e a linguagem C.

>  p++;
<  p--;
+  (*p)++;
-  (*p)--;
.  putchar(*p);
,  *p=getchar();
[  while(*p){
]  }

Tarefas simples como somar dois números podem ser desafiadoras em Brainfuck, veja abaixo o exemplo, que lê dois caracteres do teclado, e escreve no vídeo a soma deles. Apesar de permitir a construção de qualquer tipo de programa, ninguém disse que isso seria fácil!

,>,<[->+<]>.

Mesmo o simples "Hello World" fica bastante obscuro:

>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.
+++++++..+++.[-]>++++++++[<++++>-]<.>+++++++++++
[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.
[-]>++++++++[<++++>-]<+.[-]++++++++++.

Para maiores detalhes sobre Brainfuck e outras linguagens esotéricas de programação, visite a Wikipedia, que possui amplo material sobre o assunto.

Compilador

Abaixo está a listagem de um compilador de Brainfuck que escrevi para o MSX-BASIC. Cada linha em MSX-BASIC pode ter no máximo 256 caracteres, e esse compilador foi inteiramente feito em três linhas. A entrada é um arquivo .BF que deve conter o programa brainfuck, e a saída é um arquivo .BIN que deverá ser rodado com BLOAD.

1 DIMM(100):Q=49152!:P=Q:INPUTA$:DEFSTRC
:OPENA$+".BF"FORINPUTAS1:DATA33,0,160,17
,1,160,1,0,16,117,237,176,38,160:FORI=0T
O13:READK:POKEQ,K:Q=Q+1:NEXT:Q=Q-1:FORI=
1TO3:I=1:N=N+1:Q=Q+1:IFN=LOF(1)THENPOKEQ
,201:BSAVEA$+".BIN",P,Q,P:ENDELSEB=ASC(I
NPUT$(1,1))
2 IFB=62THENPOKEQ,35:NEXTELSEIFB=60THENP
OKEQ,43:NEXTELSEIFB=43THENPOKEQ,52:NEXTE
LSEIFB=45THENPOKEQ,53:NEXTELSEIFB=46THEN
POKEQ,126:POKEQ+1,205:POKEQ+2,162:POKEQ+
3,0:Q=Q+3:NEXTELSEIFB=44THENPOKEQ,205:PO
KEQ+1,159:POKEQ+2,0:POKEQ+3,119:Q=Q+3:NE
XT
3 IFB=91THENM(X)=Q:X=X+1:POKEQ,126:POKEQ
+1,183:POKEQ+2,202:Q=Q+4:NEXTELSEIFB=93T
HENX=X-1:A=INT(M(X)/256):POKEQ,195:POKEQ
+1,M(X)-A*256:POKEQ+2,A:Q=Q+3:A=INT(Q/25
6):POKEM(X)+4,A:POKEM(X)+3,Q-A*256:Q=Q-1
:NEXTELSEQ=Q-1:NEXT
Autor: Ricardo Bittencourt
Data: 2004.9.11
Copyright © 2004 Ricardo Bittencourt