miércoles, 16 de septiembre de 2015

Un poeta compilando un .obj

Desde que empecé a estudiar informática me da vueltas una idea medio extraña que relaciona dos palabras a las que muy pocas veces se las ve juntas en una misma oración: poesía y programación. En concreto: ¿se puede escribir un poema en un lenguaje de programación? ¿Vale la pena mezclar una herramienta expresiva del ser humano, con un lenguaje diseñado exclusivamente para entendernos con las computadoras? ¿Podrá ser entendido por los dos, por uno, o por ninguno?
Imaginé una serie de "poemas" escritos en distintos lenguajes de programación. Cuando pienso en ellos la sensación es extraña: son extraños. Pero antes de hablar es necesario, a modo de divulgación científica, esclarecer qué es y para qué sirve un lenguaje y, más específicamente, qué es y para qué sirve un lenguaje de programación.
Wikipedia define a un lenguaje como un sistema de comunicación estructurado, con una serie de requisitos. La palabra que hace ruido es comunicación. ¿Para qué sirve un lenguaje si no es para comunicar? Cuando levanto una mano para saludar a un conocido, cuando digo “callate la boca”, cuando un perro mea al pie de un árbol, etc., en todos estos casos hay alguien o algo que se expresa para que otro reciba su mensaje. No tengo interés en volver a las clases de secundaria con el famoso cuadro de mensaje, emisor y receptor, canal, bla bla bla: la función de los lenguajes es comunicar.
Por otra parte, siguiendo la línea de la definición, se aclara que este sistema de comunicación, este sistema que tiene la función primordial de comunicar a los que lo usan, es estructurado. Que sea estructurado quiere decir que hay orden o patrones de relación entre sus componentes (a los componentes se los denomina, en conjunto, como el léxico de un lenguaje). Los componentes del lenguaje castellano, por ejemplo, son palabras. Las palabras tienen relación entre sí: el adjetivo que modifica a un sustantivo tiene que concordar con éste en género y número. No puedo decir “las ventanas son roja”; lo correcto es “las ventanas son rojas”. Este tipo de reglas a seguir corresponde a la sintaxis de un lenguaje que, definida a lo gringo, hace referencia a la manera en la cual se escriben y se combinan las palabras. Junto a la sintaxis de un lenguaje, se encuentra su semántica, más orientada al significado que pueda tener cada palabra. A modo ilustrativo: decir que “el árbol juega” es sintácticamente correcto, pero no semánticamente. Los árboles, al menos por lo que yo sé, no juegan.
Hasta acá, todo aprendido en la primaria. Ahora, ¿cómo ensamblamos esto con las computadoras y los programas? Parece que no hay ningún tipo de vínculo. Sin embargo, pensar así es errar: las máquinas también se comunican por medio de lenguajes. Entre ellas, y con los humanos. Las máquinas entienden determinado tipo de lenguajes. Veamos.
El término “lenguaje” se divide en tres ramas: a) lenguaje humano, b) lenguaje animal, y c) lenguaje formal. El inglés, castellano, francés, ruso, corresponden a la primera división. Pueden llamarse, también, lenguajes naturales. Las formas auditivas, olfativas, etc., de comunicarse de los animales, son parte de la segunda división. Y, por último, se encuentran ciertos lenguajes regidos por normas más estrictas que los anteriores, más matemáticos que lingüísticos: los lenguajes formales. Dentro de ellos están los lenguajes de programación.
Hay diferencias claras entre lenguajes naturales y formales. Me interesa mostrar una. Veamos un ejemplo: si yo digo que mi perra es juguetona, la palabra “perra” hace referencia a Luli: un canino de sexo femenino que vive en mi casa hace más o menos quince años. Por otra parte, si mi hermana me hace enojar, y le digo “sos una hija de perra” (obvio que no le voy a decir esto porque se me cagaría de risa en la cara, pero entiendan), ahora la palabra “perra” sugiere algo totalmente distinto: puta. ¿Qué relación hay entre “Luli” y “puta”? Ninguna. Mi perra es virgen.
Lo que quiero mostrar acá es que en los lenguajes naturales –en el ejemplo, el castellano-, hay una característica llamativa: una misma palabra puede referir cosas distintas. Este fenómeno se denomina ambigüedad, y es apasionante. Toda la literatura, todo el arte en general, hace uso de la ambigüedad, con objetivos estéticos.
En los lenguajes formales no existe ambigüedad. Para entenderlo, invoquemos a la matemática. Su definición está siendo discutida. Los especialistas no se ponen de acuerdo sobre si es un lenguaje formal, una ciencia formal, una ciencia, etc. Pero para nuestro caso viene bien una igualdad básica: si yo afirmo que dos más dos es igual a cuatro, observamos que esto es por demás de claro, lo único que se me viene a la cabeza es un dos sumado a otro dos, y el resultado: cuatro. No me pongo a pensar qué quiero decir con dos, con más, con igual, con cuatro. El significado es único, no ambiguo. Bueno, lo mismo ocurre con el resto de los lenguajes formales: si se dice algo, el significado de ese algo es único. No cabe interpretación del emisor ni del receptor del mensaje. Tanto el que emite como el que recibe entienden exactamente lo mismo. Esto quiere decir que los lenguajes formales son explícitos. Todo está a la luz, no hay nada escondido.
La computadora -conjunto de circuitos integrados y otras boludeces más- no funciona como los humanos. La computadora no entiende lo que significa la ambigüedad. Cada cosa que puede interpretar o hacer una computadora tiene un significado específico. No piensa si “perra” hace referencia a “Luli” o a “puta”. Esto me hace acordar a un profesor de una materia que tuve el año pasado que repetía muy seguido una frase: “¡el autómata –la computadora- es un completo idiota!”. Es un completo idiota porque el ser humano tiene que decirle qué es lo que hay que hacer: cada programa, sistema operativo, driver, etc., cada componente, que la hace una herramienta tan potente, está construido por el ser humano.
Por esta razón, el ser humano tiene que tratar de entenderse con la computadora, para decirle lo que hay que hacer. Ella, si nos ponemos estrictos, lo único que comprende es un lenguaje: el lenguaje binario, también llamado lenguaje de máquina. Éste está compuesto por sólo dos símbolos, el cero y el uno, y ellos se relacionan con los pulsos altos y bajos de los circuitos de la computadora. Pero no es mi intención complicar la cosa. En resumidas cuentas, una computadora hace cosas escritas en códigos que se componen de estos dos números. Por ejemplo, esta frase

1000101111111010010101011010101001

puede significar una orden como “sumar los datos almacenados en las direcciones 345 y 546”. O “sacar una foto al pelotudo que quiere entrar a una computadora que no es suya”, o “asignar un millón de dólares a la cuenta bancaria de Fulanito de Tal”. No lo sé.
Resumiendo, tenemos dos caminos: por un lado, las personas con sus lenguajes ambiguos, llenos de connotaciones (ironía, enojo, orden), expresivos, imperfectos… humanos. Por el otro, las computadoras con su limitado pero potente lenguaje de máquina. Si pensamos en ambos caminos, vemos una regla: el usuario de un lenguaje se mete en un gran problema si quiere escribir o interpretar el lenguaje del otro. ¿Qué quiere decir esto? A la máquina le resulta imposible entender el lenguaje humano y al humano le resulta extremadamente engorroso escribir o interpretar el lenguaje de máquina. No imposible. Engorroso.
En el pasado, los primeros programadores –esas personas que les dicen qué hacer a las máquinas- escribían en lenguaje binario. Obviamente, si tenés que escribir un programa de cien mil instrucciones valiéndote tan solo de ceros y unos, vas a errar. Probabilidad 1/1. Y un error significa revisar todo el programa escrito. Es decir, se perdía muchísimo tiempo en encontrar fallas, sumado a esto que los programas no tenían la calidad que tienen ahora. Había que solucionar este problema. Había que hacer de la programación un proceso más eficaz. Entonces, se pensó algo llamativo: ¿qué tal si hacemos una especie de intersección entre los lenguajes de máquina y los lenguajes humanos? ¿Qué tal si creamos un lenguaje que pueda interpretar fácilmente la máquina y, a su vez, tenga un parecido con el habla de los humanos? Este pensamiento –y su realización- significó una evolución importantísima en el área de las computadoras: se inventaron los lenguajes de programación.
Un lenguaje de programación entra en la categoría de lenguajes formales –definidos explícitamente, no ambiguos, bla bla bla-, y tienen la misma función que los lenguajes de máquina: decirles a ellas qué es lo que tienen que hacer. La diferencia es que son, como dijimos, más humanos. Generalmente, las acciones que se quieren realizar se expresan por medio de palabras claves, es decir, componentes del léxico del lenguaje, las cuales tienen funciones específicas. Además, se les puede dar nombre a direcciones de memoria (éstas son lugares en donde la máquina va guardando datos que sirven para la ejecución del programa: un nombre, una fecha, un importe, etc.).
Existen muchísimos lenguajes de programación: Fortran, Pascal, C, C++, Python, Java… y así hasta llenar una larga lista. Cada uno tiene sus agregados, simplificaciones, pero a grandes rasgos todos responden a la misma necesidad: crear programas. Además, sus métodos de escritura son similares, en contraposición con la diferencia que puede haber entre lenguajes naturales: “hola” en inglés se dice “hello”, en ruso “Привет”, y en chino “您好”. Pequeñas variantes.
Ejemplifiquemos lo dicho anteriormente:
1.
Supongamos que quiero decirle a la máquina que, luego de determinado proceso, muestre en pantalla (más específicamente, en la ventana de mi programa) esta frase: “Te has ganado un millón de dólares.”. En Pascal, dicha instrucción se podría escribir así:

write (‘Te has ganado un millón de dólares.’);

En C, la cosa cambiaría un poquito:

printf (“Te has ganado un millón de dólares.”);

Observen que para explicarle a la computadora que quiero que muestre un mensaje en la pantalla no necesito escribir una tira de ceros y unos de un renglón de longitud, sino una palabra conocida, cercana a nosotros: escribir, imprimir.
2.
Ahora imaginemos que deseamos guardar la contraseña de un usuario de un banco en un determinado lugar de la computadora. Recordemos que las contraseñas pueden cambiarse a lo largo del tiempo: esto quiere decir que la contraseña de un usuario no es una constante, sino una variable. Supongamos, para simplificar las cosas, que la contraseña está compuesta sólo por dígitos. Es decir, es un número entero.
Para guardar determinado dato ingresado por la persona que usa el programa (usuario), se crean variables. Crear quiere decir, en realidad, darle nombre a un lugarcito de memoria de la computadora. A su vez, cada variable responde a un tipo de dato: enteros, caracteres, cadenas de caracteres, etc. Son maneras de clasificarlos, para que se nos haga más fácil su manejo. En nuestro caso tenemos, como dijimos, un entero.
Si pensamos la situación, vemos que la solución de nuestro problema se puede llevar a cabo por tres pasos:
I. Crear la variable “contraseña”.
II. Pedirle a la persona que usa el programa que ingrese su contraseña.
III. Luego, leer esa contraseña y guardarla en su respectiva variable.
Si pasamos esto a un lenguaje de programación, como el C, la cosa quedaría así:

int contraseña;
printf (“Ingrese su contraseña”);
scanf (“%d”, &contraseña);


Ignorando el %d, ya que no viene al caso saber su función, observamos que las expresiones no distan mucho de los pasos escritos anteriormente, en castellano, comprensibles por todos nosotros.
Hay que aclarar, a esta altura, que para que la máquina pueda entender las instrucciones escritas arriba es necesario que se lleve a cabo un procesamiento automático llamado compilación. La compilación traduce los textos escritos en cualquier lenguaje de programación a lenguaje de máquina (recordemos que en realidad la computadora sólo lee ceros y unos). Sería como una especie de Traductor de Google, pero entre un humano y una computadora.

Por otra parte… es obvio que un programa no consta sólo de entradas de datos, mensajes y creaciones de variables. Hay otro tipo de estructuras, sentencias, etc., que añaden complejidad y alcance a los lenguajes de programación (es decir, capacidad para resolver múltiples problemas). Pero lo importante –acá- es remarcar esto: todos ellos están cerca del habla humana. Aun no siendo especialista en el tema, uno intuye lo que se quiere decir en las líneas de un código de programa.
Al ser esto cierto, me pregunto: ¿no sería un desafío interesante el hecho de intentar comunicar sentimientos, rencor, orgullo, amor, incertidumbre, por medio de lenguajes técnicos y de propósitos específicos como son los lenguajes de programación? ¿No estaría bueno desviar el objetivo principal de los lenguajes de programación, es decir, la comunicación hombre-máquina, por algo más humano, algo hombre-hombre? Surfear en las condiciones estrictas que nos establecen estos lenguajes, ¿no es acaso un ejercicio estilístico, al igual que el de respetar la cantidad de sílabas en un verso de un soneto? Demás está decir que, desobedeciendo algunas reglas y siguiendo este impulso, es probable que no logremos crear programas, pero sí textos literarios. Pienso que el poema es la composición literaria que más se adecúa a los requisitos de la idea en cuestión, ya que cuentos, relatos, novelas, guiones de cine, pecan en longitud.
La primera vez que reuní en una misma idea a la poesía y la programación, sentí vergüenza. Vergüenza de que alguien pudiera estar leyendo mis pensamientos. Mezclar Pablo Neruda, Nicanor Parra, Borges, Walt Whitman, amor, desamor, olvido, memoria, metáforas, con iteraciones, estructuras de control, Pascal, liquidación de sueldos… Rídiculo. Una locura.
Por suerte, hace un par de días, después de dejar madurar el pensamiento por un año, se me ocurre googlear “poemas escritos en lenguajes de programación”. Me llevé una sorpresa: hay gente a la que se le pasó por la cabeza lo mismo que a mí. Gente que vio una posibilidad de literatura en el seno de la programación. Un par de nombres que idearon proyectos innovadores:
1.
Code poems proyectla iniciativa es del ingeniero y artista Ishac Bertran. A raíz de una discusión con sus amigos, en donde plantearon la posibilidad de identificar el autor de un código escrito en lenguaje de programación por medio de su estilo de programación, surge una analogía con la literatura: fácilmente reconocemos un texto de Cortázar, de García Márquez, gracias a sus respectivos estilos, que se repiten a lo largo de sus libros.
Bertran propuso editar un libro comunitario de poemas escritos en cualquier lenguaje de programación, junto con la lógica que los produce, para “analizar las posibilidades comunicativas de los lenguajes informáticos”. Acá la noticia.
2.
Una pseudo-bromaes una entrada de una página de programadores que muestra un poema de amor de Lautreamont escrito en lenguaje PHP (programación para páginas web), aclarando, casi en tono de broma, que los geeks (amantes de la tecnología) también pueden sentir cosquillas en la panza. El poema:




Y su traducción:

“Si me quieres, te querré más y más a cada instante mientras viva, porque si no me quieres no soy nada”.

3.
En busca del primer poema escrito en códigoun post de un blog que, a primera vista, se sugiere prometedor. El tema principal es, como dice el título, encontrar el primer poema escrito en algún lenguaje de programación. Pero no encuentran un poema: encuentran un libro. Poèmes Algol, de Noël Arnaud. Arnaud fue un escritor miembro de la OuLiPo, un grupo de poetas y escritores que tenían como objetivo hacer de la literatura un ejercicio de estilo: inventaban condiciones un tanto matemáticas para la escritura de sus obras. Recuerdo siempre una anécdota sobre esta manga de locos: Georges Perec, uno de mis escritores favoritos, y miembro del grupo en cuestión, se planteó escribir una novela de aproximadamente 300 páginas con un limitante: la letra “e” (la más usada en el francés, como la “a” en el castellano) no podía aparecer en ningún lado. El resultado fue La disparition. Cuando el editor la leyó, la juzgó poco interesante. Luego de su publicación, atendió a la característica principal de la novela y tuvo que volver sobre sus palabras.
Noël Arnaud.
Otro detalle llamativo es que, según lo leído en el post, Google utiliza una técnica parecida a la poesía en código para decidir quiénes pueden trabajar en su compañía: uno de los ejercicios que tienen que hacer los candidatos a empleados de la gran multinacional es, por ejemplo, “describir a un pollo por medio de un lenguaje de programación”.El libro de Arnaud tiene como condición el hecho de escribir poemas utilizando las palabras claves del lenguaje Algol, el padre de todos los lenguajes de programación. Un libro entero hecho a base de una veintena de palabras. No es joda.
4.
Un concurso de “code poetry” en StandfordAl parecer, la idea de combinar poesía y programación no es tan ridícula, a juzgar por esto. Sí, un concurso de poesía escrita en código llevado a cabo por la Universidad de Standford. La ganadora, Leslie Wu (por lo que veo, china o japonesa. Regla general: en China o en Japón está inventado todo –absolutamente todo- lo que estás pensando, o vas a pensar, inventar) escribió un poema/programa (dos pájaros de un tiro) que, al ejecutarlo –es decir, al clickear sobre el programa-, “desvela el capítulo veintitrés del Libro de los Salmos con tres robóticas voces distintas”. Su nombre: “Say 23”.
Este rejunte es, más que nada, la confirmación de un latido: la poesía escrita en código se perfila como una buena apertura de la literatura, por un lado, y de la programación, por el otro, a caminos inexplorados, que necesitan de personas que los recorran. Los agoten. Los expriman.
Por otra parte, queda demostrado que las disciplinas aparentemente rígidas, técnicas (y aburridas para algunos), como la programación, esconden en su núcleo un abanico de posibilidades expresivas.
Si vamos al caso, la mayor parte de las cosas que hace el ser humano convergen en un objetivo: crear. Entonces, creemos. Está bueno.