Alumnas Level Up: Francisca Retamal
10 abril, 2018

¿Qué hacía realmente el programa de Ada Lovelace?

Imagen obtenida de History.com

El siguiente post es una traducción de una de nuestras voluntarias del post original What Did Ada Lovelace’s Program Actually Do? Publicado en Two-Bit story, un sitio de Sinclair Target, donde explora y relata la historia de la computación con foco en quienes se dedican e interesan en el área. Como es programador, en el post original, él comenta el contexto histórico que transformó a Ada Lovelace en la primera programadora, mostrando también la interpretación de este programa hecha por él en lenguaje C, que calculaba una de las series de los números de Bernoulli.

 

La historia de cómo se fundó Microsoft es de los episodios más famosos en la historia de la computación. En 1975, Paul Allen voló hacia Albuquerque para mostrar el intérprete de BASIC que él y Bill Gates habían escrito para el microcomputador Altair. Como ninguno de ellos tenía un Altair funcionando, Allen y Gates probaron su intérprete usando un emulador que ellos escribieron y corrieron en un sistema computacional en Harvard. El emulador estaba basado solamente en las especificaciones publicadas para el procesador Intel 8080. Cuando Allen corrió el intérprete en un Altair de verdad -frente a la persona que él y Gates esperaban que compraran su software-, no tenía idea si funcionaría. Y funcionó. Al mes siguiente, Allen y Gates oficialmente fundaron su nueva compañía.

 

Más de un siglo antes que Allen y Gates escribieran su intérprete de BASIC, Ada Lovelace escribió y publicó un programa. Ella también escribió un programa para un computador que sólo había sido descrito para ella. Pero su programa, a diferencia del intérprete Microsoft BASIC, nunca corrió, porque el computador en el que ella pensaba, nunca se construyó.

 

El programa de Ada Lovelace es comúnmente llamado el primer programa de computador. No todos están de acuerdo. Su legado es uno de los tópicos más discutidos de la historia de la computación. Walter Isaacson ha escrito que la disputa sobre su mérito, constituye “una especialidad académica menor”. Inevitablemente, el hecho de que Lovelace fuera una mujer, hace de esta disputa algo mayor. Historiadores han citado todo tipo de evidencia para argumentar si su mérito es merecido o no. Pero ellos parecen pasar menos tiempo explicando los detalles técnicos de su programa, lo que es muy desafortunado, ya que los detalles técnicos son la parte más fascinante de la historia. Quién no quiere saber cómo un programa escrito en 1843 pretendía funcionar?

 

Sinceramente, el programa de Ada Lovelace no es fácil de explicar, y son las implicancias de su programa lo que lo hacen tan destacable. Sea o no sea ella reconocida como “la primera programadora”, su programa contaba con un rigor que sobrepasa cualquier cosa que hubiese habido antes. Ella pensó que cuidadosamente sobre cómo las operaciones podían ser organizadas en grupos que pudieran repetirse, es decir, inventando un loop. Ella se dio cuenta de la importancia que tenía trazar el estado de una variable a medida que cambiaba, introduciendo notación para ilustrar esos cambios. Yo, como programador, estoy sorprendido de cómo lo que Ada Lovelace hizo, es muy similar a la experiencia de escribir software hoy.

 

Mirando de cerca su programa, ella lo diseñó para calcular los números Bernoulli. Para conocerlos, hay que retroceder unos miles de años hacia el inicio de uno de los problemas matemáticos más antiguos.

 

Suma de potencias

Los Pitagoreanos vivían en las costas del Mediterráneo e idolatraban los números. Dentro de sus pasatiempos se encontraba hacer triángulos de piedras como el cuarzo.

 

 

Una piedra triangular seguida por una fila de 2 piedras, hacían un triángulo compuesto por 3 triángulos. Al sumar otra fila de 3 triángulos, se obtiene un triángulo hecho de 6 triángulos. Un triángulo de 6 filas, contenía 21 triángulos (recordemos que son piedras). Pero, cuántas piedras contiene un triángulo de 423 filas?

 

Lo que los Pitagoreanos buscaban era una nueva forma de calcular sin realizar la suma completa:

Ellos eventualmente notaron que si pones 2 triángulos del mismo tamaño de forma opuesta, se forma un rectángulo, y que se puede obtener el área del rectángulo dividiendo por 2 el número de piedras en cada triángulo.

 

Arquímedes posteriormente exploró un problema similar. Él estaba interesado en la siguiente serie:

Puedes visualizar esta serie imaginando una pila de cuadrados grandes (hechos de pequeños cubos), uno arriba del otro, formando una pirámide. Arquímedes quería saber si había una forma fácil de saber cuántos cubos podrían necesitarse para construir una pirámide de, por ejemplo, 423 niveles. Él creó una solución que también permitía interpretación geométrica.

 

Tres pirámides pueden calzar juntas para crear un prisma rectangular con una pequeña extensión de un cubo al final. Esa pequeña extrusión sucede por un triángulo que obedece a las mismas reglas que los Pitagoereanos usaron para hacer sus triángulos de piedras. (Este video puede ser de ayuda para explicar la idea expuesta ). Así que el volumen de toda la figura, sería dada por la siguiente ecuación:

Al sustituir la ecuación de Pitágoras de la suma de los primeros n enteros y aplicar algo de álgebra, se obtiene:

En el 499, el matemático y astrónomo de India llamado Aryabhata, publicó un trabajo conocido como la Aryabhatiya, que incluía una fórmula para calcular la suma de cubos:

Una fórmula para la suma de los primeros n positivos enteros elevado a 4 no fue publicado hasta 500 años después.

 

Hasta ahora podrías preguntarte si hay un método general para encontrar la suma de los primeros n enteros elevados a k, que es lo que los matemáticos en algún momento también se preguntaron. Johann Faulhaber, matemático alemán y más o menos “numerólogo”, podría calcular sumas de enteros elevados a 17, y lo publicó en 1931. Pero eso le tomó muchos años y no llegó a una solución general. Blaise Pascal finalmente obtuvo en 1665 un método general, el que requería saber primero cómo calcular la suma de enteros elevados a potencias menores, es decir, para calcular la suma de los primeros n positivos enteros elevados a 6, primero debías saber cómo calcular la suma de esos mismos n enteros elevados a 5.

 

Una forma más práctica y general de la solución fue publicada luego de la muerte del matemático suizo Jakob Bernoulli, quien murió en 1705.  Bernoulli comenzó a dividir fórmulas calculando la suma de los primeros n positivos elevados a 1, 2 y 3. Esto tenía forma de polinomio, por lo que lucía así:

Usando el Triángulo de Pascal, Bernoulli se dio cuenta que los polinomios siguen un patrón predecible. Esencialmente, Bernoulli descompuso los coeficientes de cada término en dos factores: uno que podía determinar usando el Triángulo de Pascal, y el otro que podía derivar de la interesante propiedad de que todos los coeficientes en un polinomio parecían siempre aumentar en 1. Obtener el exponente al que elevar cada término era sencillo, porque también tenían un patrón. Y el factor al que cada coeficiente debía ser calculado utilizando la regla de “aumentar en 1”, formaban una secuencia conocida como los números de Bernoulli.

 

Su descubrimiento no significó que calcular la suma de los primeros enteros positivos elevados a un número k fuera trivial, porque para calcular la suma de los primeros enteros elevados a k, se debe conocer cada número de Bernoulli, que sólo puede ser obtenido calculando el número de Bernoulli previo, sin embargo, calcular una serie larga de sus números era más sencillo que derivar la suma de cadas potencia, por lo que su descubrimiento fue un avance para las matemáticas.

 

Charles Babbage

Charles Babbage nació en 1791, casi 100 años después de la muerte de Bernoulli. Siempre he tenido la idea de que Babbage diseñó y nunca construyó un computador mecánico. Pero nunca he entendido completamente cómo un computador debía funcionar. Las ideas básicas suelen no ser difíciles de imaginar, lo que es bueno. El programa de Lovelace estaba diseñado para correr en una de las máquinas de Babbage, así que necesitamos conocer brevemente cómo esas máquinas funcionaban.

 

Babbage diseñó 2 máquinas computadoras mecánicas. La primera se llamaba Difference Engine (Motor diferencial). Antes de la calculadora de bolsillo, la gente usaba tablas logarítmicas para calcular el producto de números muy grandes. (Hay un video de Numberphile que muestra cómo se hacía esto.). Conceptualmente las tablas logarítmicas grandes no son difíciles de crear, pero la tarea requería de muchos otros cálculos que en el curso de su ejecución, podían contener errores. Babbage, frustrado, quería crear una máquina mecánica que pudiera tabular logaritmos libres de errores.

 

La máquina Difference Engine (Motor diferencial) no era un computador, porque lo que hacía era sumar y restar. Tomó ventajas de un método visualizado por el matemático francés Gaspard de Prony, que descompuso en 8 pasos el proceso de tabular logaritmos, y que incluían sumas y restas, permitiendo que personas sin conocimientos matemáticos específicos pudieran trabajar produciendo tablas. Su método, conocido como el método de división diferencial, podía ser usado para tabular cualquier polinomio. Los polinomios, a la vez, podían ser usados para aproximar funciones logarítmicas y trigonométricas.

 

Para tener una idea de cómo esto ocurría, considera la siguiente función polinomial simple:

Este método de división diferencial incluye la diferencia entre cada valor sucesivo de “y” para diferentes valores de “x”. Las diferencias pueden ser encontrabas y posiblemente, las diferencias sucesivas a las diferencias previas, hasta que una constante diferencial aparece. Estas diferenciales pueden ser usadas para tener el siguiente valor del polinomio simplemente sumando.

 

Como el polinomio anterior sólo es de segundo grado, podemos encontrar la constante diferencial después de 2 columnas de diferencias:

 

Ahora que ya sabemos que la constante diferencial es 2, podemos encontrar el valor de y cuando x es 5 mediante sumas. Si sumamos 2 a 7, la última entrada de la columna Diff 1, da 9. Si sumamos 9 a 17, la última entrada de la columna Y es 26, que es la respuesta.

 

La máquina de Babbage Difference Engine tenía, para cada diferencia, una columna como la anterior, pero era física y con engranajes. Cada rueda de engranaje era un decimal, y una columna entera de engranajes era un número decimal. Tenía 8 columnas, por lo que podía tabular polinomios hasta la 7ma potencia. Al iniciar una operación, las columnas partían con un valor que coincidía con el de una fila de la tabla. Un operador podía luego girar una manilla que hiciera que la constante inicial se “propagara”hacia la siguiente columna, guardando el valor en la siguiente.

 

Babbage pudo construir una pequeña sección de su máquina Difference Engine y usarla para demostrar sus ideas en fiestas. Pero incluso luego de utilizar fondo públicos que equivalían al valor de 2 barcos de guerra, nunca finalizó su máquina, ya que no había nadie que pudiera hacer la cantidad de ruedas de tuerca que necesitaba con la precisión que la máquina requería. Hay un video que desmuestra cómo funciona su máquina en el Museo de la historia del computador en Mountain View, donde se puede oír el sonido de la máquina mientras sus engranajes trabajan.

 

Babbage perdió interés en su máquina cuando se dio cuenta que podía ser construído algo más proderoso y flexible: el Analytical Engine (Motor analítico), conocido hoy en día como el Computador Mecánico de Babbage. Esta máquina se basaba en las mismas columnas y engranajes de la máquina anterior, pero tendría cientos de columnas, no 8. Podía ser programada usando tarjetas perforadas, como una máquina tejedora de la tela “jacquard”, además de multiplicar y dividir, sumar y restar. Para poder hacer esas operaciones, una sección de la máquina llamada “mill”, podría reubicar sus engranajes en la configuración necesaria para posteriormente leer los operandos de las otras columnas con valores guardados, y posteriormente, escribir el resultado en otra columna.

 

Recibía el nombre de Analytical Engine porque tenía suficiente poder como para rememorar un análisis matemático. La máquina anterior podía tabular polinomios, pero esta podía calcular, por ejemplo, el coeficiente de la expansión de un polinomio de otra expresión. Era una máquina fantástica, pero el gobierno británico se negó a financiarla, por lo que Babbage se fue a Italia a buscar apoyo.

 

Notas del traductor original (Two-Bits)

En Turin Babbage conoció a un ingeniero italiano, y futuro primer ministro Luigi Menabrea. Él lo convenció de escribir sobre lo que Analytical Engine podía lograr. En 1842, Menabrea publicó un paper en francés. Al año siguiente, Ada Lovelace publicó la traducción del paper en inglés.

 

Lovelace, conocida como Ada Byron, conoció a Babbage en una fiesta en 1833, cuando ella tenía 17 y él 41. Ella estaba fascinada con la primera máquina, porque comprendía como funcionaba, ya que fue educada exclusivamente en matemáticas durante su niñez. Su madre Annabella Milbanke, había decidido que conocimientos sólidos de matemáticas podrían mantenerla alejada de la sensibilidad romántica que poseía el padre de Ada, Lord Byron, poeta famoso. Luego de conocerse, Lovelace y Babbage formaron parte del mismo círculo social, y se escribían cartas seguido.

 

Ada Byron se casó con William King en 1835. King se convirtió en el Conde de Lovelace, y a Ada, en la Condesa de Lovelace. Ella luego de tener 3 hijos, siguió con sus estudios de matemáticas, empleando como tutor a Augustus de Morgan, descubridor de la Ley de Morgan. Ella vio el potencial de la segunda máquina de Babbage inmediatamente, y estaba decidida a trabajar con él para promover la idea. Un amigo suyo le sugirió a Ada traducir el paper de Manabrea para lectores ingleses.

 

El paper de Manabrea explicaba a rasgos generales cómo funcionaba el Difference Engine, y posteriormente mostraba la superioridad del Analytical Engine. Sería tan poderoso, “que podría calcular el producto de dos números, siendo cada uno de 20 cifras, en sólo 3 minutos”. Menabrea dio ejemplos de las capacidades de la máquina, demostrando cómo podía resolver problemas simples de ecuaciones lineales, y expandir el producto de 2 expresiones binomiales. En ambos casos, Menabrea indicó lo que Lovelace llamaría “diagramas de desarrollo”, los que secuenciaban la lista de operaciones que se necesitarían para calcular la respuesta correcta. Estos eran programas en el mismo sentido que el programa de Ada Lovelace eran un programa, y fueron publicados el año anterior. Pero como veremos, los programas de Menabrea fueron simples ejemplos de lo que sería posible, todos ellos triviales, en el sentido de que no requerían decisiones algorítmicas ni loops.

 

Lovelace sumó una serie de notas a su traducción del paper, que en conjunto, superaban la extensión del contenido del paper en sí. Aquí fue donde ella realizó sus mayores contribuciones a la computación. En la Nota A, que sumó a la definición de Menabrea del Analytical Engine, ella explicó extensamente y de forma lírica las promesas de la máquina. Ella pudo prever que una máquina como la suya, no sólo estaba limitada a números, sino que podía actuar sobre otros objetos “los que sus relaciones mutuas y fundamentales pudieran ser expresadas por la ciencia abstracta de las operaciones, y que fueran susceptibles a las adaptaciones de la acción de la notación de operaciones y mecanismos de la máquina”. Ella añadió que la máquina podría, algún día, componer música. Su visión era mucho más remarcable que la de Menabrea, que sólo veía la máquina como una herramienta para automatizar cómputos extensos, que podrían liberar un poco del trabajo de los científicos para dedicarse a cosas más complejas. La milagrosa visión de Lovelace demostrada en la Notas A, es la mayor razón por la que ella es celebrada hoy.

 

Otra nota famosa es la G. Lovelace comienza indicando que la máquina, a pesar de su potencial, no podía “pensar. A esta nota posteriormente Alan Touring se referiría como “La objeción de Ada Lovelace”. Luego Lovelace continua la nota indicando que la máquina puede hacer cosas extraordinarias, y para ilustrarlo, ella propone su programa para calcular los números de Bernoulli.

 

El programa completo y su “diagrama de desarrollo” explicados en la Nota D, puede ser visto aquí.

El programa es esencialmente una lista de operaciones especificadas usando símbolos matemáticos. No parece que Babbage o Lovelace hayan desarrollado más allá que un set de códigos y operaciones para el Analytical Engine.

 

Con Lovelace se describió el método para computar la secuencia completa de los números de Bernoulli hasta cierto límite, y el programa que ella entregó sólo ilustraba uno de los pasos del procesos. Su programa calculaba un número que ella llamaba B7, lo que en matemática moderna es conocida como el octavo número de Bernoulli. Su programa resolvía la siguiente ecuación:

En lo anterior, cada término representa el coeficiente de una fórmula de polinomio para la suma de enteros elevadas a cierta potencia. Aquí la potencia es 8, ya que 8 es el primer número de Bernoulli que aparece en la fórmula para la suma de enteros positivos elevados a 8. La B y la A representan dos tipos de factores que Bernoulli descubrió. B1 a B7 son los otros números de Bernoulli, indexados según Ada Lovelace propuso. A0 a A5 representan los factores de los coeficientes que Bernoulli podía calcular usando el Triángulo de Pascal. Los valores de A0, A1, A3 y A5 aparecen abajo. Aquí “n” representa el primer número de Bernoulli en la secuencia de impares. El programa de Ada utilizaba n=4.

Yo creé la traducción del programa de Ada en C, lo que es más fácil de seguir. Su primer programa calculaba A0 y el producto B1A1. Luego entraba en un loop que se repetía 2 veces para calcular B3A3 y B5A5, ya que ambos se formaban mediante un patrón idéntico. Luego de que cada producto era calculado, se sumaba a los productos previos, por lo que al final del programa la suma completa era obtenida.

 

Claramente la interpretación en C no recrea exactamente su programa, porque declara variables en una pila, cuando las variables de Lovelace son como registros. Pero demuestra las partes del programa de Lovelace que son tan presentes. El programa en C contiene 2 loop “while”, uno anidado en el otro. El programa de Lovelace no tenía loops exactamente, pero hacía grupos de operaciones, y en su nota explicaba cuándo se debían repetir. La variable x10 en el programa original y en la traducción a C, funciona como un contador que disminuye por cada loop, algo con lo que cualquier programador es familiar. De hecho, independiente de los nombres confusos de las variables que Ada determinó, su programa no parece algo ajeno.

 

Otra cosa que vale la pena mencionar es que traducir su programa a C no fue difícil, ya que su nivel de detalle fue muy alto. A diferencia de las tablas de Menabrea, su tabla incluye una columna llamada “indicación de cambios en el valor de la variable”, lo que simplifica seguir la mutación del estado a lo largo del programa. Ella escribe un índice sobre cada variable (un número pequeño encima) para indicar el valor sucesivo que han ido guardando, entonces si un número tiene 2 índices, significa que el valor que se está usando, es el segundo.

 

¿La primera programadora?

Luego de traducir el programa C, y correrlo, al principio no andaba bien, pero luego de debuggearlo, el problema no era mi código, sino que el código estaba en el programa original!

 

En su “diagrama de desarrollo”, Ada Lovelace da a la cuarta operación como v5/v4. Pero el orden correcto es v4/v5. Esto puede haber sido un error de tipeo, y no un error del programa de Ada Lovelace. A la vez, este debe ser el bug de computador más antiguo.

 

Jim Randall, otro blogger que había hecho el código de Ada en Python, también notó este bug en conjunto con otros. Qué dice de Ada Lovelace que su programa publicado tuviera bug mínimos? Quizás esto muestra que ella escribió no una demostración de la máquina, sino que un verdadero programa. Después de todo, puedes estar realmente programando algo más que programas sencillos si no estás a la vez, programando con bugs?

 

Un artículo de Wikipedia llama a Ada Lovelace la primera persona en escribir “un programa complejo”. Quizás esa es la forma de reconocer sus logros. Menabrea publicó “diagramas de desarrollo” en su paper un año antes que Ada Lovelace publicara su traducción. Babagge también escribió más de 20 programas que nunca publicó. Puede ser no correcto decir que escribió o publicó el primer programa cuando en realidad siempre hay espacio para discutir sobre qué es un programa. Aun así, el programa de Ada Lovelace estaba millas más avanzadas que cualquier cosa que se haya publicado antes. El programa más largo que Menabrea presentó era de 11 operaciones y no tenía loops ni árboles de decisión. El programa de Ada cuenta con 25 operaciones, loops anidados (por lo tanto, algoritmos). Menabrea escribió al final de su paper:

 

Una vez que la máquina se construya, la dificultad será realizar las tarjetas perforadas, pero como son simplemente la traducción de operaciones algebráicas, es decir, notación simple, será fácil que lo ejecute un trabajador.

 

Ni Babbage ni Menabrea estaban especialmente interesados en utilizar la Analytical Engine para problemas que no fueran cálculos matemáticos inmediatos que llevaron primero a Babbage a construir máquinas calculadoras. Lovelace vio que el Analytical Engine era capaz de mucho más de lo que Menabrea y Babbage podían imaginar. Lovelace también indicó que “la creación de cartas” no sería tan sencillo, porque podrían ser hechas muy bien, o muy mal. Esto es difícil de apreciar sin comprender su programa de la Nota G, y darse cuenta del cuidado que ella puso al diseñarlo. Pero al haberlo hecho, vas a estar de acuerdo con que Lovelace, incluso si no fue la “primera programadora”, fue la primera programadora en merecer ese título.

Si te gustó el artículo, puedes leer el original aquí, y seguir a su autor en Twitter @TwoBitHistory.

 

Share This