Muy buenas.
Estaba leyendo una entrada de genbetadev, en la que muestra 10 lenguajes de programación un poco diferentes de lo común...
Entre ellos muestra Brainfuck, y como ejemplo de un hola mundo lo escribe así :
++++++++++
[
>+++++++>++++++++++>+++++++++++>+++>+< <<<<-
]
>++.
>>+.
—-.
< —-.
>>++.
< +.
++++++++.
———-.
<+++.
>+.
>+.
>.
Teniendo en cuenta esto : Cuenta con sólo 8 instrucciones de un solo carácter cada una:
">" - 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).
Lo que no logro entendes es como sólo con 8 instrucciones se puede crear un "Hola Mundo" ¿donde empieza para sacar la "H"? ¿Como sabe el programa que tiene que mostrarlo por pantalla?
Alguien me podría explicar el código ¿?
Gracias de antemano :)
Cita de: Baal_30 en 2 Julio 2015, 13:06 PMLo que no logro entendes es como sólo con 8 instrucciones
Citar"[" - 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).
Esos son los operadores que hacen posible un loop y simplifican (dentro de lo que cabe) el código para que no sea tan... repetitivo (dentro de lo que cabe también, por que vaya tela con este lenguaje...). Peores cosas se pueden ver cómo un loop en el lenguaje 2L: https://esolangs.org/wiki/2L
En fin, este código asigna 7 celdas de memoria a las que le asigna un valor inicial de 0 a cada una, y con el búcle le va asignando distintos valores a cada celda, valores que corresponden a la tabla de caracteres ASCII.
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
Cuando termina el búcle aquí:
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]
Estas son las celdas y el valor de cada celda:
Celdas : 0 1 2 3 4 5 6
Valores: 0 0 72 104 88 32 8Despues de eso, el resto del código simplemente va moviendo el puntero de una celda a otra, incrementando o disminuyendo su valor.
>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
La celda 2 contiene un 72, que equivale a una
H.
La celda 3 contiene un 104, al que se le substrae 3, dando 101, que equivale a una
e. despues, se le incrementa el valor para obtener
l,
l, y
o.
(http://www.asciitable.com/index/asciifull.gif)
Y ese tipo de operaciones sucesivamente...
Creo que más o menos es algo así la forma en la que trabaja.
Aquí lo explican detalladamente:
https://esolangs.org/wiki/Brainfuck
(http://i.imgur.com/J45CbcI.png)
Saludos.
Mier.da!! Estas bien demente para entender esto Elektro xD
Cita de: Spectatorem en 2 Julio 2015, 19:52 PM
Mier.da!! Estas bien demente para entender esto Elektro xD
se llega un momento que uno aprende estas locuras por ocio, tambien ayudan a aprender a pensar :P por un tiempo estuve programando en eso XD
Cita de: engel lex en 2 Julio 2015, 20:09 PM
se llega un momento que uno aprende estas locuras por ocio, tambien ayudan a aprender a pensar :P por un tiempo estuve programando en eso XD
No te sangraron los ojos, los oidos por último? :xD
Realmente si lo pensáis, es un lenguaje muy, muy simple. Hay 1 puntero a una memoria inicializada toda a ceros. Solo hay operaciones para incrementar el puntero, incrementar el byte apuntado, leer y sacar por pantalla.
ASM es mucho más complejo jajaja (decenas de veces más complejo)
Pero... entonces ¿sólo se puede mostrar carácteres por pantalla con ese lenguaje? ¿No sirve para nada más? Porque no entiendo como se puede hacer un while, o un Scanner con esto... :/
PD: Muchas gracias por la explicacion Elektro ^^
Un while se hace con [] como dijo Elektro.
Es un lenguaje esotérico bastante limitado, pese a que hay gente que hace barbaridades con él xD
No fue ideado para ser un lenguaje para desarrollar aplicaciones xD
Cita de: Baal_30 en 3 Julio 2015, 17:44 PMPero... entonces ¿sólo se puede mostrar carácteres por pantalla con ese lenguaje? ¿No sirve para nada más?
Mostrar caracteres es solo una manera de interpretar los bytes, los valores asignados a cada celda.
Es un lenguaje muy extravagante, ¿para que más esperas que se utilice comunmente si no es para saciar la curiosidad de representar un texto? xD.
Cita de: Baal_30 en 3 Julio 2015, 17:44 PMno entiendo como se puede hacer un while
El loop de tipo while se hace con los símbolos [, y ], cómo ya he comentado.
Aquí tienes una IDE que incluye un generador automático de código brainfuck para cualquier cadena de texto:
http://4mhz.de/bfdev.html
Saludos!
teoricamente es tambien una maquina turing completa, por ese principio, hacer una aplicación seria infinitamente dificil