Grace Murray Hopper

Grace Murray Hopper (1906 – 1992) fut une mathématicienne, informaticienne et militaire américaine à qui l’on doit l’apparition des premiers langages de programmation modernes et du processus de compilation.

par Élise Davignon

Elle se démarqua d’abord avec son A-0 system, puis par sa collaboration essentielle à la création du langage COBOL, encore aujourd’hui largement répandu.

Biographie

Grace Brewster Murray naquit à New York en décembre 1906, aînée d’une sœur et d’un frère. Son père, Walter Fletcher Murray, agent d’assurances, et sa mère, Mary Murray (née Van Horne), fille d’arpenteur, lui donnèrent dès un jeune âge la piqûre des mathématiques, en encourageant sa curiosité naturelle. Inquiété par les paniques financières de mémoire récente (en 1893 et en 1907), Walter Murray craignait de ne pouvoir laisser à ses enfants un héritage substantiel. Soucieux que ses filles aient accès aux mêmes opportunités que son fils, et préférant qu’elles et il acquièrent des compétences et des connaissances qui leur permettraient une plus grande autonomie, il les plaça donc en écoles privées.

À l’âge de 16 ans, Hopper fit sa première demande d’admission au collège Vassar, l’une des « sept sœurs », prestigieuses institutions d’enseignement supérieur qui formaient à l’époque la contrepartie féminine à l’Ivy League en Nouvelle-Angleterre. Refusée en raison d’un piètre résultat à un examen de latin, elle dut attendre un an et fut finalement admise à Vassar à l’âge de 17 ans, où elle entreprit des études en physique et en mathématiques qui conduisirent à l’obtention de son baccalauréat honors en 1928. C’est alors qu’elle fut intronisée à la prestigieuse société d’excellence Phi Beta Kappa. Grace Brewster Murray termina subséquemment une maîtrise à l’Université Yale en 1930, année où elle se maria à un professeur de la New York University: Vincent Foster Hopper. Elle entreprit ensuite un doctorat en mathématiques, également à Yale, qu’elle termina en 1934. Sa thèse de doctorat, New Types of Irreducibility Criteria, traite de critères suffisants pour la factorisation de polynômes rationnels.  Elle prit également un poste de professeure adjointe de mathématiques à son alma mater, Vassar, à compter de 1931.

Hopper divorça de son mari en 1935, mais choisit de conserver son nom. Elle continua d’enseigner à Vassar jusqu’en 1943. Suite à l’attaque par l’armée de l’empire du Japon de la base militaire américaine de Pearl Harbor dans l’océan Pacifique, elle fut farouchement déterminée à entrer au service de la U.S. Navy. Refusée officiellement en raison de son âge trop avancé et de son faible poids, elle parvint finalement à s’enrôler dans la U.S. Navy Reserve, malgré qu’il lui fallût une dérogation pour son physique trop frêle. Après un bref retour aux bancs d’une école militaire, où elle s’illustra derechef, elle fut assignée à la première équipe affectée à la programmation du tout nouvel ordinateur de l’Université Harvard, baptisé Mark I, développé en collaboration avec International Business Machines (IBM) pour le compte de la U.S. Navy. Aux côtés de Richard Milton Bloch et Robert Campbell, d’autres pionniers de l’informatique, elle dirigea une petite équipe technique chargée d’opérer l’ordinateur. Elle collabora également à la conception des premiers programmes pour Mark I. Parmi ces programmes, on note entre autres une contribution importante aux recherches de John von Neumann, alors collaborateur au mystérieux projet Manhattan, de sinistre mémoire.

Après la guerre, Hopper refusa un poste de professeure titulaire à Vassar, préférant demeurer au service de la U.S. Navy Reserve comme chercheuse sous contrat à Harvard. Elle accepta en 1949 un poste de mathématicienne à la firme Eckert-Mauchly pour travailler sur UNIVAC I, qui devint plus tard le premier ordinateur commercial.

C’est chez Eckert-Mauchly, et par la suite Remmington Rand, que Hopper eut pour la première fois l’idée de concevoir un langage de programmation. UNIVAC I recevait jusqu’alors ses instructions d’un ruban perforé, sous la forme d’une séquence de codes binaires, souvent abrégés par des nombres en octal par les programmeur·se·s. Il était très facile de faire des erreurs, et pour en limiter le nombre, Hopper compila plusieurs carnets de notes qu’elle remplissait de séquences d’instructions en octal, correspondant à diverses tâches pour l’ordinateur: calculer le sinus d’un angle, un logarithme, etc. Afin d’être plus efficace, Hopper se força à apprendre l’octal, ce qui eut certes pour effet de réduire le nombre de ses erreurs de programmation. Cela ne fut  pas sans effet secondaire: après qu’elle eût signé par erreur un chèque où elle avait inscrit le montant en octal plutôt qu’en décimal, elle décida qu’une meilleure solution s’imposait.

C’est ainsi qu’elle inventa le A-0 System. Il s’agissait d’un programme qui pouvait interpréter des expressions mathématiques et qui les traduisait en séquences d’instructions binaires exécutables par la machine. Auparavant, les programmeur·euse·s devaient accomplir cette fastidieuse tâche manuellement. Ses patrons étant sceptiques, elle développa le projet sans leur permission, et ainsi fut conçu le premier compilateur et, avec lui, le premier « langage de programmation ». Le potentiel énorme de cette invention fut néanmoins très rapidement remarqué: UNIVAC I fut livré aux clients avec les systèmes A-2, puis A-3, AT-3 et  éventuellement B-0, surnommés respectivement (ARITH-MATIC, MATH-MATIC et FLOW-MATIC); les premiers langages de ce qu’on appelait alors la « programmation automatique ».

Rapidement l’idée évolua et Hopper proposa un compilateur qui pourrait interpréter des instructions en anglais; selon elle, les utilisateurs des ordinateurs n’étant pas tou·te·s mathématicien·ne·s, la possibilité de donner des instruction familières comme « affiche », « soustrait » ou « si … alors … » était plus intuitive. En 1959, elle collabora ainsi à l’organisation de CODASYL, une conférence de professionnel.le.s du milieu naissant de l’informatique, qui allait définir les bases du Common Business-Oriented Language, ou COBOL, l’un des premiers langages de programmation disponibles commercialement. Ce dernier créa une révolution dans les entreprises à travers le monde.

Jusqu’à sa retraite en 1986, Hopper travailla pour le Ministère américain de la Défense, plus spécifiquement pour l’infrastructure informatique. Elle devint ensuite une ambassadrice et consultante pour la Digital Equipment Corporation. Elle s’éteignit de causes naturelles à l’âge de 85 ans au jour de l’an 1992. Outre les langages de programmation, sa marque la plus indélébile sur la culture populaire restera probablement toujours l’invention du terme « bug », alors qu’elle retraça une erreur de calcul sur le Harvard Mark II à un insecte coincé dans un relai mécanique.

Capsule mathématique: Comment parler aux ordinateurs

On aime souvent mentionner que les premiers ordinateurs, comme par exemple le Mark I de Harvard ou l’UNIVAC de Eckert et Mauchly, étaient d’énormes machines qui occupaient des pièces entières et pesaient plusieurs tonnes. C’est tout à fait vrai, mais ça pourrait tout de même donner l’impression qu’en dehors de ces faits étonnants, ils fonctionnaient, somme toute, de manière similaire aux ordinateurs modernes.

Il n’en est pourtant rien: ces monstres électromécaniques étaient tout sauf pratiques. Oubliez les écrans et les claviers: pour communiquer avec Mark I, par exemple, il fallait d’abord saisir les données pertinentes au programme à l’aide de commutateurs et de boutons, puis on fournissait ensuite un ruban perforé, portant les instructions constituées de trois nombres binaires correspondant à une adresse où inscrire un résultat, une adresse où récupérer une donnée et un code correspondant à l’opération à effectuer. Les résultats des calculs étaient alors imprimés sur papier par des machines à écrire contrôlées par l’ordinateur. Le tout devait être opéré par une petite équipe de technicien·ne·s.

Les instructions disponibles étant rudimentaires, la réalisation de tâches plus complexes, par exemple le calcul de logarithmes ou de fonctions trigonométriques, nécessitaient souvent de très nombreuses instructions, et les tâches elles-mêmes étaient souvent répétées. Les programmeur·euse·s de tels appareils développèrent rapidement des « librairies » de sous-programmes, des morceaux de code connus qui effectuaient des tâches spécifiques.

Ces sous-programmes furent d’une grande aide pour limiter la prolifération d’erreurs, mais il existait encore plusieurs problèmes: ils devaient être perforés manuellement sur le ruban à chaque fois, et on ne pouvait pas les répéter exactement. En effet, même si les opérations étaient toujours les mêmes, certaines instructions devaient être adaptées au contexte dans lequel on utilisait le programme. Notamment, il fallait toujours s’assurer que le programme lirait et écrirait les données et les résultats aux bons emplacements dans la mémoire de l’ordinateur, et ces emplacements pouvaient être différents à chaque fois.

Les premiers langages de programmation sont apparus surtout pour faciliter la tâche au personnel chargé de programmer les machines. Inventé par John Mauchly, le Short Code, par exemple, était un système dans lequel on rédigeait d’abord un programme avec des symboles mathématiques familiers. On utilisait ensuite une grande table de conversion pour traduire le programme en une série de codes de deux chiffres, afin qu’un autre programme chargé d’interpréter ces instructions puisse effectuer les opérations nécessaires. Le Short Code devint ainsi le premier interpréteur: un programme qui convertit « en temps réel » des instructions écrites dans un langage de programmation en instructions pouvant être effectuées par la machine. Aujourd’hui, il existe plusieurs langages de programmation basés sur ce type de fonctionnement: Java, Python et PHP en sont quelques exemples bien connus.

Si le Short Code était un premier pas, plusieurs problèmes persistaient encore. Par exemple, la nécessité de sans cesse devoir adapter manuellement les références des sous-programmes à différentes adresses en mémoire signifiait que programmer un ordinateur demeurait très fastidieux. Lorsque les ordinateurs acquirent la possibilité d’enregistrer non seulement des données, mais aussi des instructions en mémoire, la tâche d’adapter les instructions exactes des sous-programmes au contexte dans lequel ceux-ci étaient utilisés devint rapidement une excellente candidate à l’automatisation.

Le principe de ce nouveau type de langage de programmation était relativement simple: un programme était d’abord écrit en faisant référence à des sous-programmes contenus dans une « librairie » de sous-programmes. Le code ainsi rédigé était ensuite passé à un autre programme, que Grace Hopper appela un compilateur. Celui-ci se chargeait d’insérer les bons sous-programmes aux bons endroits et d’ajuster au besoin les références aux adresses dans la mémoire de la machine. Le compilateur produisait ensuite une série d’instructions exécutables par la machine, qui pouvaient être stockées en mémoire et exécutées au besoin: le compilateur était en quelque sorte un programme dont la tâche était de créer d’autres programmes !

Aujourd’hui, le terme compilateur est utilisé pour désigner l’ensemble des programmes successifs qui se chargent de traduire le code écrit par un·e humain·e dans un langage de programmation, par exemple le FORTRAN, le COBOL ou le C, en une série d’instructions exécutables. De cette chaîne de programmes, l’invention de Grace Hopper, le A-0 System pour l’ordinateur UNIVAC, constitue l’éditeur de liens (linker en anglais).

Par rapport aux langages interprétés, les langages de programmation qui utilisent un système de compilation ont un avantage: alors que les programmes écrits dans un langage interprété ont toujours besoin d’un programme interpréteur pour être exécutés par un ordinateur, les programmes écrits dans un langage compilé peuvent être exécutés par eux-mêmes une fois compilés, sans avoir besoin du compilateur à chaque fois.

Cela dit, les uns comme les autres présentent un autre grand avantage: la portabilité. Au début de l’avènement des ordinateurs, chaque machine fonctionnait très différemment, et la même tâche nécessitait pour chaque ordinateur un programme différent, spécialement conçu pour chaque ordinateur respectivement. L’utilisation de langages de programmation permit de réutiliser les mêmes programmes sur des machines différentes. En effet, une fois un compilateur créé pour un langage sur une machine, tous les programmes écrits dans ce langage peuvent être compilés et exécutés par la machine en question. Il en va de même pour les interpréteurs: une fois un interpréteur créé pour une machine spécifique, celui-ci peut interpréter n’importe quel programme rédigé dans le langage approprié. La tâche d’écrire un programme est donc devenue plus ou moins complètement indépendante de la machine spécifique sur laquelle le programme doit être exécuté. Ceci a permis aux programmes d’être distribués plus largement.

Pour toutes ces raisons, les langages de programmation ont grandement contribué à la démocratisation de l’informatique; l’un des premiers objectifs de Grace Hopper était d’ailleurs de rendre les ordinateurs plus faciles à utiliser. Alors que la taille des machines a beaucoup diminué et que les capacités des ordinateurs ont explosé, les principes fondamentaux imaginés par Grace Hopper dans les années 1950 sont encore au cœur des outils informatiques que l’on utilise maintenant quotidiennement. Le langage COBOL, que Hopper a contribué à fonder dans les années 1970, est même toujours en usage aujourd’hui!


Gilbert, Lynn, Women of Wisdom : Grace Murray Hopper, 1981, ISBN 978-1-61979-403-0

Elizabeth Dickson, Remembering Grace Murray Hopper, A Legend in Her Own Time, The Department of the Navy Information Magazine, 27 juin 2011.

Elizabeth Dickson, Looking Back : Grace Murray Hopper’s Younger Years, 1992, CHIPS

Murray Hopper, Grace, New Types of Irreducibility Criteria, 1934 Yale University (Thesis)

Murray Hopper, Grace, The Education of A Computer, Proceedings of the Association for Computing Machinery Conference (Pittsburgh), mai 1952.

Murray Hopper, Grace, Automatic Coding for Digital Computers, High Speed Computer Conference, Louisiana State University, février 1955

Maurice Vincent Wilkes (1956). Automatic Digital Computers. New York: John Wiley & SonsTIME-LIFE BOOKS, Computer Languages , “Understanding Computers”, TIME-LIFE BOOKS, Alexandria, VA.