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í:
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
proyect: la 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-broma: es 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ódigo: un 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. |
4.
Un concurso de “code poetry” en Standford: Al 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.