Brainfuck
Brainfuck (en español '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.
Brainfuck | ||
---|---|---|
Urban Müller | ||
Información general | ||
Extensiones comunes | b y bf | |
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 | |
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.
Diseño del lenguaje
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.
Instrucciones
Hay solo ocho instrucciones, y todas son de un carácter.
Carácter | 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. En el caso de Lua, utiliza una variable i
para indicar el puntero y c
siendo una tabla como representación de las celdas; la inicialización de estas variables sería: i, c = 0, {}
.
brainfuck | C | Perl | Lua |
---|---|---|---|
> | ++ptr; | $pointer++; | i = i + 1 |
< | --ptr; | $pointer--; | i = i - 1 |
+ | ++*ptr; | $tape[$pointer]++; | c[i] = (c[i] or 0) + 1 |
- | --*ptr; | $tape[$pointer]--; | c[i] = (c[i] or 0) - 1 |
. | putchar(*ptr); | print chr$tape[$pointer]; | io.write(string.char(c[i] or 0)) |
, | *ptr=getchar(); | $tape[$pointer]=ord(<>); | c[i] = io.read():byte() |
[ | while (*ptr) { | while($tape[$pointer]){ | while (c[i] or 0) ~= 0 do |
] | } | } | end |
Ejemplos
Hola Mundo!
Este sería el típico programa que escribe «Hola mundo!»
++++++++++
[ Bucle para iniciar las memorias (se repite diez 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 «Hola mundo!» 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
ejemplo.
Linus Akesson presents:
The Game Of Life implemented in Brainfuck
+>>++++[<++++>-]<[<++++++>-]+[<[>>>>+<<<<-]>>>>[<<<<+>>>>>>+<<-]<+
+++[>++++++++<-]>.[-]<+++[>+++<-]>+[>>.+<<-]>>[-]<<<++[<+++++>-]<.<<[>>>>+
<<<<-]>>>>[<<<<+>>>>>>+<<-]<<[>>>>.+<<<++++++++++[<[>>+<<-]>>[<<+>>>>>++++++++
+++<<<-]<[>+<-]>[<+>>>>+<<<-]>>>[>>>>>>>>>>>>+>+<< <<<<<<<<<<<-]>>>>>>>>>>
>>[-[>>>>+<<<<-]>[>>>>+<<<<-]>>>]> >>[<<<+>> >- ]<<<[>>+>+<<<-]>[->[<<<
<+>>>>-]<[<<< <+> >>>-]<<<< ]< ++++++ ++ +[>+++++<-]>>[<<+>>-]<
<[>---<-]>.[- ] <<<<<<<<< < <<<<<< < -]++++++++++.[-]<-]>>>
>[-]<[-]+++++ +++[>++++ ++++< - ]>--.[-]<,----------[<+
>-]>>>>>>+<<<<< < <[>+>>>>>+>[ -]<<< << <<-]>++++++++++>>>>>[[-]
<<,<<<<<<<->>>> > >>[<<<<+>>>>-]<<<<[>>>>+ >+<<<<<-]>>>>>----------[<<<<
<<<<+<[>>>>+<<< <-]>>>>[<<<<+>>>>>>+<<- ]>[>-<-]>++++++++++[>+++++++++
++<-]<<<<<<[>>> >+<<<<-]>>>>[<<<<+>>>>> >+<<-]>>>>[<<->>-]<<++++++++++
[>+<-]>[>>>>>>> >>>>>+>+<<<< <<<<< <<<<-]>>> >> >>>>>>>[-[>>>
>+<<<<-]>[>>>> +<<<<-]>> > ]>> > [<< < +>>>-]+<<<[>
>>-<<<-]>[->[< <<<+>>>>-] <[ < < < <+>>>>-]<<<
<]<<<<<<<<<<<, [ -]]>]>[-+++ ++ + +++ ++[>+++++++
++++>+++++++++ + +<<-]>[-[>>> +<<<- ]>>>[ < <<+ >>>>>>>+>+<
<<<<-]>>>>[-[> > >>+<<<<-]>[> >>>+< < <<-]> > >]> >>[<<<+>>>-
]<<<[>>+>+<<< - ]>[->[<<<<+> >>>-] < [<<< < +>> >>-]<<<<]<<
<<<<<<[>>>+<< < -]>>>[<<<+>> >>>>> + >+<< < <<-]<<[>>+<<
-]>>[<<+>>>>> >+>+<<<<<-]>> >>[-[ > >>>+ < <<<-]>[>>>>+<
<<<-]>[>>>>+< <<<-]>>]>>>[ - ]<[>+< - ]<[ - [<<<<+>>>>-]<<<
<]<<<<<<<<]<< <<<<<<<<++++ + +++++ [ >+++ + ++++++[<[>>+<<-]>>[<<+
>>>>>++++++++ + ++<<< -] < [>+<- ] >[<+ > >>>+<<<-]>>>[<<<+>>>-]
<<<[>>>+>>>> > +<<<< << <<-]> > >>>> >>>[>>+<<-]>>[<<+<+>>
>-]<<<------ - -----[ >> >+<<< - ]>>> [<<<+> > >>>>>+>+<<<<
<-]>>>>[-[>> > >+<<<< -] > [>>>> + <<<<- ]>>> ] >>>[<<<+>>>-
]<<<[>>+>+<< < -]>>> >> > > [<<<+ >>>-]<<<[>>>
+<<<<<+>>- ]> > >>>>>[< <<+>>>-]<<<[>
>>+<<<<<<< <<+ > >>>>>-]< <<<<<<[->[<<<<+
>>>>-]<[<<<<+>>>>-]<<<<]>[<<<<<< <+>>> >>>>-]<<<< <<<<<+++++++++++[>
>>+<<<-]>>>[<<<+>>>>>>>+>+<<<<<-]>>>>[-[> >>>+<<<<-]>[>>>>+<<<<-]>>>]>>>[<<<
+>>>-]<<<[>>+>+<<<-]>>>>>>>[<<<+>>>-]<<<[ >>>+<<<<<+>>-]>>>>>>>[<<<+>>>-]<<<
[>>>+<<<<<<<<<+>>>>>>-]<<<<<<<[->[< < < <+>>>>-]<[<<<<+>>>>-]<<<<]>[<<<<<<<
+>>>>>>>-]<<<<<<<<<+++++++++++[>>> > >>>+>+<<<<<<<<-]>>>>>>>[-[>>>>+<<<<-
]>[>>>>+<<<<-]>>>]>>>[<<<+>>>-]<<< [ >>+>+<<<-]>>>>>>>[<<<+>>>-]<<<[>>>+<<
<<<+>>-]>>>>>>>[<<<+>>>-]<<<[>>>+< <<<<<<<<+>>>>>>-]<<<<<<<[->[<<<<+>>>>-
]<[<<<<+>>>>-]<<<<]>[<<<<<<<+>>>>> >>-]<<<<<<<----[>>>>>>>+<<<<<<<+[>>>>>
>>-<<<<<<<[-]]<<<<<<<[>>>>>>>>>>>>+>+<<<<<<<<<<<<<-][ lft@example.org ]>>>>>
>>>>>>>[-[>>>>+<<<<-]>[>>>>+<<<<-]>[>>>>+<<<<-]>>]>>>[-]<[>+<-]<[-[<<<<+>>
>>-]<<<<]<<<<<<[-]]<<<<<<<[-]<<<<-]<-]>>>>>>>>>>>[-]<<]<<<<<<<<<<]
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
- Frans Faase. Brainfuck es Turing completo
- Daniel Cristofani. Alguna información de Brainfuck
- Clifford Wolf. El UCP de Brainfuck y otros proyectos relacionados con Brainfuck Archivado el 18 de diciembre de 2017 en Wayback Machine.
- Un tutorial de Brainfuck en inglés y francés.
- Una página muy variada pero que dedica una parte a lenguajes esotéricos Archivado el 19 de julio de 2019 en Wayback Machine.
- Deybis Melendez. Tutorial de brainfuck en español Archivado el 24 de septiembre de 2020 en Wayback Machine.
Implementaciones
- Librería BrainFuck Archivado el 8 de diciembre de 2014 en Wayback Machine., en el lenguaje de programación Pauscal en español.
- 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 e implementaciones.
- Brainfucked. Compilador de Brainfuck para Windows/DOS.
- 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.
- Jeffrey Johnston. Programas de BF, incluyendo un compilador de Basic y un ensamblador (enlace roto disponible en Internet Archive; véase el historial, la primera versión y la última).
- 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 (enlace roto disponible en Internet Archive; véase el historial, la primera versión y la última).
- Intérprete de Brainfuck hecho en C
- Intérprete de Brainfuck escrito en Lua