Site WWW de Laurent Bloch
Slogan du site

ISSN 2271-3905
Cliquez ici si vous voulez visiter mon autre site, orienté vers des sujets moins techniques.

Pour recevoir (au plus une fois par semaine) les nouveautés de ce site, indiquez ici votre adresse électronique :

L’informatique à la lumière de quelques textes de Leibniz
Article mis en ligne le 19 juillet 2016
dernière modification le 18 septembre 2021

par Laurent Bloch

Introduction

Le texte qui suit est la traduction de la communication que j’ai présentée à la conférence de Xénobiologie XB2 à Berlin le 24 mai 2016. Pour suivre Philippe Marlière, le président de la conférence, la xénobiologie est à la biologie ce que l’astronautique est à l’astronomie, ou aussi si l’on veut une branche expérimentale de la métaphysique.

La conférence était organisée par Philippe Marlière et l’équipe Isthmus, dans le cadre de l’année Leibniz qui commémorait le 300ième anniversaire de la mort de Gottfried Wilhelm Leibniz, le père fondateur de la multiplicité des mondes possibles. De ce fait, parce que l’informatique est au cœur de la xénobiologie, j’avais l’honneur de la communication d’ouverture de la conférence, L’informatique à la lumière de quelques textes de Leibniz, dans le bâtiment historique de l’Académie des sciences de Berlin et du Brandebourg, une institution fondée en 1700 par Leibniz lui-même, à l’époque sous la dénomination d’Académie des sciences royale de Prusse.

*Informatique plutôt que Computer Science

La science dont il va être question ici, et qui englobe l’algorithmique, la programmation, les systèmes d’exploitation, les réseaux informatiques, les bases de données et quelques autres rubriques, et que nous appelons informatique, est le plus souvent désignée en anglais par la locution Computer Science, ce qui semble (pas seulement à moi) inapproprié, parce que s’il sagit bien d’une science, ce n’est pas une science des ordinateurs.

L’ingénieur et professeur allemand Karl Steinbuch a formé en 1957 le mot „Informatik“, en 1962 l’ingénieur français Philippe Dreyfus a créé le mot informatique, traduit en anglais par “Informatics”, à mon avis meilleur que Computer Science, parce qu’il agrège information et automatique. Ainsi que le signale Michel Volle, une donnée ne peut devenir une information que si un être humain l’interprète. La conjonction des mots “information” et “automatique” suggère donc une coopération entre l’être humain et l’automate. L’information est ce qui donne à quelque chose, de l’intérieur de cette chose, une forme ; l’automatique permet l’automatisation de ce processus ; le résultat est un automate.

La chose à laquelle il s’agit ici de donner une forme est une idée, que nous nommerons un algorithme. La forme donnée sera appelée un programme, qui est un texte.

*Automates

Aussi loin que nous puissions regarder dans le passé, les humains ont essayé de construire des automates pour éviter de travailler. Le piège préhistorique, dont la trappe s’ouvre sous la proie, à moins que la herse ne lui tombe sur le dos, le canard de Vaucanson qui nageait, étaient des automates.

Ces automates, et d’autres du même genre, font toujours la même chose.

Les automates dont il est question avec l’informatique sont différents, ils contiennent un langage, qui permet de décrire des procédures effectives. Inventer des procédures effectives (des algorithmes) consiste à déterminer un enchaînement d’opérations élémentaires qui exécuteront les calculs nécessaires à la solution de problèmes pour lesquels existent des solutions calculables (il y a des problèmes sans solution et des solutions incalculables). Alonzo Church et Alan Turing ont montré qu’il était possible de donner un modèle universel de tels automates, que ce soit la machine de Turing ou le λ-calcul, qui sont équivalents.

Ces automates universels sont constitués d’un objet matériel, une machine, l’ordinateur, et d’une entité invisible et intangible, le programme. Comme nous l’avons dit, le programme est un texte. Certains programmes définissent aussi un langage, qui est un méta-langage par rapport au langage intrinsèque de la machine, et dans ce langage peut être exprimé un autre programme. C’est ainsi que les machines de traitement des données (les ordinateurs) sont universelles et programmables.

Gottfried Wilhelm Leibniz fut un précurseur de toutes ces idées, et de plusieurs façons. Les chercheurs à l’origine des idées de l’informatique (Gottlob Frege, Alonzo Church, Alan Turing) n’avaient pas connaissance des travaux antérieurs de leur précurseur Leibniz. Le chercheur qui inventa l’ordinateur (terme meilleur que l’inexact computer), John von Neumann, connaissait les travaux de Church et de Turing dans le champ de la logique, mais le lien qu’il pouvait établir entre ces travaux et ce que nous appelons maintenant architecture de von Neumann était très ténu, si seulement présent.

En quoi Leibniz fut-il un précurseur de l’informatique

 Il a construit une calculatrice à quatre opérations (1672-1694), avec un bug, comme tout système informatique qui se respecte ;
 il a prévu que l’arithmétique binaire serait particulièrement bien adaptée au calcul automatique (1703) ;
 sa characteristica universalis, conçue pour être le langage d’une scientia universalis, n’a pas obtenu ce résultat, mais par elle Leibniz a montré que le calcul pouvait s’appliquer à autre chose qu’à des nombres, et notamment à des propositions logiques, une idée développée ultérieurement, indépendamment de Leibniz, par Augustus de Morgan, George Boole, Gottlob Frege et leurs successeurs.

En outre, le philosophe contemporain Baptiste Mélès a pu établir une correspondance entre le style de programmation par objets et le concept leibnizien de monade, avec des exemples de programmes en Java à l’appui.

La profondeur et la perspicacité de ces idées de Leibniz (un des penseurs les plus influents, même si souvent oublié, de son millénaire), leur prémonition du monde de l’informatique, ne sont pas juste des coïncidences, mais les signes émergés d’un courant de pensée souvent (mais pas tellement) invisible, allé d’Aristote à Kurt Gödel et Alan Turing avec le propos de substituer le calcul au raisonnement partout où il est possible. L’œuvre majeure d’Alan Turing fut de construire une méthode de calcul de cette possibilité (ou de cette impossibilité).

*La machine à calculer de Leibniz

C’est en 1672 à Paris que l’idée de construire une machine à calculer vint à Leibniz, puis il apprit l’existence de la machine de Blaise Pascal [1] par la lecture des Pensées [2]. Il n’eut dès lors de cesse que de surpasser la machine de Pascal, qui ne pouvait effectuer que des additions et des soustractions, en réalisant une machine apte à la multiplication et à la division. Il présenta son projet à la Royal Society de Londres le 1er février 1673, y reçut de chaleureux encouragements et y fut admis en tant que membre.

Une machine prototype en cuivre fut construite entre 1674 et 1685. La machine connue comme ancienne machine fut construite entre 1686 et 1694. La machine la plus récente, qui nous est parvenue, fut construite et utilisée de 1690 à 1720 (cf. Jan-Willem Liebezeit [3]).

Il convient de noter que la capacité d’exécuter les quatre opérations arithmétiques élémentaires donne la capacité d’exécuter n’importe quel calcul numérique.

La conception de cette machine comportait un mécanisme destiné à garder en mémoire le multiplicande de l’opération : un dispositif d’entraînement réglable, basé sur un engrenage mobile appelé dès lors cylindre de Leibniz et utilisé par toutes les machines à calculer mécaniques ultérieures. La machine de Leibniz comportait huit cylindres de ce type, ce qui autorisait un multiplicande à huit chiffres décimaux.

La possibilité de garder une donnée en mémoire est essentielle au calcul automatique, techniquement aussi bien que théoriquement. La machine de Leibniz fut la première à en être dotée.

Cette machine comportait un bug dans le mécanisme de retenue, qui provoquait des erreurs avec des multiplicateurs de deux ou trois chiffres. Et, de même que Pascal avant lui et que Babbage plus tard, Leibniz éprouva des difficultés à obtenir les engrenages de précision exigés pour le bon fonctionnement de sa machine.

*Arithmétique binaire

L’idée de l’arithmétique binaire vint à Leibniz de sa correspondance avec des missionnaires européens chrétiens en Chine et de la lecture de leurs œuvres, plus particulièrement avec le jésuite français Joachim Bouvet, au service de l’empereur Kangxi, et qui envoya à Leibniz un diagramme des 64 hexagrammes de Fuxi.

Fuxi (Fohy dans le texte de Leibniz Explication de l’arithmétique binaire, écrit en français pour l’Académie Royale des Sciences) est un personnage de la mythologie chinoise, auteur des Huit Trigrammes utilisés dans les cosmologies chinoises, notamment taoïste, pour représenter les principes fondamentaux de la réalité,vus comme une série de huit concepts interdépendants. Chaque trigramme est constitué de trois lignes, chacune d’entre elles continue : | ou interrompue : ¦, pour représenter respectivement le yang ou le yin.

Si elles étaient pour les Chinois de l’antiquité les symboles du yin et du yang, ces deux sortes de lignes peuvent aussi être envisagées comme les deux chiffres de l’arithmétique binaire, 0 et 1. Trois lignes de deux sortes peuvent donner huit combinaisons, pour les nombres de 0 à 7 (23−1). Les hexagrammes de Fuxi, avec six chiffres binaires, peuvent représenter les nombres de 0 à 63 (26−1).

Leibniz n’était ni le premier à connaître les hexagrammes de Fuxi, ni le premier à s’intéresser à l’arithmétique binaire : Thomas Harriot (1560-1621) a laissé une table de valeurs binaires, et Juan Caramuel y Lobkowitz (1606-1682) a étudié les systèmes de numération avec des bases différentes de 10. Mais il fut le premier à voir un lien entre les deux.

Surtout, Leibniz comprit qu’avec l’arithmétique binaire les calculs étaient beaucoup plus simples qu’avec les autres bases : « au lieu de la progression de dix en dix, j’ai employé depuis plusieurs années la progression la plus simple de toutes, qui va de deux en deux, ayant trouvé qu’elle sert à la perfection de la science des Nombres. Ainsi je n’y emploie point d’autres caractères que 0 et 1, et puis allant à deux, je recommence. C’est pourquoi deux s’écrit ici par 10, et deux fois deux ou quatre par 100, et deux fois quatre ou huit par 1000, et deux fois huit ou seize par 10 000, et ainsi de suite. Voici la Table des Nombres de cette façon, qu’on peut continuer tant que l’on voudra.

Cette expression des Nombres étant établie, sert à faire très facilement toutes sortes d’opérations.

Et toutes ces opérations sont si aisées, qu’on n’a jamais besoin de rien essayer ni deviner, comme il faut faire dans la division ordinaire. On n’a point besoin non plus de rien apprendre par cœur ici, comme il faut faire dans le calcul ordinaire, où il faut savoir, par exemple, que 6 et 7 pris ensemble font 13, et que 5 multiplié par 3 donne 15, suivant la Table d’une fois un est un, qu’on appelle Pythagorique. »

Avec le système de numération binaire la multiplication est très simple, parce que la seule table de multiplication est celle de 1 par 1. Mais surtout les chiffres 0 et 1 peuvent représenter soit leur valeur numérique, soit les valeurs vrai et faux de la logique algébrique inventée par George Boole au milieu du XIXe siècle [4].

L’algèbre de Boole donne un formalisme pour la logique des propositions. Par exemple, soient P et Q deux propositions, “P ET Q” est vraie si P et Q sont vraies toutes les deux, et fausse autrement. “P OU Q” est vraie si P, ou Q, ou les deux sont vraies. Augustus de Morgan a montré que “non (P et Q)” est équivalent à “(non P) ou (non Q)” et aussi que “non (P ou Q)” est équivalent à “(non P) et (non Q)”. Le formalisme booléen (qui ne figure pas dans le texte original de Boole) utilise les symboles suivants :

 ¬ est l’opérateur logique de négation (NON),
 ∧ est l’opérateur logique de conjonction (ET),
 ∨ est l’opérateur logique de disjonction (OU),
 ⇐⇒ est un symbole métalogique qui signifie peut être remplacé dans une preuve logique par.

Avec des symboles, les lois de de Morgan peuvent s’écrire ainsi :

 ¬ (P ∧ Q) ⇐⇒ (¬ P) ∨ (¬ Q) (1)
 ¬ (P ∨ Q) ⇐⇒ (¬ P) ∧ (¬ Q) (2)

Les opérations logiques de l’algèbre de Boole permettent de réaliser les opérations de l’arithmétique binaire. Les opérations booléennes sont intéressantes parce qu’elles sont très simples et faciles à réaliser par des circuits électroniques. Tous les ordinateurs contemporains sont réalisés au moyen d’une opération unique, le NON ET logique (NAND), noté ↑ :

 x ↑ y ⇐⇒ ¬ (x ∧ y)

 x ∧ y peut s’écrire xy,
 x ∨ y peut s’écrire x+y et
 ¬ (x ∧ y) simplement xy

(figure par Emmanuel Lazard)

*Qu’est-ce qu’un ordinateur ?

Les ordinateurs modernes sont en fait des appareils d’une grande simplicité, beaucoup plus simples que les machines mécaniques inventées par Schickard, Pascal, Leibniz ou Babbage. Comme précisé ci-dessus, ils sont entièrement constitués de circuits NAND (on dit habituellement porte NAND). Ils comportent essentiellement une mémoire destinée à emmagasiner des valeurs codées par des chiffres binaires, une unité arithmétique et logique (ALU) qui réunit les circuits logiques qui implémentent les opérations arithmétiques et logiques, et une unité de contrôle qui déclenche l’exécution des opérations dans le bon ordre et à l’instant voulu.

C’est peut-être difficile à comprendre parce que c’est trop simple : cette simplicité est de fait incroyable. Les opérations sont des dispositifs physiques, constitués de circuits électroniques, qui ont des effets sur les données stockées en mémoire. La séquence des opérations est décrite par le texte d’un programme (c’est la partie compliquée de la chose) ; les phrases du texte sont appelées instructions ; une instruction correspond à une opération de l’ALU ou de l’unité de contrôle. La contribution majeure de John von Neumann à cette conception consiste à envisager le texte du programme comme un ensemble de données ordinaires, stockées en mémoire comme les autres. Les circuits de l’unité de contrôle lisent le texte du programme et déclenchent l’exécution des opérations, une par une (abstraction faite de détails techniques sans importance ici).

Les actions effectuées par les opérations de contrôle entrent dans un petit nombre de catégories :

 modifier la séquence des opérations en donnant l’emplacement de la prochaine opération à lire ;
 choisir l’opération suivante en fonction du résultat de la précédente ;
 répéter une séquence d’opérations ;
 charger (load) une donnée depuis la mémoire dans une petite mémoire spéciale interne à l’ALU, afin que les opérations relatives à cette donnée soient plus rapides ; ces mémoires spéciales sont appelées registres, analogues aux cylindres de Leibniz mentionnés ci-dessus, en ce qu’il s’agit de garder dans l’ALU un opérande pour le temps de l’opération à laquelle il est soumis ;
 décharger (store) une donnée d’un registre vers la mémoire.

De même les effets des opérations arithmétiques et logiques entrent dans un petit nombre de catégories :

 déplacer des données dans la mémoire ;
 recopier des données d’un emplacement à un autre de la mémoire ;
 modifier des données selon une opération booléenne ;
 combiner des données selon une opération booléenne ; le résultat d’une telle combinaison peut être une opération arithmétique.

Comme toutes les données sont codées numériquement, toutes les opérations sur des données, qu’elles soient numériques, textuelles, graphiques, sonores ou autres, se ramènent à des opérations arithmétiques, c’est-à-dire logiques.

*Assembler les morceaux avec cohérence

Le système de calcul décrit ci-dessus est constitué de beaucoup d’éléments, chacun assez simple, mais faire fonctionner l’ensemble efficacement exige de les assembler de façon cohérente. Le moyen d’obtenir cette cohérence est le langage, et, là aussi, Leibniz avait les idées justes. Malheureusement, personne ne les avait comprises en leur temps, et elles furent redécouvertes laborieusement deux siècles plus tard par Gottlob Frege, Alonzo Church, Alan Turing et quelques autres. Et de même les auteurs des premiers langages de programmation comme John Backus (Fortran) ignoraient (au départ) les travaux de Frege, Church et Turing.

En fait, aux débuts de l’informatique, le besoin de véritables langages n’apparaissait pas avec évidence. Quand Backus inventa Fortran, il pensait aux formules mathématiques. L’idée de langage s’imposa plus tard, surtout avec le projet Algol.

Dans la coulisse des langages de programmation il y a l’idée de système formel, c’est-à-dire d’un ensemble fini de règles qui s’appliquent à des ensembles dénombrables. Avant les systèmes formels contemporains, inaugurés par Frege, Leibniz avait eu l’idée d’une characteristica universalis, un langage pour une scientia universalis. Leibniz n’a pas écrit de traité complet pour ce projet, ses idées à ce propos sont dispersées dans de multiples lettres et papiers non publiés, et le mérite de les avoir réunies et publiées revient essentiellement à Louis Couturat [5] et à Bertrand Russell [6]. J’emprunte à Renée Bouveresse [7] sa description du programme de Leibniz pour une scientia universalis ; il comprend deux parties : une characteristica universalis, ou système de notation, pour formuler sans ambiguïté chaque élément d’information et faciliter la communication entre les savants, et un calculus ratiocinator, une méthode formelle de raisonnement, parce que le calcul n’est rien d’autre qu’une opération sur des symboles, qui peut s’effectuer non seulement sur des quantités, mais pour toute sorte de raisonnement.

Ces idées de calcul logique sont exactement les idées inhérentes à la programmation des ordinateurs.

Communication entre des objets

La programmation par objets repose sur l’idée d’objets qui peuvent contenir (encapsuler) des données, sous forme de champs souvent nommés attributs, et des programmes, sous forme de procédures, habituellement nommées méthodes.

Ce style de programmation, par opposition aux styles procédural ou fonctionnel, évite le partage de données ou le passage d’arguments entre procédures. Les objets communiquent entre eux par échange de messages. Les messages peuvent contenir des données, ainsi que l’indication des méthodes que l’objet émetteur demande à l’objet destinataire d’appliquer aux données.

Selon ce modèle de programme, un objet peut recevoir des messages, qui modifient son état, et envoyer des messages, dans le but de modifier d’autres objets, c’est-à-dire le monde environnant [8].

Baptiste Mélès a remarqué [9] qu’une analogie pouvait être établie entre ce comportement des objets et certaines propriétés des monades de Leibniz : Une monade en elle-même, et dans le moment, ne saurait être discernée d’une autre que par les qualités et actions internes, lesquelles ne peuvent être autre chose que ses perceptions (c’est-à-dire les représentations du composé, ou de ce qui est dehors dans le simple), et ses appétitions (c’est-à-dire ses tendances d’une perception à l’autre) qui sont les principes du changement.

Dans son article Baptiste Mélès nous livre quelques exemples d’objets en Java. Il observe que dans ce monde de classes (i.e. types) d’objets le programmeur occupe la place de Dieu, parce qu’il sait tout (il est censé tout savoir…) de toutes les classes.

La programmation par objets nous donne des objets capables de communiquer entre eux : cette propriété pourrait contribuer à l’élaboration de modèles autour de la notion de fonction biologique, c’est-à-dire de la raison pour laquelle un objet ou un processus est advenu dans un système qui évoluait selon un processus de sélection.

Leibniz et la loi de Metcalfe

C’est lors du congrès de 2018 de la Société informatique de France que me fut révélée par Michel Serres, qui en était le conférencier invité pour un dialogue avec Gilles Dowek, une cinquième prémonition de Leibniz, assez étroitement associée à la précédente.

En voici un résumé très sommaire : les monades de Leibniz ne communiquent pas directement entre elles, elles ne parlent qu’à Dieu, et si elles ont un message à transmettre à une autre monade, il est relayé par Dieu. Cela semble très inefficace pour une communication un à un, mais c’est au contraire parfait pour les communications de un à beaucoup. Michel Serres observait que c’était au principe des réseaux sociaux, et Gilles Dowek me fit remarquer qu’ainsi Leibniz avait découvert, avec près de trois siècles d’avance, la loi de Metcalfe, qui énonce que l’efficacité d’un réseau de communication croît comme le carré du nombre de ses membres.

Conclusion

L’œuvre de Leibniz est immense, il a abordé de nombreux domaines avec des idées très en avance sur son temps, et certaines restent encore à découvrir et à comprendre. Il est pitoyable que Voltaire, un bien moindre philosophe, ait pu se moquer cruellement de lui, après sa mort de surcroît, dans son roman Candide, où il est peint sous les traits du philosophe Pangloss, dont la devise est que « tout est pour le mieux dans le meilleur des mondes possibles ». Si, selon Roland Barthes, Voltaire siège à l’Académie des surestimés, ce n’est pas le cas de Leibniz.

Qu’il y ait une science informatique, fille de la logique sans doute plus que de la mathématique, reste encore à établir plus solidement. Selon le logicien allemand Heinrich Scholz, il y a deux périodes de la science de la logique : d’Aristote à Leibniz, et de Leibniz à nos jours, parce que Leibniz a ouvert des voies nouvelles au calcul logique. Presque tout le monde a ignoré l’œuvre de Leibniz dans le domaine de la logique jusqu’à la seconde moitié du XIXe siècle, lorsque la naissance d’idées similaires (de Morgan, Boole, Frege…) les fit redécouvrir.

En tout état de cause, les écrits de Leibniz sur la logique et le calcul sont de nature à aider les informaticiens à mieux comprendre leur science, et un travail de traduction, d’édition et de commentaire en cours devrait bientôt en faciliter l’accès.

This document was translated from LATEX by HEVEA.