La función real del programa de Ada Lovelace (2018)
(twobithistory.org)- En 1843, Ada Lovelace publicó un procedimiento para calcular números de Bernoulli para la Analytical Engine, que todavía no estaba terminada, y por eso quedó en el centro del debate sobre el “primer programa de computadora”
- La tabla publicada muestra una etapa dentro del método para tratar toda la sucesión de números de Bernoulli, y el valor que Lovelace llamó B7 corresponde, en notación moderna, al octavo número de Bernoulli
- El programa de la Nota G incluía 25 operaciones, bucles anidados e incluso una notación para seguir el valor de las variables, por lo que era mucho más sofisticado que el ejemplo de Menabrea, con 11 operaciones y sin repeticiones
- Durante la traducción a C se descubrió que la cuarta operación de la tabla original,
v5 / v4, debía serv4 / v5; probablemente fue un error tipográfico, pero puede verse como el bug más antiguo de la historia de la computación - La diferencia clave de Lovelace, más que el título de “primera programadora”, fue entender la creación de tarjetas no como una simple traducción de fórmulas algebraicas, sino como una tarea de programación que podía hacerse bien o mal
El programa de 1843 que nunca pudo ejecutarse
- A diferencia de la anécdota fundacional de Microsoft, el programa de Ada Lovelace nunca tuvo la oportunidad de ejecutarse en una máquina real
- Paul Allen y Bill Gates probaron un intérprete de BASIC con un emulador basado en las especificaciones del Intel 8080 cuando todavía no tenían una Altair, y luego también lo hicieron funcionar en una Altair real
- Lovelace también escribió un programa para una computadora que solo existía en descripciones, pero no pudo ejecutarlo porque la Analytical Engine nunca se construyó
- El programa de Lovelace suele llamarse el primer programa de computadora del mundo, pero ese estatus sigue siendo discutido
- El debate sobre el alcance y el valor de la contribución de Lovelace ha continuado hasta el punto de que Walter Isaacson lo llamó una “minor academic specialty”
- Aquí la pregunta importante no es evaluar a la persona, sino cómo estaba diseñado para funcionar un programa escrito en 1843
- El programa iba más allá de una simple lista de fórmulas
- Organizaba grupos de operaciones repetibles, usando una estructura equivalente a un loop
- Introducía una notación para seguir los cambios de estado de las variables
- Tiene aspectos que se parecen a la experiencia actual de escribir software
Los números de Bernoulli y el problema de la suma de potencias
- El programa de Lovelace estaba diseñado para calcular números de Bernoulli
- Detrás de los números de Bernoulli hay un antiguo problema matemático: calcular sumas de potencias
- Los pitagóricos buscaron una manera de calcular
1 + 2 + 3 + ... + nsin sumar término por término, y obtuvieron la fórmulan(n+1)/2acomodando dos triángulos para formar un rectángulo - Arquímedes se interesó por sumas de la forma
1² + 2² + 3² + ... + n²y dejó una solución interpretable geométricamente - Aryabhata publicó en 499 el Aryabhatiya, que incluía la fórmula para la suma de cubos
- Los pitagóricos buscaron una manera de calcular
- El problema más general era cómo obtener sumas de la forma
1^k + 2^k + ... + n^k- Johann Faulhaber publicó en 1631 fórmulas hasta la potencia 17, pero no dio una solución general
- Blaise Pascal desarrolló en 1665 un método general, aunque primero requería conocer cómo calcular todas las sumas de potencias menores
- Jakob Bernoulli dejó una solución general más práctica
- Usó el triángulo de Pascal para identificar patrones en los coeficientes polinomiales
- Una parte de los coeficientes se obtenía del triángulo de Pascal, y el resto se derivaba de la propiedad de que la suma de coeficientes siempre es 1
- Ese segundo factor de coeficientes se convirtió en la sucesión conocida como números de Bernoulli
- El hallazgo de Bernoulli no convirtió de inmediato el cálculo de cualquier suma de potencias en un problema fácil
- Para calcular la suma de potencias
k, hay que conocer los números de Bernoulli hasta elk-ésimo - Cada número de Bernoulli se calcula a partir de los anteriores
- Aun así, era mucho más fácil calcular una sucesión larga de números de Bernoulli que derivar una por una todas las fórmulas de suma de potencias
- Para calcular la suma de potencias
Las dos máquinas de cálculo de Babbage
- Charles Babbage diseñó dos tipos de calculadoras mecánicas
- La primera fue la Difference Engine
- La segunda fue la Analytical Engine, hoy reconocida como una computadora mecánica
- La Difference Engine no era una computadora, sino una máquina que solo realizaba sumas y restas
- A Babbage le molestaba que las tablas logarítmicas de la época tuvieran muchos errores, y quería producirlas mecánicamente
- El método de diferencias divididas de Gaspard de Prony descomponía la elaboración de tablas logarítmicas en pasos pequeños que solo requerían sumas y restas
- Los polinomios podían usarse para aproximar funciones logarítmicas y trigonométricas
- La Difference Engine hacía corresponder cada columna de la tabla de diferencias con una columna física de engranajes
- Cada engranaje representaba un dígito decimal, y toda una columna representaba un número decimal
- Tenía 8 columnas, por lo que podía tabular polinomios de hasta séptimo grado
- La persona fijaba los valores iniciales y luego giraba una manivela para que la diferencia constante se propagara a la siguiente columna
- Babbage construyó y demostró una parte de la Difference Engine, pero no logró completar la máquina entera
- No pudo encontrar un fabricante capaz de producir la cantidad necesaria de engranajes con la precisión suficiente
- Una Difference Engine funcional no se construyó hasta la década de 1990, cuando ya existía mecanizado de precisión suficiente
- La Analytical Engine fue concebida como una máquina mucho más potente y flexible
- Usaría columnas de engranajes como la Difference Engine, pero se planeaba que tuviera cientos o más
- Podría programarse con tarjetas perforadas, como el telar de Jacquard
- Podría hacer no solo sumas y restas, sino también multiplicaciones y divisiones
- Una parte llamada “mill” se reconfiguraría según la operación, leería operandos desde las columnas de almacenamiento y escribiría el resultado en otras columnas
El artículo de Menabrea y las notas de Lovelace
- Babbage conoció en Turín al ingeniero italiano Luigi Menabrea, quien después sería primer ministro, y Menabrea publicó en 1842 un artículo en francés que explicaba el potencial de la Analytical Engine
- En 1843, Lovelace tradujo al inglés el artículo de Menabrea
- Lovelace había conocido a Babbage por primera vez en 1833, cuando tenía 17 años, y quedó fascinada por su Difference Engine
- Desde pequeña recibió una fuerte educación matemática y, incluso después de casarse y tener tres hijos, siguió estudiando matemáticas con Augustus de Morgan
- El artículo de Menabrea trataba brevemente el funcionamiento de la Difference Engine y la superioridad de la Analytical Engine
- Presentaba la Analytical Engine como una máquina capaz de obtener el producto de dos números de 20 dígitos en tres minutos
- Usaba como ejemplos un sistema simple de ecuaciones lineales y el desarrollo del producto de dos binomios mediante “diagrams of development”
- Esas tablas también eran programas en el mismo sentido que el de Lovelace, pero eran ejemplos simples sin bifurcaciones ni repeticiones
- La traducción de Lovelace incluía notas mucho más extensas que el texto original, y ahí aparece su principal contribución
- La Nota A desarrollaba ampliamente la posibilidad de que la Analytical Engine fuera una máquina capaz de realizar operaciones matemáticas arbitrarias
- Consideraba que podía actuar no solo sobre números, sino también sobre cualquier objeto cuyas relaciones fundamentales mutuas pudieran expresarse como una ciencia abstracta de operaciones
- Por ejemplo, mencionaba que algún día incluso podría componer música
- La Nota G es famosa por dos razones
- El argumento de Lovelace de que no puede decirse que la Analytical Engine “piense” fue llamado más tarde por Alan Turing “Lady Lovelace’s Objection”
- Al mismo tiempo, incluía un programa para calcular números de Bernoulli y mostrar que la máquina podía abordar problemas muy complejos
La estructura real del programa de la Nota G
- La tabla completa de Lovelace es un “diagram of development” ampliado, y la imagen original puede verse aquí
- El programa se parece más a una lista de operaciones especificadas con notación matemática convencional
- Parece que ni Babbage ni Lovelace llegaron a desarrollar algo como un conjunto de opcodes para la Analytical Engine
- Lovelace explicó cómo calcular toda la sucesión de números de Bernoulli hasta cierto límite, pero el programa mostrado en la tabla ilustra una sola etapa de ese proceso
- El valor calculado es el que Lovelace llamaba B7
- En notación matemática moderna, es el octavo número de Bernoulli
- La expresión tiene la forma
B7 = -1(A0 + B1A1 + B3A3 + B5A5)
- Cada término de esa expresión representa un coeficiente de un polinomio de suma de potencias específico
- La potencia correspondiente es 8, y la primera vez que aparece el octavo número de Bernoulli es en la fórmula para la suma de las octavas potencias de enteros positivos
B1aB7son distintos números de Bernoulli según la indexación usada por LovelaceA0aA5son factores de coeficientes que Bernoulli podía calcular con el triángulo de Pascal- El programa de Lovelace usa
n = 4
- La traducción a C está disponible en este gist
- Primero calcula
A0yB1A1 - Después entra en un loop que se repite dos veces para calcular
B3A3yB5A5 - Tras calcular cada producto, lo suma con los anteriores para obtener al final la suma completa
- Primero calcula
Loops, estado de variables y un bug antiguo
- La traducción a C muestra bien lo adelantado que era el programa de Lovelace
- Aunque el programa original no tenía literalmente un loop
while, Lovelace agrupó operaciones e indicó mediante comentarios cuándo debían repetirse - La traducción a C tiene dos loops
while, uno anidado dentro del otro - En el original y en la traducción a C,
v10funciona como una variable contador que disminuye en cada repetición
- Aunque el programa original no tenía literalmente un loop
- La tabla de Lovelace permite seguir los cambios de estado más fácilmente que las tablas de Menabrea
- Tiene una columna titulada “Indication of change in the value on any Variable”
- Asigna índices en superíndice a cada variable para mostrar los valores sucesivos que tuvo durante la ejecución del programa
- El superíndice 2 significa el segundo valor asignado desde el inicio del programa
- Al llevarlo a C y ejecutarlo, al principio aparecía un resultado incorrecto, y la causa no estaba en el código traducido sino en la tabla original
- El “diagram of development” de Lovelace escribe la cuarta operación como
v5 / v4 - El orden correcto es
v4 / v5 - Probablemente no fue un error del programa creado por Lovelace, sino un error tipográfico
- El “diagram of development” de Lovelace escribe la cuarta operación como
- Jim Randall también tradujo el programa de Lovelace a Python e indicó el mismo bug en la división y otros dos problemas
- El pequeño bug del programa original encaja con la interpretación de que Lovelace intentaba escribir algo cercano a un programa real, no solo una pieza de demostración
Los límites del título de primera programadora
- No es del todo exacto decir que Lovelace escribió o publicó el “primer programa”
- Menabrea publicó “diagrams of development” un año antes de la traducción de Lovelace
- Babbage también escribió más de 20 programas que nunca publicó
- Dependiendo de qué se considere un programa, hay espacio para debate
- El programa publicado por Lovelace estaba muy por delante de lo publicado antes
- El programa más largo presentado por Menabrea tenía 11 operaciones
- Los ejemplos de Menabrea no tenían loops ni bifurcaciones
- El programa de Lovelace incluía 25 operaciones y loops anidados, y por tanto también una estructura de bifurcación
- Menabrea pensaba que, una vez terminada la máquina, la dificultad se reduciría a fabricar las tarjetas, y que como las tarjetas no eran más que una traducción de fórmulas algebraicas, sería fácil dejar su ejecución en manos de un operario mediante una notación simple
- Babbage y Menabrea se enfocaban sobre todo en aplicar la Analytical Engine a problemas de cálculo matemático que les interesaban
- Lovelace pensaba que la Analytical Engine podía hacer mucho más de lo que Babbage o Menabrea imaginaban, y entendió que la “fabricación de tarjetas” no era una tarea secundaria simple, sino una tarea de programación que podía hacerse bien o mal
1 comentarios
Opiniones en Hacker News
La verdadera señal de un programa no trivial es que no funcione al primer intento.
Es sorprendente que, después de frustrarse porque todavía no existía la tecnología de mecanizado de precisión en masa para construir una máquina simple, Babbage diseñara un nuevo sistema un orden de magnitud más complejo y viajara hasta Italia en busca de capacidades de fabricación más avanzadas.
Cuando se trababa intentando hacer algo, primero construía sus propias herramientas; una vez, como no le gustó la fuente incorporada en un tamaño de punto muy pequeño, creó su propia fuente.
Era el mejor ingeniero que conocí, pero había que vigilarlo constantemente para que no se metiera en un agujero de conejo.
Tim Robinson también dijo que “si el Meccano de la década de 1920 hubiera existido 100 años antes, Babbage habría tenido un éxito total”, y yo lo veo más bien como una persona de software arrojada al hardware por ideas que estaban por delante de lo realísticamente posible.
Además de faltarle sentido para la planificación de negocios y proyectos, y de no poder reducir el alcance ni renunciar a una precisión de 10 dígitos, seguía teniendo mejores ideas y persiguiéndolas, cayendo en agujeros de conejo; y, como de joven recibió varios premios solo por su propuesta de la Difference Engine, probablemente le habría sido difícil abandonarla incluso décadas después.
Además, su relación con el gobierno es una parte importante de la tragedia. La aristocracia despreciaba y desconfiaba del gobierno y la política, y las clases bajas desconfiaban del gobierno porque este nunca les había ayudado mucho, pero Babbage pertenecía a la clase media, justo el grupo propenso a tener una visión patriótica del gobierno, así que parece que quiso entregar su invento a la “nación” y pensó que el gobierno debía recompensarlo.
No logró terminar la Difference Engine, pero le preguntó al gobierno si podía implementar con fondos adicionales una Analytical Engine mejor, y el gobierno estuvo indeciso durante 20 años. Incluso cuando el gobierno le ofreció devolverle el invento, él se negó.
Quizá por la influencia de varios premios, también parece que se aferraba a su identidad de “persona inteligente”; hay una anécdota de que rechazó una propuesta para juzgar un premio junto con Faraday porque insistía en que él debía ser el único juez. Es muy probable que este tipo de actitud también lo haya llevado hacia ideas de genio ilusorias, más que a una ejecución práctica.
The Thrilling Adventures of Lovelace and Babbage, de Sydney Padua, parece ser un libro muy bien investigado; no he leído mucho del texto principal, pero sí leí con detalle los apéndices, y lo recomiendo.
Es un texto realmente excelente. En la introducción me impresionó que Lovelace pensara a fondo en cómo organizar los cálculos en grupos repetibles e inventara los bucles, y que se diera cuenta de la importancia de rastrear el estado cuando cambian las variables, creando una notación para marcar esos cambios.
Como programador, sorprende lo mucho que se parece lo que hacía Lovelace a la experiencia actual de escribir software, y la explicación de que lo diseñó para calcular números de Bernoulli es lo bastante detallada como para entender lo que hizo.
Si viviera hoy, me la imagino al final del pasillo peleándose con algún problema en Rust, y siento que habría tenido una fuerte preferencia por los lenguajes con tipado estático.
Lo clave es que vio que la Analytical Engine podía operar no solo sobre números, sino también sobre otros objetos expresables en términos de relaciones propias de la ciencia abstracta de las operaciones; por ejemplo, si las relaciones fundamentales de la armonía y la composición pudieran expresarse de esa forma, entonces la máquina podría crear música elaborada de cualquier complejidad y duración.
Que haya pensado eso en 1842, un siglo antes de que existieran computadoras realmente programables, basándose solo en una descripción de un prototipo de computadora mecánica, es un hackeo impresionante.
https://en.wikipedia.org/wiki/Static_single-assignment_form#Benefits
Incluso hoy se parece a una técnica moderna, y ella ya la tenía hace 180 años.
Me parece interesante el pasaje sobre cómo Paul Allen y Bill Gates probaron el intérprete BASIC para el Altair sin tener un Altair real, usando en una computadora de Harvard un emulador que habían creado solo a partir de la especificación del Intel 8080, y que funcionó correctamente la primera vez que lo ejecutaron frente a un Altair real.
Entonces, me pregunto si los verdaderos héroes ocultos aquí no fueron los ingenieros de Intel, que escribieron una especificación tan precisa que el software que corría en un emulador creado solo a partir de ella también corría sin problemas en el hardware real.
Era para que otro programador que escribía firmware 8080 para un plotter pudiera depurar su código, y recuerdo que el código fuente de ese emulador venía de algo de Intel llamado INTERP/8 8008. Por lo que he visto en artículos en línea, parece que Allen y Gates también lo usaron.
Creo que la parte más genial está en el trabajo real contenido en las “notas” que ella agregó a la traducción.
Referencia: https://upload.wikimedia.org/wikipedia/commons/c/cf/Diagram_for_the_computation_of_Bernoulli_numbers.jpg
Y https://en.wikipedia.org/wiki/Note_G
El artículo también remite a este material que trasladó su trabajo a Python: https://enigmaticcode.wordpress.com/tag/bernoulli-numbers/.
Al ver la parte donde dicen que la traducción del programa de Lovelace a C no resulta tan ajena, salvo por estar llena de variables con nombres nada útiles, queda claro que el autor nunca conoció a mis compañeros de trabajo.
No es que yo fuera particularmente conservador, pero, como era de esperarse, él nunca recordaba para qué era la variable “butts”, y jamás terminó de entender por qué su propio código lo confundía todo el tiempo.
Mi padre, ingeniero químico, aprendió a programar en FORTRAN; en esa época los nombres de variables tenían que ser de 1 letra y como máximo 2 dígitos. Más tarde aprendió Basic, pero su código seguía siendo mentalmente FORTRAN, así que conservó ese hábito.
Al principio pensé que solo mi padre era así, pero mucho después, trabajando en Wall St con quants que copiaban código de Numerical Recipes, vi exactamente lo mismo incluso en C.
Es interesante ver lo persistente que es el discurso sobre la automatización, si Menabrea veía la Analytical Engine principalmente como una herramienta para automatizar “cálculos largos y áridos” y así liberar la capacidad intelectual de científicos destacados para pensamientos de más alto nivel.
Hoy se dice exactamente lo mismo sobre los LLM.
Me pregunto si alguien creó una máquina virtual con el conjunto de instrucciones de Babbage y ejecutó el programa de Ada.
Aunque parece que el programa de Ada no viene incluido como ejemplo, así que habría que ingresarlo manualmente.
Como dato curioso, mi proyecto para la clase de compiladores fue hacer un compilador de C dirigido a ese emulador: https://github.com/Christopher-Chianelli/ccpa ojo que el código es horrible.
https://github.com/MarquisdeGeek/Ada-Origins
https://pairdebuggingwithlovelace.hashnode.dev/
Esto ya se había discutido cuando se publicó el artículo.
What Did Ada Lovelace’s Program Actually Do? - https://news.ycombinator.com/item?id=17797003 - agosto de 2018, 52 comentarios
La discusión de entonces, con 35 comentarios, está aquí: https://news.ycombinator.com/item?id=10709730
Como una pequeña tangente, me dio curiosidad cómo la llamaba la gente en esa época.
Su nombre era Augusta Ada King y era condesa de Lovelace; me pregunto si entonces ya era común acortar el título y usarlo como si fuera apellido, o si eso empezó a hacerse más recientemente.
Después de que William King-Noel se convirtió en Earl of Lovelace, lo llamaban “Lovelace”, y a ella probablemente la llamaban “Lady Lovelace” en la vida social y “Countess of Lovelace” en contextos formales.
Es un buen artículo. Fue la explicación más clara que he leído hasta ahora sobre en qué sentido Ada fue innovadora y por qué merece reconocimiento.