Duda Brainfuck

Iniciado por Baal_30, 2 Julio 2015, 13:06 PM

0 Miembros y 1 Visitante están viendo este tema.

Baal_30

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 :)
«La suerte es el cuidado de los detalles». -Winston Churchill

Eleкtro

#1
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   8


Despues 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.



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



Saludos.








Spectatorem

Mier.da!! Estas bien demente para entender esto  Elektro xD

engel lex

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
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Spectatorem

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

ivancea96

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)

Baal_30

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 ^^
«La suerte es el cuidado de los detalles». -Winston Churchill

ivancea96

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

Eleкtro

#8
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!








engel lex

teoricamente es tambien una maquina turing completa, por ese principio, hacer una aplicación seria infinitamente dificil
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.