Programa Malbolge

0
10088
Jason y Medea, por John William Waterhouse (1907), personajes del octavo círculo de La Divina Comedia.
Jason y Medea, por John William Waterhouse (1907), personajes del octavo círculo (Malebolge) de La Divina Comedia.

Los programadores somos difíciles de entender incluso entre nosotros mismos. Puede un programador estar perfectamente hablando en marciano a un grupo de programadores, o pasar al contrario, que todos ellos estén hablando en marciano para dicho programador. Este mundo tiene muchas ramas y está en permanente cambio. Sin embargo, el cliché fácil de programador gafapasta, gordo, granudo, obsesionado con los videojuegos, friki y hacker, no es más que una mentira despiadada más, fomentada por películas y noticias algo sensacionalistas. Hay un número muy grande de gente en este mundillo que vive una vida normal, sin saber nada de temas de videojuegos, ni son hackers, ni frikis,… algunos tienen hijos, otros están casados por la iglesia católica, hacen la compra en el Mercadona, la mayoría son menos que mileuristas, están cabreados con la política y el trabajo, en la comida tienen charlas típicas de bar, ven las típicas películas de sobremesa, no han leído un libro en décadas, el único videojuego al que han jugado es el pro,… Somos tan humanos como el resto, y muchos de nosotros tampoco sabemos cuál televisión moderna es la mejor para comprar, hay quién ni siquiera sabe cómo sintonizar canales en la TDT (y también lo aprendemos sobre la marcha)[1].

Un programador, por siguiente, no tiene porque ser un crack de los ordenadores, ni saber porqué se rompen, ni sus errores. Vale, para ser buen programador, debería de saber ciertas cosas como hacer programas que no consuman mucha memoria (por ejemplo para el caso de los dispositivos móviles es necesario), aunque también debe ser capaz de medir qué criterios son los prioritarios para el usuario que lo vaya a usar, ya que el bajo consumo de memoria, aunque sea atractivo, no tiene porqué ser el mejor criterio. Puede pasar que sea más importante que un bajo consumo de memoria el que estemos más seguros que el programa no tenga errores (y por tanto, un código sencillo pero ineficiente en memoria), o su rapidez, o el aspecto de la interfaz gráfica. Programe como programe, una vez que un programador escribe el programa en código de alto nivel (esto es, en un lenguaje de programación sencillo, como Java, Python o C++), debe de ejecutar en una consola un comando para que el fichero del programa se transforme en código objeto (un código intermedio), y más tarde otra para que se transforme en el típico fichero de extensión *.exe que soléis utilizar[2], y que, dentro, sólo contiene unos y ceros, imposibles de entender para un programador[3]. Antes de transformarse en código objeto, puede pasar que se detecte (tras ejecutar el comando de consola) que el programador ha cometido algún que otro error, si es así, no se transformará en código objeto y se mostrará una serie de líneas con los errores léxicos que el programador ha cometido escribiendo el código (vamos, como el típico corrector del Word, pero menos avanzado), cuando eso ocurre solemos decir ‘no me compila’.

Cuando programa un programador, suele usar algo llamado IDE, que le facilita toda la tarea, incluso puede tener un típico corrector como el del Word que te dice los errores léxicos, sintácticos y a veces algún error semántico[4], un autocompletado de cada palabra o de fragmentos completos de código, y transformarse el programa *.exe en un par de clics de ratón. Hay veces que no, y usamos un simple bloc de notas y la consola. En mi caso, en el trabajo uso un IDE llamado Eclipse, en los estudios paso de IDEs y voy siempre a golpes de bloc de notas, consola y navegador web para mirar la documentación que necesite, incluso si estoy programando una web de trabajo para una asignatura no uso IDE alguno.

Bien, ya he explicado cómo programa el programador, y en base a qué criterios, y qué puede usar para facilitar su tarea. Antes de desvelar de dónde viene el nombre de esta sección y, por tanto, una cosa divertida, tenéis que aprender una cosa más: la programación no es más que lógica + matemática + lenguaje teórico. Esto significa que cualquier programa se puede expresar en algo llamado función computable, que puede ser expresada en una máquina de Turing o mediante el cálculo lambda.

Estos (la máquina de Turing y el cálculo lambda) son conceptos que se dan en la informática teórica que dan muchos, pero que muchos, dolores de cabeza a los futuros ingenieros o técnicos (ahora graduados en ingeniería) en informática en su segundo año de carrera. Ya que la máquina de Turing y el cálculo lambda son equivalentes, quedémonos con la máquina de Turing que pienso que es más intuitivo.

Turing decía, antes de que existieran los ordenadores, que en una máquina teórica (que nunca antes ha construido, ni se hará) con una cinta de papel infinita separada en cuadrados pequeños, un cabezal capaz de pintar en dicha cinta diferentes símbolos, pudiendo borrar símbolos de la cinta o sustituirlos por otros, y pudiendo la máquina mover la cinta hacia delante o hacia atrás del cabezal, se puede expresar cualquier función computable. Esto es, cualquier programa que puedes ejecutar en tu ordenador, puede ejecutarse en la máquina de Turing, es más la máquina de Turing cuenta con la ventaja de que, al ser su cinta infinita, su memoria también lo es.

La máquina de Turing lleva a una conclusión problemática en que me detendré otro día en explicar más detenidamente, pero dicho de forma simple y rápida, sólo si un programa puede ejecutarse en dicha máquina, puede ejecutarse en un ordenador. Y hay problemas que no pueden solucionarse en dicha máquina, luego hay programas de ordenador que jamás podremos hacer, ni aunque consiguiéramos el PC perfecto y con memoria ilimitada. El cómo se llega a esta conclusión es una curiosa historia que prometo contar en otra ocasión (al igual que una explicación más desarrollada de la máquina de Turing), porque, seguramente, me llevaría otro artículo completo, y que espero hacer divertido, porque la informática teórica es divertida, aunque en las clases pueda parecer un infierno. Pero, por ahora, lo que quiero que os quedéis es: una tarea se puede programar en un ordenador si y sólo sí se puede realizar dicha tarea con una máquina de Turing (o cálculo lambda), si no se puede realizar, jamás se podrá hacer. Más de uno dirá que, por ejemplo, gráficos impresionantes no se pueden programar con una máquina de Turing, pero resulta que los gráficos internamente en un ordenador no son más que tortuosa álgebra y trigonometría[5], y eso sí se puede hacer con una máquina de Turing que puede escribir en su cinta en cada cuadrado un símbolo diferente y procesarlo.

Basándose en esta teoría, se dice que un lenguaje de programación es Turing completo si éste es equivalente, de forma teórica y computacional, a una máquina de Turing, en el caso de que la memoria de los ordenadores fuera infinita, por supuesto. Lo que causa que la gran mayoría de lenguajes de programación sean Turing completos, por muy extraños que sean.

¿Lenguajes de programación extraños? ¿Hay algo más ‘friki’ que decir que sabes programar? Sí, y muy inquietantes. Se les suelen llamar lenguajes de programación esotéricos. Es la parte oscura y friki de la programación. Se trata de lenguajes de programación que suelen explotar al máximo la teoría de los lenguajes Turing completos, usando una sintaxis mínima (muy pocas instrucciones) para poder programar cualquier tarea. Una gran mayoría se caracteriza por ser muy difíciles de usar, además de tener como propósito ése objetivo, y otros por ser muy frikis. El objetivo de estos lenguajes no es, por tanto, realizar mejor ciertos programas, sino puramente lúdico para superar un reto o hacer algo friki.

Por lo que sé, el primer lenguaje de programación esotérico parece ser que se trató de INTERCAL, una parodia de los lenguajes de programación FORTRAN y COBOL, creado por Don Woods y James Lyons en el 1972[6].

Por culpa de INTERCAL ahora tenemos lenguajes extraños a más no poder como, por ejemplo, el diseñado para orangutanes de David Morgan-Mar, que es Ook!. Está basado en el lenguaje del bibliotecario orangután de las novelas de Mundodisco de Terry Pratchett. El lenguaje de programación sólo tiene tres instrucciones posibles: Ook. Ook? Ook! De esta forma, si hacemos un programa, en dicho lenguaje de programación, que, al hacer doble clic en el *.exe, lo único que haga es escribir en pantalla la frase “Hello World!”, el código[7] para hacer eso sería el siguiente[8]:

Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook.
Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook?
Ook! Ook! Ook? Ook! Ook? Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook.
Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook.
Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook.
Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook. Ook! Ook. Ook! Ook? Ook! Ook! Ook? Ook!
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook! Ook.

Algo más curioso es el lenguaje de programación, diseñado por Adam Lindsay, LOLCODE, el cual está basado en los memes Lolcat de Internet. Hacer dicho mismo programa anterior, en
LOLCODE, nos quedaría así[9]:

HAI
CAN HAS STDIO?
VISIBLE “HAI WORLD!”
KTHXBYE

Pero, si te interesa más la cocina, está el lenguaje Chef (también diseñado por David Morgan-Mar). El cual permite hacer programas por medio de recetas. Así el código para ‘cocinar’ un hola mundo como los anteriores casos, sería el siguiente[10]:

Hello World Souffle.

Ingredients.
72 g haricot beans
101 eggs
108 g lard
111 cups oil
32 zucchinis
119 ml water
114 g red salmon
100 g dijon mustard
33 potatoes

Method.
Put potatoes into the mixing bowl.
Put dijon mustard into the mixing bowl.
Put lard into the mixing bowl.
Put red salmon into the mixing bowl.
Put oil into the mixing bowl.
Put water into the mixing bowl.
Put zucchinis into the mixing bowl.
Put oil into the mixing bowl.
Put lard into the mixing bowl.
Put lard into the mixing bowl.
Put eggs into the mixing bowl.
Put haricot beans into the mixing bowl.
Liquefy contents of the mixing bowl.
Pour contents of the mixing bowl into the baking dish.

Serves 1.

Hay muchos más lenguajes de estos tipos. Pero como ya es hora de ir acabando, por último, existe un lenguaje de programación esotérico, cuyo único objetivo es ser el más difícil de todos. Tanto es así que recibe el nombre de Malbolge, por el octavo circulo del infierno en La Divina Comedia, de Dante: el Malebolge (o Fraudulentos). Ay va, que ‘Código Malbolge’ es el mismo nombre que la presente sección de Papel de Periódico a la que pertenecen mis artículos. Ahora sabéis de donde viene el nombre, ¿estáis preparados para ver ‘un hola mundo’ en Malbolge? Es más, creéis que seréis capaces de entenderlo algún día. Pues, por si acaso, aquí lo tenéis[11]:

(=<`$9]7<5YXz7wT.3,+O/o’K%$H”‘~D|#z@b=`{^Lx8%$Xmrkpohm-kNi;gsedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543s+O<oLm

Este lenguaje tiene una utilidad muy buena, que al ser el más difícil de entender y al conocer este lenguaje tan poca gente, si te roban el código una empresa, tardarán muchos años y mucho dinero en personal en entender qué hace. Sin embargo, para cosas más complejas es imposible usarlo. Como muestra gráfica de ello, decir que Hisashi Iizawa, programador de Malbolge, tardó 7 años en realizar un programa que muestre por pantalla la canción completa de 99 Bottles of Beer, compitiendo con varios programadores que intentaban hacer lo mismo (y a los que, por tanto, ganó por ser él el primero en lograrlo), si tienes curiosidad por ver el código pulsa en este enlace. Así que si estás pensando en intentar aprenderlo: ¡retrocede! Como curiosidad Malbolge tiene diferentes versiones, algunas de ellas son Turing completas (como Malbolge-T o Malbolge Unshackled), y otras no (¡Sorpresa! Esto es debido a que, dichas versiones, marcan limitaciones de memoria).

Notas:
[1] Aclaro: me gusta jugar en esta sección con el frikismo porque da para mucho, y sobretodo porque aligera bastante algunos contenidos pesados. Pero quería aclarar eso antes de comenzar con el presente texto, pues lo del final tiene altas dosis de frikismo y son pocos los programadores que lo conocen.
[2] Para que los tienen más conocimiento del tema: en el caso de Java o Python no llega a ser un *.exe, más bien un *.class o un *.pyc, respectivamente, pero tampoco el proceso se diferencia tanto, además hay formas de pasar los *.class y los *.pyc a un *.exe, algo necesario más de una vez.
[3] Otra vez más, para los más avanzados: Sí, sé que existe la ingeniería inversa y programas que la realizan. Pero con ello no significa que el programador pueda abrir el fichero binario *.exe y entender los unos y ceros. También decir que uso Ubuntu en casa, y por tanto sé que los ficheros binarios en Linux no tienen extensión *.exe. Pero diciendo dicha extensión queda bastante claro.
[4] Esta vez, para los que no se acuerden de lo que es léxico y semántico. En castellano tenemos errores léxicos cuando escribimos ‘OLA K ASE’, pues ‘OLA’ no lleva la letra hache y está en mayúsculas, la ka no debería ir en mayúscula y no es una palabra suelta, luego no existe, y ‘ASE’ debería ir en minúscula, comenzar por hache y llevar una ce en vez de una ese. Un error sintáctico, en castellano, es cuando la oración no cumple con las reglas de sintaxis que tenemos en el castellano (ya sabéis, el tema del sujeto, predicado, complemento directo,…). En cambio, un error semántico sería cuando en castellano decimos ‘He dormido un poco de todo’, fíjate que es correcta léxica y sintácticamente pero no semánticamente, al contrario que la oración ‘He comido un poco de todo’ que es correcta léxica, sintáctica y semánticamente. Todo esto tiene muchísimo que ver con la informática teórica y, en especial, con el funcionamiento de los compiladores, porque un compilador puede analizar un código (un texto escrito en un lenguaje al fin y al cabo) léxica y sintácticamente (sí, un análisis sintáctico de un código, casi igualito a cuando realizabas uno en Lengua Castellana y Literatura en el instituto) pero muy pocos pueden realizar algún análisis semántico, y menos uno al 100%. Tal vez el día que la IA llegue a la edad moderna (ahora estamos en su edad de piedra), se pueda.
[5] Es curioso porque la mayoría de gente que se mete en una carrera de informática, piensa que va a aprender a trabajar con gráficos. Luego resulta que no sólo no hay asignaturas obligatorias o troncales para ello, sino que muy poca gente se atreve a escoger las optativas para programación gráfica. Son asignaturas muy tortuosas. Trabajar con gráficos no es sólo problemas de álgebra y, sobretodo, trigonometría, sino que, en ocasiones, es muy tedioso y desesperante, y muy poco entendido por la gente que no conoce este tipo de programación (después de horas haciendo un tonto símbolo en 2D que se mueve y hace cosas con eventos del ratón, te sientes eufórico y se lo enseñas a alguien que no tiene ni idea de programación gráfica y te dice ‘Ah, vale, muy bien’, como si no hubieras hecho nada). Cuando programas con gráficos hay muchas veces que es impresionante lo que comienzas a valorar que existan teorías sobre los redondeo y los errores numéricos, temas que no suelen caer en exámenes de las asignaturas de matemáticas de las carreras de ingeniería informática. Y de esto sé porque, muchas veces, en mi trabajo he trabajado dibujando gráficos 2D que se giran y reaccionan a eventos del ratón.
[6] Por cierto el culpable de que INTERCAL tenga una versión actual y sea mantenida es Eric S. Raymond, autor del ensayo, a favor del código libre, La catedral y el bazar, hacker, anarcocapítalista, neopagano (creyente de supersticiones absurdas como la brujería tradicional o la Wicca), y defensor de poseer y utilizar armas de fuego. En mi opinión, al margen de las ideas más republicanas, de las extrañas creencias y de los conflictos de este personaje, pienso que es bueno que una figura como Raymond, con ese currículo, defienda el software libre, y es más, que sea programador que, según él, haya sido de los primeros que participó en GNU también me parece bien, pues esto muestra que la profesión y estar de acuerdo con el software libre no implica el tipo de persona que seas, ni al partido que votes. Lo que causa que más gente diversa pueda elegir software libre independientemente de sus ideales.
[7] A hacer este tipo de programa, los programadores, lo solemos llamar, de forma coloquial, ‘hacer un hola mundo’. Y en un lenguaje de programación normal y moliente, como Python, el código para ello es: print(“Hello World!”)
[8] Código extraído de http://helloworldsite.he.funpic.de/hello.htm#Ook Yo aprendería Ook!, pero no tengo tiempo.
[9] Código extraído de http://es.wikipedia.org/wiki/LOLCODE#Ejemplo_1 Y aprendería LOLCODE, pero, como diría José Mota, hoy no, mañana.
[10] Código extraído de http://en.wikipedia.org/wiki/Chef_(programming_language) Ya me cuesta cocinar los días laborables, para ahora también hacerlo un sábado.
[11] Código extraído de http://helloworldsite.he.funpic.de/hello.htm#Malbolge ¿No esperarías que lo fuera a programar yo?

Dejar respuesta

Please enter your comment!
Please enter your name here

Límite de tiempo se agote. Por favor, recargar el CAPTCHA por favor.