La Singularidad Desnuda

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

Rumiando programas: Programación bovina distribuida con COW y DDX

Posted by Carlos en enero 20, 2007

Friesian/Holstein cowHace unos días hablábamos del lenguaje Homespring, y de cómo permite que el programador se concentre en lo que realmente importa: las costumbres reproductivas del salmón. Claro que tan útil como esta metáfora de la programación pueda parecer, no es la única que se puede considerar. De hecho, hay ocasiones en las que es más conveniente pensar de otro modo a la hora de abordar un problema. Por ejemplo, podemos plantearnos: ¿cómo resolvería una vaca este problema? En ese caso, la forma natural de expresar la solución sería en el lenguaje COW.

COW es un lenguaje de programación orientado a bovinos. Ya sabemos que las vacas sólo entienden la palabra «moo» (o traducido al español, «muu»), por lo que todas las palabras claves del lenguaje son variaciones en mayúscula o minúscula de la misma. Esto nos facilita bastante las cosas a la hora de documentar los programas, ya que todo lo que no sea «moo» (en cualquiera de sus formas alternativas) se tomará por un comentario. Básicamente, COW es un lenguaje imperativo en el que tenemos acceso a una memoria (en principio ilimitada) indexada por posición. En todo momento hay un puntero interno que nos indica cuál es bloque de memoria actual, y disponemos de instrucciones para desplazar este puntero hacia adelante (moO) o hacia atrás (mOo). Por supuesto, podemos modificar el contenido de la dirección apuntada, decrementándolo en 1 (MOo), incrementándolo en 1 (MoO), o fijándolo a 0 (OOO). Hay también un registro interno del/al que podemos copiar el valor de un bloque de memoria mediante MMM. La entrada/salida se realiza mediante oom (para leer un valor y almacenarlo en el bloque de memoria actual) y OOM (para imprimir el valor del bloque de memoria actual).

Lo más interesante de COW son las instrucciones que hacen referencia al control del flujo de ejecución. Tenemos así a MOO y moo que son muy similares (pero no idénticas) a while y endwhile respectivamente (usando el valor del bloque actual de memoria como condición de control: 0 es FALSE, y diferente de 0 es TRUE). Moo es una lectura/escritura condicionada al valor del bloque de memoria actual (lectura si es 0, escritura en otro caso). Finalmente, mOO ejecuta el contenido del bloque de memoria actual como si fuera una instrucción (hay un código numérico para cada una). Es importante tener en cuenta que al igual que ocurría con Homespring, en COW se retira la carga de una sintaxis estricta de los hombros del programador, no situándola en ningún lugar en particular. Así, no tiene por qué haber un moo para todo MOO (ni viceversa). Más aún, la disponibilidad de mOO proporciona la flexibilidad de LISP a la hora de manipular programas como datos, abriendo la puerta por ejemplo a la definición dinámica de bucles.

Un programa «Hola Mundo» es perfectamente factible en COW (de hecho el lenguaje es Turing-completo), pero resulta un tanto enrevesado, ya que no podemos representar texto constante de manera explícita en el lenguaje. Mucho más simple y elegante es por ejemplo un programa para calcular la sucesión de Fibonacci:

MoO moO MoO mOo
[[ bucle principal ]]
MOO
[[ imprimir primer número ]]
OOM
[[ copia temporal del primer número ]]
MMM moO moO MMM mOo mOo
[[ almacenar el segundo número en la primera posición ]]
moO MMM mOo MMM
[[ retroceder al número temporal ]]
moO moO
[[ sumarlo al primer número y almacenarlo en el segundo ]]
MOO MOo mOo MoO moO moo
mOo mOo
moo

A pesar de su elegancia, esto que hemos visto es tan sólo la punta del iceberg de lo que podemos conseguir con este paradigma de programación. Ya sabemos que el sistema digestivo de una vaca es realmente complejo, e incluye varios estómagos. Sería absurdo no explotar este hardware, y para ello podemos emplear DDX (Distributed Digestion eXtensions). DDX permite manipular hasta siete bloques de memoria simultáneamente (los bóvidos sólo tienen cuatro estómagos, pero no dejemos que esto nos limite). Para ello, se incluyen operaciones para seleccionar el estómago por defecto, así como para realizar operaciones simultáneas en todos los estómagos (véase esta página para más detalles). Con estos cambios, el programa anterior quedaría como sigue:

[[ Iniciar los dos primeros estómagos con 1s y permanecer en el segundo ]]
MoO OOM MmM MoO OOM

[[ sumar, resetear el estómago previo, guardar en el siguiente estómago, e imprimir ]]
MOO mmm MMm OOO MmM MmM MMM OOM moo

Realmente fantástico. Y es que no hay nada como poder rumiar la solución a un problema.

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

Una respuesta to “Rumiando programas: Programación bovina distribuida con COW y DDX”

  1. Programación bovina distribuida con COW y DDX

    COW es un lenguaje de programación orientado a bovinos, donde todas las palabras son variaciones de «moo». Facilita bastante las cosas a la hora de documentar los programas: todo lo que no sea «moo» son comentarios. Un ejemplo: MOO y moo equivalen…

Sorry, the comment form is closed at this time.