La Singularidad Desnuda

Un universo impredecible de pensamientos y cavilaciones sobre ciencia, tecnología y otros conundros

Homespring, porque la programación no es como un río, pero qué caray, debería serlo

Posted by Carlos en enero 14, 2007

Bear catching salmonHay miles de lenguajes de programación, cada uno de los cuales es útil para algo, aunque sólo sea como divertimento para nerds. Mucho de esto último tiene el lenguaje Homespring, que MarkCC nos reseña en su blog. Homespring es un lenguaje que podríamos clasificar como declarativo: básicamente un programa especifica una especie de circuito funcional, por el que durante la ejecución irán fluyendo datos. También hay quien lo clasifica como un lenguaje de programación “orientado a metáfora“, lo cual es cierto, pero no aclara mucho. Si añadimos que el nombre del lenguaje es un acrónimo de Hatchery Oblivion through Marshy Energy from Snowmelt Powers Rapids Insulated but Not Great quizás quede más claro de qué metáfora estamos hablando, pero si no es así, la imagen adjunta puede ayudar a centrarnos.

Homespring es uno de esos lenguajes en los que programar las tareas más sencillas puede resultar todo un desafío, y ahí reside precisamente parte de su encanto: cada programa es un rompecabezas matemático, en el que la estética juega un papel decisivo. ¿Y qué aspecto tiene un programa en Homespring? Pues se parece mucho a un poema en inglés (o en español, si se hacen las correspondientes traducciones, aunque creo que eso complicaría bastante las cosas). De hecho, dados dos programas equivalentes, es preferible aquél que resulte más poético y armonioso al oído. ¿Y cómo es posible que un poema pueda representar algo tan objetivamente matemático como un algoritmo? Ese es uno de los logros del lenguaje. Para entenderlo, ignoremos por el momento la semántica de las palabras que componen el poema, y centrémonos en este último como una secuencia de tokens. Usaremos el espacio en blanco para separar estos tokens, y el punto (‘.’) como carácter de escape (como la barra inclinada en C). Por ejemplo, Hola Mundo son dos tokens, pero Hola. Mundo es uno sólo (para complicar las cosas, si queremos que el carácter punto forme parte del token, no ponemos dos puntos seguidos, sino que se usa un espacio en blanco previo). Esta secuencia de caracteres da lugar a un árbol sintáctico sabiendo que (1) cada token es hijo en el árbol del token anterior, salvo que (2) el anterior sea un token vacío (dos espacios en blanco consecutivos), lo que indica que hay que subir un nivel en el árbol. Por ejemplo, el programa siguiente (espacios sustituidos por ‘_’ para mayor claridad):

bear_hatchery_Hello,._World_.__powers

da lugar al árbol sintáctico que se muestra a continuación.

Hello World in HomespringPara ejecutar este programa, un conjunto de elementos activos (que podríamos denominar “agentes computacionales”, pero que denominaremos “salmones”) comenzarán a recorrer el árbol, realizando acciones y cambiando su dirección en función de sus propiedades y de las de los nodos del árbol que visiten. Concretamente, es preciso saber hay dos formas de moverse en el árbol: de la raíz a las hojas (que llamaremos “corriente arriba”), y de las hojas hacia la raíz (“corriente abajo”). Asimismo, cada salmón tiene asignado un estado (joven o maduro, dependiendo de si ha procreado o no), y una etiqueta. Los datos de entrada son salmones que van corriente arriba, hasta que encuentran un nodo con su misma etiqueta, o una hoja. En ese momento se reproducen, pasando a ser un salmón maduro, y dando lugar a un salmón joven con la etiqueta del nodo en el que tiene lugar la reproducción. Ambos salmones se dirigen entonces corriente abajo, hasta llegar a la raíz, momento en el que sus etiquetas son escritas en pantalla. La riqueza del lenguaje está en que hay una serie de nodos en el árbol que pueden hacer que este simple comportamiento sea mucho más complejo. En nuestro ejemplo anterior dichos nodos son:

  • bear: se come (destruye) cualquier salmón maduro.
  • hatchery: crea un salmón joven con etiqueta ‘homeless‘ que envía corriente arriba, pero sólo si recibe energía de uno de sus hijos.
  • powers: transmite energía al nodo superior en el árbol

De esta manera, en el ejemplo anterior, ocurriría lo siguiente: powers le envía energía a hatchery, que crea un salmón joven; el salmón joven llega al nodo Hello, World., que al ser una hoja causa que el salmón se reproduzca. Ahora hay aquí dos salmones: uno maduro con etiqueta ‘homeless‘, y uno joven con etiqueta ‘Hello, World.‘ ; estos dos salmones nadan corriente abajo hasta llegar a la raíz; bear se come al salmón maduro, y el salmón joven llega al océano, imprimiendo su etiqueta: ‘Hello, World.‘ Evidentemente, mientras estos salmones hacían su recorrido, powers le seguía enviando energía a hatchery, que crearía más salmones jóvenes, con lo que al final el mensaje anterior se escribiría en pantalla una y otra vez, en un bucle sin fin. Si se quiere detener el proceso, hace falta un programa como el siguiente:

Universe_of_bear_hatchery_says_Hello._World!.
_It___powers_____the_marshy_things;
the_power_of_the_snowmelt_overrides.

En este programa hay que tener en cuenta que el nodo snowmelt manda nieve fundida corriente abajo, que el nodo marshy retiene durante un paso la nieve fundida, y que en el momento en que esta nieve fundida llegue a Universe, el programa termina. Elegante, ¿verdad?

Pueden verse más bellos programas en Homespring en el tutorial disponible aquí. La programación vuelve a ser un arte.

Enva a Blog Memes Enva a del.icio.us Enva a digg Enva a fresqui Enva a menéame

Anuncios

2 comentarios to “Homespring, porque la programación no es como un río, pero qué caray, debería serlo”

  1. JJ said

    Prefiero el Perl, la verdad. Se pueden escribir poemas, pero sin pescados. Solo camellos (y cebollas)

  2. Carlos said

    Camellos y salmones están más próximos de lo que piensas. Fíjate que hay un intérprete de Homespring en Perl…

Sorry, the comment form is closed at this time.

 
A %d blogueros les gusta esto: