mierda de cerebro | |
---|---|
clase de idioma | esotérico |
Apareció en | 1993 |
Autor | Müller urbano |
Desarrollador | Müller urbano [d] |
extensión de archivo | .bo.bf |
Dialectos | BrainSub, Brainfork, Brainloller, COW, Ook, Pbrain, Smallfuck, Spoon , LOLCODE , Whitespace , DoubleFuck , Feckfeck |
sido influenciado | FALSO |
Archivos multimedia en Wikimedia Commons |
Brainfuck es uno de los lenguajes de programación esotéricos , inventado por Urban Müller en 1993 , conocido por su minimalismo . El nombre del idioma se puede traducir al ruso como eliminación de cerebro , se deriva directamente de la expresión inglesa brainfuck ( cerebro -cerebro, joder - joder ), es decir, dedicarse a tonterías . El lenguaje tiene ocho comandos, cada uno de los cuales se escribe con un carácter. El código fuente de un programa Brainfuck es una secuencia de estos caracteres sin ninguna sintaxis adicional.
Uno de los motivos de Urban Muller era crear un lenguaje con el menor compilador posible. En parte se inspiró en el lenguaje FALSO , para el cual había un compilador de 1024 bytes. Hay compiladores de lenguaje Brainfuck de menos de 200 bytes [1] . La programación en el lenguaje Brainfuck es difícil de escribir, por lo que a veces se le llama el lenguaje de los masoquistas. Pero al mismo tiempo, Brainfuck es un lenguaje completamente natural, completo y simple y puede usarse para definir el concepto de computabilidad .
La máquina, controlada por los comandos Brainfuck , consta de un conjunto ordenado de celdas y un puntero a la celda actual, que se asemeja a la cinta y la cabeza de una máquina de Turing . Además, implica un dispositivo para comunicarse con el mundo exterior (ver los comandos . y , ) a través del flujo de entrada y el flujo de salida.
El lenguaje Brainfuck se puede describir usando equivalentes del lenguaje C :
Equipo Brainfuck | C equivalente | Descripción del equipo |
---|---|---|
Inicio del programa | int i = 0; char arr[30000]; memset(arr, 0, sizeof(arr)); |
la memoria se asigna para 30,000 celdas con cero valores iniciales |
> | i++; | pasar a la siguiente celda |
< | i--; | pasar a la celda anterior |
+ | arr[i]++; | aumentar el valor en la celda actual en 1 |
- | arr[i]--; | disminuir el valor en la celda actual en 1 |
. | putchar(arr[i]); | imprimir el valor de la celda actual |
, | arr[i] = getchar(); | ingrese un valor desde afuera y guárdelo en la celda actual |
[ | while(arr[i]){ | si el valor de la celda actual es cero, avance en el texto del programa hasta el carácter que sigue al ] correspondiente (incluido el anidamiento) |
] | } | si el valor de la celda actual no es cero, retroceda en el texto del programa hasta el carácter [ (teniendo en cuenta el anidamiento) |
A pesar de la primitividad externa, Brainfuck con un conjunto infinito de celdas tiene la integridad de Turing y, por lo tanto, no es inferior a los lenguajes "reales" como C , Pascal o Java en términos de potencial .
Brainfuck es adecuado para experimentos en programación genética debido a la simplicidad de la sintaxis y, en consecuencia, la generación de código fuente.
En el Brainfuck "clásico" descrito por Muller, el tamaño de celda es de un byte, el número de celdas es de 30 000. En el estado inicial, el puntero está en la posición más a la izquierda y todas las celdas se llenan con ceros. Los valores de celda aumentan o disminuyen módulo 256. La entrada/salida también se produce byte a byte, teniendo en cuenta la codificación ASCII (es decir, como resultado de la operación de entrada ( , ), el carácter 1 se escribirá en la celda actual como el número 0x31 (49), y la operación de salida ( . ) realizada en una celda que contiene 0x41 (65) imprimirá la A latina ). En otras variantes de idioma, el tamaño y el número de celdas pueden ser diferentes (más grandes). Hay versiones donde el valor de las celdas no es entero (coma flotante).
Total de 389 declaraciones y 1 celda de memoria utilizada. El programa optimizado es notablemente más corto: solo 111 declaraciones, pero 5 celdas de memoria. La primera celda se usa como contador de bucle para 10 iteraciones, las siguientes celdas contienen los números 7, 10, 3 y 1 , aumentados por este bucle a 70, 100, 30 y 10 , la suma se produce antes de imprimir, la segunda palabra es construido a partir de los restos del primero:
++++++++++ [ > +++++++ > ++++++++++ > +++ > + <<<< - ] > ++ . > + . +++++++ .. +++ . > ++ . << ++++++++++++++++ . > . +++ . ------ . -------- . > + . > .Analizando el programa:
El ciclo de rellenar los números principales | |
++++++++++ | asignando a la celda 0 el valor 10 |
[ | repita los comandos descritos por este paréntesis hasta que el valor de la celda actual 0 no sea igual a cero |
>+++++++ | incremento de celda 1 por 7 |
>++++++++++ | incremento de celda 2 por 10 |
>+++ | incremento de celda 3 por 3 |
>+ | incremento de celda 4 por 1 |
<<<<- | decremento de celda 0 por 1 |
] | comprobando si la celda 0 es cero |
Salida de la primera palabra | |
>++. | en la celda 1 , sumando 2 a 70 e imprimiendo el código ASCII 72, es decir las letras " H ". |
>+. | en la celda 2 sumar 1 a 100 = 101, imprimir la letra " e " |
+++++++.. | en la misma celda sumando 7 a 101 = 108, imprimiendo " l " dos veces |
+++. | en la misma celda sumando 3 a 108 = 111, imprimiendo " o " |
>++. | en la celda 3 suma 2 a 30 = 32, imprime un espacio |
Salida de segunda palabra con reutilización de celda | |
<<+++++++++++++++. | en la celda 1 agregue 15 a 72 = 87, escriba " W " |
>. | la celda 2 ya tiene 111, inmediatamente escribe " o " |
+++. | en la misma celda sumando 3 a 111 = 114, imprimiendo " r " |
------. | en la misma celda, restar 6 de 114 = 108, imprimir " l " |
--------. | en la misma celda, restar 8 de 108 = 100, imprimir " d " |
>+. | en la celda 3 agregue 1 a 32 = 33, imprima " ! » |
>. | la celda 4 ya tiene 10, imprima inmediatamente el salto de línea |
Un ejemplo de un intérprete de Brainfuck escrito en Perl :
#!/usr/bin/perl abrir F , cambiar ; @code = grep { /[+-\.,\[\]><]/ } split '' , <F> ; for ( my $_ = 0 ; $_ < @code ; ++ $_ ) { ++ $cpu [ $i ] if $code [ $_ ] eq '+' ; -- $cpu [ $i ] if $código [ $_ ] eq '-' ; -- $i si $código [ $_ ] eq '<' ; ++ $i si $código [ $_ ] eq '>' ; print chr $cpu [ $i ] if $código [ $_ ] eq '.' ; $cpu [ $i ] = ord <STDIN> if $código [ $_ ] eq ',' ; if ( $código [ $_ ] eq '[' ) { if ( ! $cpu [ $i ]) { ++ $brc ; while ( $brc ) { ++ $_ ; ++ $brc if $código [ $_ ] eq '[' ; -- $brc if $código [ $_ ] eq ']' ; } } más { siguiente ; } } elsif ( $código [ $_ ] eq ']' ) { if ( ! $cpu [ $i ]) { siguiente ; } else { ++ $brc if $código [ $_ ] eq ']' ; while ( $brc ) { -- $_ ; -- $brc if $código [ $_ ] eq '[' ; ++ $brc if $código [ $_ ] eq ']' ; } -- $_ ; } } }Un ejemplo de un intérprete de Brainfuck escrito en C++ :
#incluir <iostream> #incluir <fstream> #incluir <vector> #include <iterador> int principal ( int argc , char ** argv ) { std :: archivo fstream ( argv [ 1 ], std :: ios :: in ); std :: istreambuf_iterator < char > fstart ( archivo ), defender ; std :: vector < char > itape ( fstart , fend ); archivo _ cerrar (); std :: vector < char > mtape ( 30000 , 0 ); std :: vector < char >:: iterador m = mtape . comenzar (); std :: vector < char >:: iterador i = itape . comenzar (); int b = 0 ; for (; i != itape . end (); ++ i ) { cambiar ( * i ){ caso '>' : if ( ++ m == mcinta . end ()) { cinta m retroceso ( 0 ); m = -mcinta ._ _ fin (); } romper ; caso '<' : - m ; romper ; caso '+' : +**** m ; romper ; caso '-' : --* m ; romper ; caso '.' : std :: cout << * m ; romper ; case ',' : std :: cin >> * m ; romper ; caso '[' : si ( * m ) continuar ; ++ b ; mientras ( b ) cambiar ( *++ i ){ caso '[' : ++ b ; romper ; caso ']' : - b ; romper ; } romper ; caso ']' : si ( !* m ) continuar ; ++ b ; mientras ( b ) cambiar ( *-- i ){ caso '[' : -- b ; romper ; caso ']' : ++ b ; romper ; } --yo ; _ romper ; } } }Todos los principiantes en programación Brainfuck inmediatamente se encuentran con los siguientes problemas:
Estos problemas se pueden resolver.
Denote por @(k) el desplazamiento de k celdas hacia la derecha si k>0, y hacia la izquierda si k<0 En consecuencia, @(k) = >… k veces …> o <… -k veces …<Brainfuck casi nunca se usa para programación práctica (con la excepción del trabajo de entusiastas individuales), y se usa principalmente para acertijos y problemas de competencia.
Notas: 1. Especialmente para la funcionalidad del comando mOO, los códigos internos de sus comandos [2] se introducen en el lenguaje COW , en la tabla se indican en una columna separada. 2. La ausencia de un equipo se señala como ausente .
mierda de cerebro | ¡OK! | VACA | código de vaca | Descripción |
] | ¿OK? ¡OK! | mugir | 0 | fin de ciclo |
< | ¿OK? ESTÁ BIEN. | mugir | una | celda anterior |
> | ESTÁ BIEN. ¿OK? | mugir | 2 | siguiente celda |
os. | os. | mugir | 3 | Ejecute el valor en la celda actual como un comando con el código correspondiente del rango 0 - 11; el código 3 provoca un bucle |
os. | os. | Mugir | cuatro | Si el valor de la celda actual es cero, ingréselo desde el teclado; si el valor de la celda actual no es cero, muéstrelo en la pantalla |
- | ¡OK! ¡OK! | Mugir | 5 | El valor de la celda actual se reduce en 1 |
+ | ESTÁ BIEN. ESTÁ BIEN. | Mugir | 6 | El valor de la celda actual se incrementa en 1 |
[ | ¡OK! ¿OK? | mes | 7 | Inicio de bucle (COW tiene una función: se omite el primer comando del bucle) |
[-] | os. | OOO | ocho | Restablece el valor en la celda actual |
os. | os. | MMM | 9 | Si el registro está vacío, copie el valor de la celda actual en él; de lo contrario, copie el contenido del registro en la celda y borre el registro. |
. | ¡OK! ESTÁ BIEN. | OM | diez | Mostrar el valor de la celda actual |
, | ESTÁ BIEN. ¡OK! | oom | once | Consultar el valor de la celda actual |
Otra descripción de los muchos dialectos de este idioma se puede encontrar en la enciclopedia wiki de idiomas esotéricos [3]
Lenguajes de programación | |
---|---|
|