brainfuck
Este artigo não cita fontes confiáveis. (Janeiro de 2014) |
brainfuck | |
---|---|
Paradigma | Programação esotérica |
Surgido em | 1993 |
Última versão | 2 (1993) |
Criado por | Urban Dominik Müller |
Influenciada por | FALSE, P′′ |
Influenciou | Braintwist, L00P, PATH, Pbrain, SNUSP |
Licença | Domínio público |
brainfuck, também conhecido como brainf*ck ou BF, é uma linguagem de programação esotérica notada pelo seu extremo minimalismo, criada por Urban Müller, em 1993. Ela é uma linguagem Turing completa, desenhada para desafiar e confundir os programadores, e não é útil para uso prático. Pela sua simplicidade, o desenvolvimento de compiladores e interpretadores para essa linguagem é muito mais fácil do que para outras linguagens. O nome da linguagem é geralmente não-capitalizado (começa com uma letra minúscula), apesar de ser um substantivo próprio.
História
[editar | editar código-fonte]Urban Müller criou brainfuck em 1993, com a intenção de fazer uma linguagem que pudesse ser implementada com o menor compilador possível, inspirado pelo compilador de 1024 bytes de FALSE. Alguns compiladores foram feitos menores do que 200 bytes.
Exceto pelos seus dois comandos de E/S, brainfuck é uma variação da linguagem de programação P′′, criada por Corrado Böhm em 1964. Todos os outros seis comandos de brainfuck são idênticos ao de P′′.
Características
[editar | editar código-fonte]O brainfuck acessa a memória RAM através de células de memória, e um ponteiro que aponta inicialmente a primeira célula. O tamanho de cada célula de memória depende do compilador ou interpretador usado. Na versão original, eram usadas 30000 células de memória, de 1 byte cada, porém é comum em implementações mais novas, terem apenas 5000 células. Existem versões com até 1 Dword (4 bytes) por célula de memória.
Algumas implementações possuem células de memória dinâmica, que podem aumentar de tamanho durante a execução, sempre que houver necessidade. Essas versões são mais flexíveis, porém mais lentas.
Na versão original, cada célula pode ter um valor entre -128 e 127, porém, em implementações mais novas, cada célula pode ter um valor entre 0 e 255. Sendo os números finitos, algumas implementações reportam erro quando esses valores são excedidos, mas isso é bem incomum, sendo o mais comum, os valores girarem automaticamente (se o valor da célula for igual a 255 e seu valor for aumentado novamente, esse valor passa a ser 0 e, se o valor for 0 e for diminuido novamente, esse valor passa a ser 255). A maioria das implementações reconhece a tecla Enter como ASCII 10.
Normalmente, a extensão usada pelos códigos fonte em brainfuck é .b ou .bf.
Comandos
[editar | editar código-fonte]A linguagem possui apenas oito comandos, cada qual formado por apenas um caractere. Outros caracteres são considerados comentários, e são ignorados.
Caractere | Descrição | Equivalente em C |
---|---|---|
>
|
Incrementa o ponteiro (acessa a célula de memória seguinte) | ptr++;
|
<
|
Decrementa o ponteiro (acessa a célula de memória anterior) | ptr--;
|
+
|
Incrementa em um, o valor da célula de memória selecionada | array[ptr]++;
|
-
|
Decrementa em um, o valor da célula de memória selecionada | array[ptr]--;
|
.
|
Imprime na tela o caractere relativo à célula de memória selecionada | putchar(array[ptr]);
|
,
|
Salva na célula de memória selecionada o código da próxima tecla a ser pressionada | array[ptr] = getchar();
|
[
|
Estrutura de controle que repete os comandos, enquanto a célula selecionada for diferente de zero | while (array[ptr]) {
|
]
|
Fim da estrutura | }
|
Exemplos
[editar | editar código-fonte]Programa Olá Mundo
[editar | editar código-fonte]![](http://178.128.105.246/cars-http-upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Magnifying_glass_01.svg/17px-Magnifying_glass_01.svg.png)
++++++++++[>++++++++>+++++++++++>++
++++++++>++++>+++>++++++++>++++++++
++++>+++++++++++>++++++++++>+++++++
++++>+++>+<<<<<<<<<<<<-]>-.>--.>---
.>++++.>++.>---.>---.>.>.>+.>+++.>.
O programa acima escreve na tela o texto (sem aspas): “Ola, Mundo!”. Esse código poderia ser feito em uma única linha. Mais abaixo ainda, segue o mesmo código, escrito de forma mais legível, para explicar seu funcionamento:
+++++ +++++ [ Inicia as células com os valores:
> +++++ +++ 80
> +++++ +++++ + 110
> +++++ +++++ 100
> ++++ 40
> +++ 30
> +++++ +++ 80
> +++++ +++++ ++ 120
> +++++ +++++ + 110
> +++++ +++++ 100
> +++++ +++++ + 110
> +++ 30
> + 10
< <<<<< <<<<< < -
]
> - . Escreve 'O'
> -- . Escreve 'l'
> ---. Escreve 'a'
> ++++ . Escreve vírgula
> ++ . Escreve ' '
> --- . Escreve 'M'
> --- . Escreve 'u'
> . Escreve 'n'
> . Escreve 'd'
> + . Escreve 'o'
> +++ . Escreve '!'
> . Escreve nova linha
A primeira linha salva o valor 10 na primeira célula, e inicia a repetição. Nas linhas seguintes avança uma célula e adiciona um número, e na linha 14 retorna para a primeira célula, e subtrai 1. Esse processo se repetirá até que o valor da primeira célula seja igual a 0, efetivamente multiplicando cada célula pelo valor da primeira.
Na linha 16 move para a segunda célula (valor 80), subtrai 1, e escreve o caractere correspondente em ASCII (letra O maiúscula), e assim sucessivamente.
Reconhecendo teclas
[editar | editar código-fonte]O código a seguir pega uma letra minúscula digitada e, a retorna maiúscula. Se a tecla Enter for pressionada, o programa encerra.
,>++[<----->-]<[----------
------------.,----------],
Ver também
[editar | editar código-fonte]Ligações externas
[editar | editar código-fonte]- «Versão clássica de Urban Müller» (em inglês)
- «Brainfucked - brainfuck compiler» (em inglês). compilador para código de máquina otimizado, código aberto sob a GNU GPL
- «Brainfuck Machine» (em inglês). IDE que vem com um compilador
- «brainfuck» (em inglês). Artigo sobre brainfuck