Brainfuck
| Brainfuck | |
|---|---|
| Información general | |
| Paradigma | Esotérico |
| Apareció en | 1993 |
| Diseñado por | Urban Müller |
| Implementaciones | Múltiples |
| Influido por | Máquina de Turing, P′′ |
| Ha influido a | Ook!, Tink |
Brainfuck (jodecerebros), es un lenguaje de programación esotérico, diseñado por Urban Müller en 1993, con el objetivo de hacer un lenguaje que fuera a la vez muy simple, Turing completo y que requiriese un compilador pequeño. Müller basó Brainfuck en la máquina de Turing y le sirvió de inspiración el compilador de 1024 bytes de tamaño del lenguaje FALSE.
La distribución clásica es la versión 2 escrita por el propio Müller, conteniendo un compilador para el ordenador Amiga, un intérprete, programas de ejemplo y un documento "readme".
Índice |
Diseño del lenguaje [editar]
El lenguaje se basa en un modelo de ejecución simple que consiste, además del programa, de un vector de (al menos) 30.000 bytes inicializados a cero, un puntero sobre ese vector (que al comienzo de la ejecución apunta al primer elemento del vector) y dos "corrientes" de bytes para la entrada y la salida.
Las Instrucciones [editar]
Hay solo ocho instrucciones, y todas son de un carácter.
| Caracter | Significado |
|---|---|
> |
Incrementa el puntero. |
< |
Decrementa el puntero. |
+ |
Incrementa el byte apuntado. |
- |
Decrementa el byte apuntado. |
. |
Escribe el byte apuntado en el flujo de salida. |
, |
Lee un byte del flujo de entrada y lo almacena en el byte apuntado. |
[ |
Avanza a la instrucción inmediatamente posterior al ] correspondiente si el byte actualmente apuntado es nulo (si es 0). |
] |
Retrocede a la instrucción inmediatamente posterior al [ correspondiente si el byte actualmente apuntado no es nulo (si es distinto de 0). |
- Traducción a otros lenguajes
Los programas de Brainfuck se pueden traducir a C y Perl con estas substituciones, suponiendo que ptr sea del tipo unsigned char*. Sin embargo, poseen sus propios traductores.
| brainfuck | C | Perl |
|---|---|---|
> |
++ptr; |
$pointer++; |
< |
--ptr; |
$pointer--; |
+ |
++*ptr; |
$tape[$pointer]++; |
- |
--*ptr; |
$tape[$pointer]--; |
. |
putchar(*ptr); |
print chr$tape[$pointer]; |
, |
*ptr=getchar(); |
$tape[$pointer]=ord(<>); |
[ |
while (*ptr) { |
while($tape[$pointer]){ |
] |
} |
} |
Ejemplos [editar]
- Hola Mundo!
Este sería el típico programa que escribe "Hola mundo!"
++++++++++ [ Bucle para iniciar las memorias (se repite 10 veces) >+++++++>++++++++++>+++++++++++>+++>+<<<<<- 70 100 110 30 10 ] >++. imprime 'H' (72) 1 >>+. imprime 'o' (111) 3 ---. 'l' (108) 3 <---. 'a' (97) 2 >>++. espacio (32) 4 <+. 'm' (109) 3 ++++++++. 'u' (117) 3 -------. 'n' (110) 3 <+++. 'd' (100) 2 >+. 'o' (111) 3 >+. '!' (33) 4 >. '\n' (10) 5
El correspondiente código "Hello World!" se escribiría, en una sola línea:
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
ya que no le afectan los espacios, las tabulaciones o los saltos de línea.
- El juego de la vida
Linus Akesson presents: The Game Of Life implemented in Brainfuck +>>++++[<++++>-]<[<++++++>-]+[<[>>>>+<<<<-]>>>>[<<<<+>>>>>>+<<-]<+ +++[>++++++++<-]>.[-]<+++[>+++<-]>+[>>.+<<-]>>[-]<<<++[<+++++>-]<.<<[>>>>+ <<<<-]>>>>[<<<<+>>>>>>+<<-]<<[>>>>.+<<<++++++++++[<[>>+<<-]>>[<<+>>>>>++++++++ +++<<<-]<[>+<-]>[<+>>>>+<<<-]>>>[>>>>>>>>>>>>+>+<< <<<<<<<<<<<-]>>>>>>>>>> >>[-[>>>>+<<<<-]>[>>>>+<<<<-]>>>]> >>[<<<+>> >- ]<<<[>>+>+<<<-]>[->[<<< <+>>>>-]<[<<< <+> >>>-]<<<< ]< ++++++ ++ +[>+++++<-]>>[<<+>>-]< <[>---<-]>.[- ] <<<<<<<<< < <<<<<< < -]++++++++++.[-]<-]>>> >[-]<[-]+++++ +++[>++++ ++++< - ]>--.[-]<,----------[<+ >-]>>>>>>+<<<<< < <[>+>>>>>+>[ -]<<< << <<-]>++++++++++>>>>>[[-] <<,<<<<<<<->>>> > >>[<<<<+>>>>-]<<<<[>>>>+ >+<<<<<-]>>>>>----------[<<<< <<<<+<[>>>>+<<< <-]>>>>[<<<<+>>>>>>+<<- ]>[>-<-]>++++++++++[>+++++++++ ++<-]<<<<<<[>>> >+<<<<-]>>>>[<<<<+>>>>> >+<<-]>>>>[<<->>-]<<++++++++++ [>+<-]>[>>>>>>> >>>>>+>+<<<< <<<<< <<<<-]>>> >> >>>>>>>[-[>>> >+<<<<-]>[>>>> +<<<<-]>> > ]>> > [<< < +>>>-]+<<<[> >>-<<<-]>[->[< <<<+>>>>-] <[ < < < <+>>>>-]<<< <]<<<<<<<<<<<, [ -]]>]>[-+++ ++ + +++ ++[>+++++++ ++++>+++++++++ + +<<-]>[-[>>> +<<<- ]>>>[ < <<+ >>>>>>>+>+< <<<<-]>>>>[-[> > >>+<<<<-]>[> >>>+< < <<-]> > >]> >>[<<<+>>>- ]<<<[>>+>+<<< - ]>[->[<<<<+> >>>-] < [<<< < +>> >>-]<<<<]<< <<<<<<[>>>+<< < -]>>>[<<<+>> >>>>> + >+<< < <<-]<<[>>+<< -]>>[<<+>>>>> >+>+<<<<<-]>> >>[-[ > >>>+ < <<<-]>[>>>>+< <<<-]>[>>>>+< <<<-]>>]>>>[ - ]<[>+< - ]<[ - [<<<<+>>>>-]<<< <]<<<<<<<<]<< <<<<<<<<++++ + +++++ [ >+++ + ++++++[<[>>+<<-]>>[<<+ >>>>>++++++++ + ++<<< -] < [>+<- ] >[<+ > >>>+<<<-]>>>[<<<+>>>-] <<<[>>>+>>>> > +<<<< << <<-]> > >>>> >>>[>>+<<-]>>[<<+<+>> >-]<<<------ - -----[ >> >+<<< - ]>>> [<<<+> > >>>>>+>+<<<< <-]>>>>[-[>> > >+<<<< -] > [>>>> + <<<<- ]>>> ] >>>[<<<+>>>- ]<<<[>>+>+<< < -]>>> >> > > [<<<+ >>>-]<<<[>>> +<<<<<+>>- ]> > >>>>>[< <<+>>>-]<<<[> >>+<<<<<<< <<+ > >>>>>-]< <<<<<<[->[<<<<+ >>>>-]<[<<<<+>>>>-]<<<<]>[<<<<<< <+>>> >>>>-]<<<< <<<<<+++++++++++[> >>+<<<-]>>>[<<<+>>>>>>>+>+<<<<<-]>>>>[-[> >>>+<<<<-]>[>>>>+<<<<-]>>>]>>>[<<< +>>>-]<<<[>>+>+<<<-]>>>>>>>[<<<+>>>-]<<<[ >>>+<<<<<+>>-]>>>>>>>[<<<+>>>-]<<< [>>>+<<<<<<<<<+>>>>>>-]<<<<<<<[->[< < < <+>>>>-]<[<<<<+>>>>-]<<<<]>[<<<<<<< +>>>>>>>-]<<<<<<<<<+++++++++++[>>> > >>>+>+<<<<<<<<-]>>>>>>>[-[>>>>+<<<<- ]>[>>>>+<<<<-]>>>]>>>[<<<+>>>-]<<< [ >>+>+<<<-]>>>>>>>[<<<+>>>-]<<<[>>>+<< <<<+>>-]>>>>>>>[<<<+>>>-]<<<[>>>+< <<<<<<<<+>>>>>>-]<<<<<<<[->[<<<<+>>>>- ]<[<<<<+>>>>-]<<<<]>[<<<<<<<+>>>>> >>-]<<<<<<<----[>>>>>>>+<<<<<<<+[>>>>> >>-<<<<<<<[-]]<<<<<<<[>>>>>>>>>>>>+>+<<<<<<<<<<<<<-][ lft@df.lth.se ]>>>>> >>>>>>>[-[>>>>+<<<<-]>[>>>>+<<<<-]>[>>>>+<<<<-]>>]>>>[-]<[>+<-]<[-[<<<<+>> >>-]<<<<]<<<<<<[-]]<<<<<<<[-]<<<<-]<-]>>>>>>>>>>>[-]<<]<<<<<<<<<<] Type for instance "fg" to toggle the cell at row f and column g Hit enter to calculate the next generation Type q to quit
- Triángulo de Sierpinski
[ This program prints Sierpinski triangle on 80-column display. ] > + + + + [ < + + + + + + + + > - ] > + + + + + + + + [ > + + + + < - ] > > + + > > > + > > > + < < < < < < < < < < [ - [ - > + < ] > [ - < + > > > . < < ] > > > [ [ - > + + + + + + + + [ > + + + + < - ] > . < < [ - > + < ] + > [ - > + + + + + + + + + + < < + > ] > . [ - ] > ] ] + < < < [ - [ - > + < ] + > [ - < + > > > - [ - > + < ] + + > [ - < - > ] < < < ] < < < < ] + + + + + + + + + + . + + + . [ - ] < ] + + + + + * * * * * M a d e * B y : * N Y Y R I K K I * 2 0 0 2 * * * * *
Enlaces externos [editar]
- Frans Faase. BF es Turing completo
- Daniel Cristofani. Alguna información de Brainfuck
- Clifford Wolf. El UCP de Brainfuck y otros proyectos relacionados con Brainfuck
- Un tutorial de Brainfuck en inglés y francés.
- Una página muy variada pero que dedica una parte a lenguajes isotéricos...
Implementaciones [editar]
- Compilador con lex, yacc, En los lenguajes de programación C y Python.
- Visual brainfuck, un IDE de brainfuck compatible con Windows 7
- Intérprete de Brainfuck con un depurador integrado (EDI) para Windows
- Brian Raiter, Muppetlabs. Brainfuck: Un lenguaje de programación Turing completo de ocho instrucciones. Este sitio incluye un Quine de Brainfuck.
- Panu Kalliokoski. El Archivo de Brainfuck tiene muchos programas de Brainfuck, quines, y implementaciones.
- Brainfucked compilador de Brainfuck para Windows/DOS.
- Brainfuck.ca Intérpretes y convertidores de Brainfuck autorizado con la GPL
- Un intérprete y compilador de Brainfuck para Windows
- Brainfuck.net
- Also Written In Brainfuck (awib) es un compilador de Brainfuck escrito en Brainfuck para Linux de i386.
- Robert Östling. Computadora de Brainfuck. (enlace roto disponible en Internet Archive; véase el historial y la última versión).
- Jeffry Johnston. Programas de BF, incluyendo un compilador de Basic y un ensamblador
- Acme::Brainfuck Módulo Perl en CPAN (en inglés)
- Intérprete de Brainfuck hecho en delphi
- Intérprete de Brainfuck en PHP
- Ookie, intérprete de Brainfuck y Ook! escrito en Ruby y con repositorio en Github
- Recompilador dinámico de Brainfuck en JavaScript