Programando em Brainfuck

Primeiramente, se você programa somente por obrigação, e não consegue se divertir programando, pode parar por aqui, este artigo não é pra você.

Agora se você gosta de aprender coisas novas, gosta de entender como as coisas funcionam, vou colocar uma breve (bem breve) descrição do que é o Brainfuck. Continue lendo. ;-)

Brainfuck é uma esolang (linguagem de programação esotérica). Foi criada por Urban Müller, em 1993, com a intenção de criar o menor compilador possível. fonte wikipédia

E quando eu vou usar Brainfuck na minha vida?

As linguagens de programação esotéricas, ou simplesmente Esolang’s, são projetadas para testar os limites dos projetos de linguagem de computadores, como uma aplicação da teoria, ou uma brincadeira.

Normalmente não há a intenção de que a linguagem seja aplicada ao mundo real.

Tais linguagens são populares, freqüentemente, entre hackers, ou como um passatempo. fonte wikipédia

Portanto, provavelmente você nunca utilizará Brainfuck na sua vida, a não ser por diversão e aprendizado.

Depois de aprender Brainfuck, você pode montar um interpretador pra ele, e quem sabe até um compilador. Ó qui legal! :)

Continuemos…

Entendendo a linguagem

Basicamente, dizendo em uma forma descontraída, o brainfuck possui 8 comandos, são eles:

> pula pra célula de memória seguinte
< pula pra célula de memória anterior
+ incrementa 1 na memória atual
- decrementa 1 (óbvio)
[ inicia loop (repetição)
] termina loop
, lê um caractere (adiciona o valor em ASCII na célula atual)
. imprime um caractere (referente ao ASCII da célula atual)

Impressão de caracteres em Brainfuck

Para exemplificar, será feito a impressão da string “teste”. Para isso, é necessário que se tenha em alguma das células, o valor em ASCII de cada carácter.

Sendo assim, o valor do carácter “t”, na tabela ASCII, é 116. (Você pode conferir demais carecteres nessa tabela.)

Usaremos o código abaixo para exibir o carácter “t” na tela, primeiramente comentado:

+++++++++++ # adicionado 11 na posição 1
[ # enquanto a posição 1 for maior que 0
- # tira 1
> # sobe
+++++++++++ # adiciona 11 na posição 2
< # desce
] # se a posição 1 for 0 sai do loop
> # sobe pra posição 2
----- # retira 5
. # imprime na tela

Versão sem comentários:

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

Pode parecer trabalhoso e um pouco difícil no começo, mas com o tempo se pega prática. A partir da primeira letra, você pode reaproveitar os valores, como demonstrado abaixo.

Supondo que as suas células estão populadas da seguinte forma:

[0][116]

Você pode reaproveitar o valor 116, já que você já imprimiu o “t”, e não vai mais utiliza-lo, dando continuidade ao código:

+++++++++++[->+++++++++++<]>-----. # t
---------------. # e

Pode-se observar, que para a impressão do carácter “e” (101 na tabela ASCII), foi necessário subtrair 15 da célula 2 (116 - 15 = 101), tcharam!

É claro que existem mil formas (melhores ou não) de se fazer uma coisa em Brainfuck. E agora em diante é com você.

Acho que não há a necessidade de explicar os outros caracteres, pois o processo é o mesmo, e a lógica também.

Você pode utilizar um simples Javascript que eu fiz para visualizar melhor seu código em Brainfuck, através deste link.

Brincando um pouco mais..

Você pode se divertir mais ainda, desenvolvendo um interpretador brainfuck na sua linguagem preferida.

Como eu, que desenvolvi um mini-interpretador (sem o operador “,”) em Javascript só pra brincar. Apesar de não ser minha linguagem preferida, dei uma “ajeitada” no visual do código e ficou lindo! Pra mim é claro. haha :-)

function bfo(str)
{
for($='',_=[],v =[ ],p=0,b=0,i=0; o=str[i];i++){switch(o )
{case '+':v[p]=! v[p]?1:++v[p];break;case'-':v[p]=!v[p]?0:
-- v[p]; break;case'>':++p; break;case'<': --p; break;case
'.': $+=String.fromCharCode(v[p]);break;case'[':_ [b++]=i;
break;case']':i=v[p]==0?[i,b--].shift():_[b-1];}}return $
}
alert(bfo('+++++++++++[->+++++++++++<]>-----.'));

Em breve postarei como criar a condição “if” em brainfuck. Não é tão simples como nas outras linguagens de programação, pois não há nenhum operador “if” pré-definido, assim como o [] (loop).

Qualquer dúvidas ou críticas, poste aqui! Será bem-vindo.


Outras postagens interessantes

2 pessoas comentaram

  1. ae caio o/ Tu ja tinha me apresentado faz tempo. Nunca dei muita idéia, achei coisa de maluco. Mas é legal olhando assim o código comentado kk Entendi agora como é o loop :)
    Vo tentar algo no seu interpretador.
    vlw.

  2. interessante, parece coisa de loco, mais vo tenta mexe nisso ai! :P

    vlw ai caio, belo post

Deixe o seu comentário

Você pode usar as seguintes tags no seu comentário: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="">

Para comentar um código, utilize por exemplo: <pre lang="php" line="2">echo 'Hello World';</pre>