Brainfuck
Brainfuck | ||
---|---|---|
Urban Müller https://brainfuck.org/ | ||
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 | |
[editar datos en Wikidata] |
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.
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
- Datos: Q244627
- Multimedia: Brainfuck / Q244627