Brainfuck

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

  1. andr3 ( Mozilla Firefox Mozilla Firefox 1.0 / Windows Windows 98)

    :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. :)

    24 de Abril de 2005 @ 21:55 | Permalink
  2. andr3 ( Mozilla Firefox Mozilla Firefox 1.0 / Windows Windows 98)

    sucessão de fibonnaci em BF \m/

    24 de Abril de 2005 @ 21:57 | Permalink
  3. João Craveiro ( Mozilla Firefox Mozilla Firefox 1.0.3 / Fedora Linux Fedora Linux)

    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 []…)

    25 de Abril de 2005 @ 18:29 | Permalink
  4. Alonso ( Internet Explorer Internet Explorer 6.0 / Windows Windows 98)

    VC tem o codigo fonte do tetraedro de Sierpinski em assembly.

    3 de Julho de 2005 @ 11:20 | Permalink