Brainfuck é uma linguagem de (difícil) programação, criada por Urban Müller, e para a qual conseguiu a proeza de escrever o mais pequeno compilador de sempre (240 bytes, mais tarde 200 bytes).
Trata-se, obviamente, de uma linguagem com uma sintaxe muito simples; linhas e indentação são irrelevantes, sendo aproveitadas, dadas as características da linguagem, para moldar o código de forma agradável ou humorística. Existem 8 comandos, que manipulam um ponteiro implícito:
- > incrementa (avança) o ponteiro
- < decrementa (recua) o ponteiro
- + incrementa em 1 unidade o valor (byte) apontado pelo ponteiro
- - decrementa em 1 unidade o valor (byte) apontado pelo ponteiro
- . (ponto) mostra no ecrã¹ o valor do byte apontado pelo ponteiro
- , (vírgula) recebe um valor do teclado¹ e armazena-o no byte apontado pelo ponteiro
- [ avança até ao correspondente ] se o byte apontado pelo ponteiro for nulo
- ] recua até ao correspondente [ excepto se o byte apontado pelo ponteiro for nulo
Temos, portanto, 4 instruções de processamento interno, 2 de I/O e 2 de controlo de fluxo. Todos os caracteres para além destes 8 serão pura e simplesmente ignorados, tratando-se, assim, tecnicamente, de comentários.
Para ficarem ainda mais abismados, aqui fica uma amostra, nomeadamente o código-fonte de um hello world:
>+++++++++[< ++++++++>-]< .>+++++++[< ++++>-]< +.+++++++..+++.[-]>++++++++[< ++++>-]
< .#>+++++++++++[< +++++>-]< .>++++++++[< +++>-]< .+++.——.——–.[-]>++++++++[
< ++++>-] < +.[-]++++++++++.
(Fontes: The Brainfuck Programming Language e The Brainfuck Archive)
¹ Os termos "ecrã" e "teclado" foram usados por serem mais óbvios do uso generalizado dos respectivos comandos; os termos técnicos correctos seriam "standard output" e "standard input", os quais podem, nomeadamente, ser redireccionados para/de um ficheiro de texto.













4 Comments
:O
no sentido literal da palavra AWE-some!
o que ele poupa no compilador gasta-se depois no código. o compilador deve traduzir qs literalmente cada instrução numa instrução em assembly. LoL
muito interessante. :)
sucessão de fibonnaci em BF \m/
Gosto mais deste: triangle.bf — um programa que desenha um fractal de Sierpinski, com o próprio código-fonte disposto em forma de fractal de Sierpinski. :D
(Quanto ao outro comentário, sim, deve ser algo assim; com a agravante de também provavelmente ter de estar sempre a copiar dados entre a memória e os registos — p.ex. para os loops dos []…)
VC tem o codigo fonte do tetraedro de Sierpinski em assembly.