Aller au contenu

Ada Lovelace : comment programmer une machine qui n'existait pas encore ?

La machine de Babbage, la note G de 1843 et les nombres de Bernoulli : ce qu'Ada Lovelace a réellement apporté.

En 1843, Ada Lovelace publie un tableau décrivant comment calculer des nombres de Bernoulli avec une machine mécanique programmable. On y trouve les opérations à effectuer, les résultats à conserver et des instructions à répéter. Pourtant, cette machine n'a jamais été achevée.

Comment décrire aussi précisément un calcul destiné à une machine inexistante ? Pour le comprendre, il faut suivre trois contributions : Charles Babbage conçoit la machine analytique, Luigi Menabrea en présente les principes et Ada Lovelace traduit son article en y ajoutant ses propres notes. Reste à comprendre qui a conçu les procédures de calcul et ce que Lovelace leur a apporté.

Portrait peint d'Ada Lovelace, debout dans une robe blanche et rouge, en 1836
Ada Lovelace, portrait de Margaret Sarah Carpenter (1836), Government Art Collection. Œuvre et reproduction du domaine public, Wikimedia Commons.

Ada Lovelace et les mathématiques

Née en 1815, Augusta Ada Byron reçoit une formation scientifique privée, à une époque où les universités britanniques sont largement fermées aux femmes. Mary Somerville joue un rôle important dans son parcours ; le mathématicien Augustus De Morgan lui enseigne notamment l'algèbre et le calcul différentiel.

Leurs lettres montrent ses exercices, ses questions et parfois ses erreurs. Cette formation, que documente Adrian Rice pour la Mathematical Association of America, aide à comprendre sa contribution sans lui prêter un savoir inné.

En 1833, Somerville lui présente Charles Babbage, qui travaille sur des machines à calculer. Ada s'intéresse progressivement à leur fonctionnement mathématique.

Deux machines à ne pas confondre

La machine à différences : calculer des tables par additions

Pour fabriquer une table de carrés, on pourrait multiplier successivement 1 par 1, 2 par 2, 3 par 3, etc. Mais il existe une méthode fondée uniquement sur des additions.

Nombre nnCarré n2n^2Écart avec le carré suivant
001
113
245
397
4169

Les écarts valent 1, 3, 5, 7, 9… Ils augmentent toujours de 2. On peut alors produire les carrés en conservant deux valeurs : le dernier carré obtenu et l'écart à ajouter.

On part de u=0u=0 et d=1d=1, puis on répète :

u←u+d,d←d+2.u\leftarrow u+d,\qquad d\leftarrow d+2.

On obtient successivement u=1,4,9,16,…u=1,4,9,16,\ldots. Le symbole ←\leftarrow signifie ici « prend la nouvelle valeur ».

Ce procédé est un exemple de différences finies. Pour les valeurs successives d'un polynôme de degré pp, les différences d'ordre pp sont constantes (avec un pas fixé). Une machine peut exploiter cette propriété pour calculer des tables numériques.

C'est le principe de la machine à différences (Difference Engine). Babbage en fit construire une partie, mais pas la version complète prévue initialement. Son projet ultérieur de machine à différences no 2 a été reconstruit au Science Museum en 1991, avec son imprimante en 2002.

Cette reconstruction n'est pas celle de la machine analytique.

La machine analytique : changer les opérations elles-mêmes

À partir des années 1830, Babbage imagine un dispositif bien plus général. Il veut pouvoir choisir une suite d'opérations, utiliser leurs résultats et répéter certaines instructions : c'est la machine analytique (Analytical Engine).

Elle reste un projet évolutif de plans et de mécanismes partiels. Aucun exemplaire complet et opérationnel n'est construit à l'époque. Mais le projet est suffisamment détaillé pour susciter des recherches sur la manière de lui donner des instructions.

Plan mécanique de la machine analytique dessiné par Charles Babbage en 1840
Plan général de la machine analytique, 6 août 1840. Dessin de Charles Babbage ; photographie d'Arnold Reinhold au Computer History Museum, CC BY 4.0. Voir le document et ses crédits. Photographie reproduite sans retouche.

Comment aurait-elle exécuté un calcul ?

Babbage distingue deux grandes parties.

Le magasin (Store) conserve les nombres. On peut imaginer plusieurs colonnes mécaniques, notées V1,V2,V3,…V_1,V_2,V_3,\ldots, contenant chacune une valeur.

Le moulin (Mill) effectue les opérations arithmétiques. Si V1V_1 contient 12 et V2V_2 contient 5, on peut décrire l'ordre suivant :

V3←V1×V2.V_3\leftarrow V_1\times V_2.

Le résultat, 60, est placé dans V3V_3. Une instruction ultérieure peut l'utiliser : V4←V3+V2V_4\leftarrow V_3+V_2 donne alors 65.

Ce petit exemple est une notation pédagogique actuelle, pas une reproduction des cartes originales.

Pour commander les calculs, la machine aurait utilisé différentes catégories de cartes perforées. Les cartes d'opérations indiquaient, par exemple, s'il fallait additionner ou multiplier ; les cartes de variables déterminaient les colonnes concernées. Le mécanisme prévoyait aussi la répétition de séries d'opérations et certaines décisions fondées sur des résultats.

L'idée de cartes commandant des gestes mécaniques n'était pas née avec Babbage. Le métier Jacquard utilisait déjà des cartes perforées pour piloter des motifs textiles. Là où le métier détermine quels fils doivent être soulevés, la machine analytique devait déterminer quelles opérations effectuer sur quelles valeurs.

Bandes de cartes perforées commandant un métier à tisser Jacquard
Cartes perforées d'un métier Jacquard au Science Museum. Photographie de Robert-brook, CC0. Notice de l'image.

Il serait trompeur de dire que ce mécanisme possédait la mémoire et les langages d'un ordinateur actuel. Mais l'idée de séparer les instructions de la machine qui les exécute est bien au cœur du projet.

1843 : une traduction et sept notes

Après une présentation de la machine analytique par Babbage à Turin en 1840, Luigi Federico Menabrea publie en français, en 1842, Notions sur la machine analytique de M. Charles Babbage.

Lovelace traduit ce texte en anglais et lui ajoute les notes A à G, publiées en 1843. Elles sont bien plus longues que le texte traduit. La note A examine notamment ce que la machine pourrait faire au-delà des calculs numériques ; les notes B à F expliquent les colonnes mécaniques, les cartes et leur réutilisation. La note G donne un exemple détaillé : les nombres de Bernoulli.

Le texte complet de 1843 permet de retrouver ces sept notes.

Les nombres de Bernoulli : calculer les termes successifs

Les nombres de Bernoulli sont des nombres rationnels qui interviennent, entre autres, dans les formules de sommes de puissances. Ils permettent par exemple de généraliser les formules connues

1+2+⋯+n=n(n+1)2,12+22+⋯+n2=n(n+1)(2n+1)6.1+2+\cdots+n=\frac{n(n+1)}2,\qquad 1^2+2^2+\cdots+n^2=\frac{n(n+1)(2n+1)}6.

Nous utilisons la convention moderne B1=−12B_1=-\frac12. Les premiers nombres sont :

B0=1,B1=−12,B2=16,B3=0,B4=−130.B_0=1,\quad B_1=-\frac12,\quad B_2=\frac16,\quad B_3=0,\quad B_4=-\frac1{30}.

Comment trouver ces valeurs ?

On part de B0=1B_0=1. Pour calculer le nombre suivant, on utilise les précédents. Par exemple, les relations qui définissent cette suite donnent :

B0+2B1=0⟹B1=−12.B_0+2B_1=0\quad\Longrightarrow\quad B_1=-\frac12.

Puis :

B0+3B1+3B2=0.B_0+3B_1+3B_2=0.

En remplaçant les valeurs connues :

1−32+3B2=0⟹B2=16.1-\frac32+3B_2=0\quad\Longrightarrow\quad \boxed{B_2=\frac16}.

On peut poursuivre de la même façon. Chaque nouveau calcul exige de retrouver les résultats précédents : c'est ce qui rend cet exemple intéressant pour une machine programmable.

Pour aller plus loin : la formule générale

Avec B0=1B_0=1, pour tout entier m≥1m\geq1 :

Bm=−1m+1∑k=0m−1(m+1k)Bk.\boxed{B_m=-\frac{1}{m+1}\sum_{k=0}^{m-1}\binom{m+1}{k}B_k}.

Le signe ∑\sum demande d'additionner les termes indiqués ; (ab)\binom{a}{b} est un coefficient binomial (par exemple (32)=3\binom32=3). C'est cette relation que nous utiliserons en Python. Ce n'est pas la suite exacte d'instructions du tableau de 1843.

Une définition plus avancée, par le développement au voisinage de t=0t=0, est :

tet−1=∑n=0∞Bntnn!=1−t2+t212−t4720+⋯ .\frac{t}{e^t-1}=\sum_{n=0}^{\infty}B_n\frac{t^n}{n!} =1-\frac t2+\frac{t^2}{12}-\frac{t^4}{720}+\cdots.

On prolonge le membre de gauche par continuité en t=0t=0 ; n!n! désigne la factorielle de nn, avec 0!=10!=1. Cette définition redonne la même suite : notamment B3=B5=B7=0B_3=B_5=B_7=0 et B6=142B_6=\frac1{42}, B8=−130B_8=-\frac1{30}. Elle n'est pas nécessaire pour suivre le calcul historique.

La note G : comprendre le tableau de 1843

Tableau historique de 1843 : 25 numéros d'opérations et colonnes de la machine analytique pour les nombres de Bernoulli
Tableau publié avec la note G en 1843, domaine public. Ouvrir le fac-similé en grand ; lire la transcription de la note G.

Le tableau décrit un calcul du B7B_7 de Lovelace, qui correspond à notre B8=−130B_8=-\frac1{30}. À l'époque, les nombres notés B1,B3,B5B_1,B_3,B_5 correspondent à nos B2,B4,B6B_2,B_4,B_6 : il ne faut donc pas confondre les indices historiques avec les nôtres.

Les colonnes V1,V2,…V_1,V_2,\ldots sont des emplacements mécaniques où des nombres sont conservés. Le tableau indique les opérations et l'évolution de ces emplacements. Pour l'exemple choisi, n=4n=4 et les nombres de Bernoulli précédents sont supposés connus.

Quatre opérations, une erreur visible

Au début du calcul, les opérations 1 à 3 préparent deux nombres :

  1. On multiplie n=4n=4 par 2 : on obtient 8, conservé dans plusieurs colonnes.
  2. Dans une de ces colonnes, on retire 1 : on obtient 7.
  3. Dans une autre, on ajoute 1 : on obtient 9.

L'opération 4 devrait alors calculer :

2n−12n+1=79.\frac{2n-1}{2n+1}=\frac79.

Mais, dans la colonne des instructions imprimées en 1843, l'ordre des deux nombres est inversé : on lit 9÷79\div7 au lieu de 7÷97\div9. Or ces divisions donnent des résultats différents. Le lecteur peut donc repérer lui-même une incohérence entre l'instruction et le résultat attendu.

Une reconstitution moderne du calcul discute cette inversion et un autre problème de signe. On ne sait pas avec certitude à quel stade chaque erreur a été introduite. La machine analytique n'ayant pas été achevée, le tableau n'a pas été exécuté sur elle.

Pourquoi ce tableau fait-il penser à un programme ?

Il ne s'arrête pas à ces quatre opérations. Le document comporte 25 numéros d'opérations, dont certaines instructions sont réutilisées, notamment le groupe 13 à 23. Le nombre d'opérations effectivement effectuées peut donc être supérieur à 25.

Trois idées apparaissent : conserver une valeur, répéter des opérations et choisir la suite du calcul selon un résultat. Ces mécanismes sont prévus dans la machine de Babbage ; Lovelace en montre l'utilisation dans un calcul complexe. Le fac-similé est une description historique d'opérations et d'états successifs, pas un programme Python moderne.

Ada Lovelace : « première programmeuse » ?

Babbage avait déjà préparé des tableaux d'opérations avant 1843. Raúl Rojas a notamment étudié un calcul de 1837 destiné à la machine analytique. Il serait donc faux d'affirmer que Lovelace a été la première personne à imaginer des instructions pour cette machine.

En revanche, sa note G publie une description détaillée et commentée du calcul des Bernoulli. En 1864, Babbage raconte avoir proposé de prendre en charge la partie algébrique de ce travail ; il rapporte aussi que Lovelace avait repéré une erreur importante dans son procédé :

“detected a grave mistake which I had made in the process”.

Traduction : « avait repéré une grave erreur que j'avais commise dans le procédé ». Cela atteste une participation mathématique active, sans permettre d'attribuer chaque ligne à une seule personne.

L'historien Thomas J. Misa étudie cette collaboration, tandis que Raúl Rojas éclaire l'antériorité des travaux de Babbage. Le titre de « première programmeuse » reste discutable selon ce que l'on appelle un programme. La note G demeure l'une des premières descriptions publiées et développées d'un calcul destiné à une machine programmable générale.

Et si la machine manipulait autre chose que des nombres ?

Dans la note A, Lovelace remarque que des opérations pourraient porter sur d'autres objets que des quantités, si leurs relations peuvent être représentées par des règles adaptées. Elle évoque ainsi, à titre d'hypothèse, la composition musicale.

Elle compare la machine analytique à un métier Jacquard : le métier tisse des motifs selon des cartes perforées ; la machine pourrait, elle, produire des « motifs algébriques ». L'idée est que des instructions peuvent organiser des symboles, et non seulement fournir une table de résultats numériques.

Lovelace n'a pas inventé un logiciel musical ni un ordinateur actuel. Elle a néanmoins envisagé des usages plus généraux de la machine mécanique de Babbage.

Une machine peut-elle inventer ?

Au début de la note G, Lovelace écrit :

“The Analytical Engine has no pretensions whatever to originate any thing.”

Traduction : « La machine analytique ne prétend nullement créer quoi que ce soit par elle-même. »

Elle considère une machine exécutant des opérations que les humains ont su lui prescrire. Mais elle remarque aussi que la préparation de ces opérations pourrait conduire les mathématiciens à découvrir des relations nouvelles.

En 1950, Alan Turing discute cette position dans Computing Machinery and Intelligence, sous le nom d'« objection de Lady Lovelace ». Il souligne notamment qu'un résultat informatique peut surprendre son concepteur.

La question reste pertinente pour l'intelligence artificielle : un système peut produire une démonstration qui semble originale, sans que cela suffise à prouver qu'elle est correcte ou que le système la comprend. Nouveauté, validité et compréhension sont trois questions différentes. On ne peut pas non plus réduire directement les propos de 1843 à une théorie de l'IA contemporaine.

En Python : conserver et réutiliser les résultats

Adaptation moderne : ce code calcule les nombres de Bernoulli avec notre récurrence. Il n'a pas été écrit par Lovelace et ne reproduit pas ses cartes perforées.

Une liste Python peut conserver des résultats :

valeurs = [1, 3, 5]
valeurs.append(7)  # la liste devient [1, 3, 5, 7]

Pour les Bernoulli, il faut répéter cette idée avec les fractions et les coefficients de la formule :

from fractions import Fraction
from math import comb

def bernoulli(n):
    valeurs = [Fraction(1)]

    for m in range(1, n + 1):
        somme = 0
        for k in range(m):
            somme += comb(m + 1, k) * valeurs[k]

        suivant = -somme / (m + 1)
        valeurs.append(suivant)

    return valeurs

for i, b in enumerate(bernoulli(8)):
    print(f"B_{i} = {b}")

Ainsi, quand m=2m=2, la boucle intérieure utilise seulement B0=1B_0=1 et B1=−12B_1=-\frac12 pour obtenir B2=16B_2=\frac16. Le programme retrouve aussi B8=−130B_8=-\frac1{30}, qui correspond au B7B_7 de la note G.

À chercher : pourquoi la boucle intérieure s'arrête-t-elle avant l'indice mm ? Parce que le terme BmB_m est précisément celui que nous sommes en train de calculer.

Quelques repères chronologiques

Babbage a conçu la machine ; Lovelace a contribué à montrer comment décrire et analyser les instructions qu'elle devait exécuter. La machine analytique de Babbage n'a jamais été achevée, mais ses calculs pouvaient déjà être écrits, vérifiés et discutés.

Sources et lectures pour approfondir

Sources primaires

Études et collections historiques

Les citations anglaises sont tirées des textes historiques indiqués. Leurs traductions françaises sont proposées pour cet article.