Par

On assimile souvent la naissance de l’informatique au développement de la bombe atomique et aux ordinateurs qui y étaient liés, or l’histoire de cette discipline est beaucoup plus ancienne et les problèmes de fond qu’il était nécessaire de poser et d’approfondir remontent au XIXe siècle et au début du XXe.

Est-ce que l’informatique, c’est de la logique mathématique ?
Les concepts fondamentaux de l’informatique précèdent largement leur réalisation matérielle. L’origine de cette nouvelle discipline n’est pas à chercher dans le calcul numérique mais dans une autre branche des mathématiques : la logique. Cependant, il est vrai que l’idée d’une machine universelle, c’est-à-dire reprogrammable à l’infini, ne s’est imposée qu’à la fin de la Seconde Guerre mondiale (c’est l’architecture de von Neumann, 1945).
La logique mathématique s’est considérablement développée au cours de la seconde moitié du XIXe siècle, à tel point qu’à l’orée du XXe, il semblait envisageable de fonder l’intégralité des mathématiques sur une logique formelle. Mais des paradoxes, comme celui de Russell, vinrent ruiner ce projet. Les fondements des mathématiques – que l’on croyait sûrs et certains – ont été ébranlés.
Quel est donc ce mystérieux paradoxe de Russell ?
Cela peut paraître un peu étonnant, mais il se trouve que toutes les procédures de calcul n’aboutissent pas nécessairement à un résultat. Dans la conception que les savants se faisaient de la logique à l’époque, il y avait l’idée que les mathématiques pouvaient être entièrement réécrites (formalisées) dans un unique système de signes et de règles, à partir duquel il aurait été possible de résoudre tous les problèmes mathématiques. Or le philosophe et mathématicien britannique Bertrand Russell a montré en 1903 qu’il était possible de construire un problème qui n’admet pas de réponse.

« Un “langage de programmation” peut être considéré comme un langage intermédiaire entre le langage humain qu’on appelle “la langue naturelle”, et le langage de la machine qui ne traite que des impulsions électriques. »

Russell illustre son paradoxe logique en imaginant un village dans lequel le barbier rase tous les individus qui ne se rasent pas eux-mêmes. La question est dès lors : est-ce que le barbier se rase lui-même ? S’il se rase, alors il ne se rase pas lui-même, puisqu’il ne rase que les individus qui ne se rasent pas eux-mêmes. Mais s’il ne se rase pas, alors il faut bien qu’il se rase, puisqu’il rase tous ceux qui ne le font pas eux-mêmes.
En d’autres termes, que se passe-t-il lorsqu’on définit la propriété suivante : « être une propriété qui n’est pas appliquée à elle-même » et qu’on l’applique à elle-même ? Il s’avère que chaque réponse à ce genre de question conduit à son opposée, si bien qu’il est impossible d’en fournir une réponse définitive.
Un peu plus tard, en 1928, le mathématicien allemand David Hilbert posa le « problème de la décision » : déterminer de façon mécanique (par un algorithme) si un énoncé s’obtient dans un système de déduction sans autres axiomes que ceux de l’égalité. L’ambition était donc de vérifier l’exactitude des raisonnements logiques par le calcul.

« La philosophie de l’informatique est un champ de recherche encore relativement marginal. Mais cela est appelé à changer, parce que l’informatique a pris une très grande place dans nos vies. »

Comment a-t-on résolu ces problèmes ?
En 1936, les mathématiciens Alan Turing et Alonzo Church, de manière simultanée et indépendante, ont montré qu’il n’était pas toujours possible de décider par le calcul si une proposition mathématique est démontrable ou non. Afin d’établir ce résultat, ils ont chacun conçu leur modèle de calcul visant à préciser la définition de ce qu’était une « procédure mécanique » ou algorithme. Alan Turing a mis au point ce que l’on connaît aujourd’hui sous le nom de « machine de Turing », modèle abstrait de la façon dont fonctionnent des machines programmables. De son côté, Alonzo Church a développé ce que l’on peut considérer rétrospectivement comme le premier langage de programmation de l’histoire, et qu’on appelle le « lambda-calcul ».
Ainsi l’informatique et ses principaux concepts sont-ils nés de problèmes théoriques de logique, qui n’avaient à peu près rien à voir avec les considérations techniques et matérielles auxquelles on assimile souvent cette discipline. De fait, l’informatique demeure, pour partie importante de son développement, une discipline théorique, en plus d’être un domaine d’activité technique et industriel.

N’y avait-il donc jamais eu auparavant de machines programmables ?
Il existe quelques précédents historiques. Outre les métiers Jacquard qui, au moyen d’une seule et même machine, pouvaient réaliser une infinité de motifs textiles différents, le mathématicien britannique Charles Babbage et sa collaboratrice Ada Lovelace, née Byron (1815-1852), imaginent, en 1834, la « machine analytique » dans laquelle une carte perforée contrôle les opérations d’un calculateur mécanique. Ce calculateur ne verra jamais le jour, faute de techniques suffisamment avancées pour permettre sa réalisation matérielle, mais Ada Lovelace a mis au point un certain nombre de programmes pour la machine, c’est-à-dire des instructions qui permettent à la machine de réaliser des calculs sans intervention humaine : elle est ainsi la première programmeuse informatique de l’histoire, à une époque où les ordinateurs étaient loin d’exister. L’objectif était de matérialiser des informations au moyen de trous et de pleins sur des cartes perforées (ce qui en fait l’équivalent de ce que l’on appelle aujourd’hui le « logiciel »), afin que les calculs définis sur ces cartes puissent être exécutés mécaniquement sur la machine.

« Le mathématicien britannique Charles Babbage et sa collaboratrice Ada Lovelace, née Byron (1815-1852), imaginent, en 1834, la “machine analytique” dans laquelle une carte perforée contrôle les opérations d’un calculateur mécanique. »

Tu as fait ta thèse de philosophie sur l’histoire de l’informatique. La philosophie a-t-elle donc quelque chose à dire sur cette branche des sciences et des techniques ?
La philosophie de l’informatique est un champ de recherche encore relativement marginal. Mais cela est appelé à changer, parce que l’informatique a pris une très grande place dans nos vies en transformant nos moyens de communication, de gouvernement, en affectant la façon de travailler, de produire des connaissances, des biens, des services. Face à cela, le philosophe ne peut pas détourner le regard et se doit de comprendre le phénomène dans tous ses raffinements. Il doit commencer par l’analyse des concepts qui sont au centre de la discipline informatique : machine, langage, calcul, fonction, programme... et leurs relations. Par ailleurs, le philosophe développe des questionnements et des approches particulières très différentes de celles des mathématiciens, des logiciens et des informaticiens. C’est pourquoi, sur ces sujets, l’approche philosophique est nécessaire, tout autant qu’elle est complémentaire de l’approche technique.

On entend souvent dire qu’un algorithme est, au fond, une recette de cuisine. Est-ce une bonne définition ?
C’est une bonne première approche, du moins à un certain niveau de généralité. L’algorithme se présente généralement sous la forme d’une suite d’instructions de type « fais ceci, puis fais cela, et ensuite ci et ça, etc. » comme pour réaliser une pâte à crêpes. Mais un algorithme est un procédé systématique qui s’applique quelle que soit la valeur qu’on va lui fournir. La recette de la pâte à crêpes obéit à des données fixes, ou du moins à des proportions : par exemple, pour 200 g de farine, on ne peut pas mettre 3 litres de liquide. Les algorithmes eux s’écrivent avec des variables, autrement dit des valeurs non encore définies, que l’on représente en général par une lettre.

Quelles différences y a-t-il entre une fonction et un algorithme ?
Une fonction est une règle de correspondance entre une valeur de départ et une valeur d’arrivée. L’algorithme est un procédé systématique, une séquence d’actions, qui permet de réaliser une fonction. Par exemple, une fonction pourrait être « aller au marché », et un algorithme serait « un chemin pour y aller ». Il y a une infinité d’algorithmes pour accomplir une même action : personne ne se rend au marché exactement de la même manière et pourtant tout le monde y va.
Pour mieux comprendre cela avec des concepts mathématiques, prenons une fonction simple : ajouter 2, on note f(x) = x+2. Si je remplace la variable x par 14, la fonction me donne 16. Il peut y correspondre plusieurs algorithmes : on peut ajouter 2 directement, mais on peut aussi ajouter 1 puis 1 (ou 3 moins 1, etc.).

Qu’est-ce qu’un « langage de programmation » ?
Cela peut être considéré comme un langage intermédiaire entre le langage humain (français, anglais, mandarin, etc.), qu’on appelle « la langue naturelle », et le langage de la machine qui ne manipule rien d’autre que des 0 et des 1, car il ne traite que des impulsions électriques. Les langues naturelles comportent bien des ambiguïtés et des imprécisions, ce qui fait qu’il est parfois nécessaire d’avoir un peu d’intuition pour comprendre son interlocuteur. Ainsi notre langue ne peut-elle être comprise par une machine. Mais on ne peut pas, non plus, n’utiliser que des 0 et des 1, car cela deviendrait très vite fastidieux. C’est en cela que le rôle intermédiaire des langages de programmation est utile. Il s’agit de langages précis, avec une grammaire simple, et dans lesquels un mot a une seule signification.

Tu as consacré ta thèse à la notion de « type », de quoi s’agit-il ?
Un « type », en logique et en informatique, est un peu comme un agent de contrôle du bon déroulement des procédures de calcul, pour nous assurer que nous allons bien parvenir à un résultat. Bertrand Russell a introduit cette notion comme un moyen d’éliminer ou d’éviter le paradoxe qu’il avait découvert. Depuis lors, elle a largement évolué, mais conserve toujours son rôle régulateur. En informatique, en effet, elle désigne un dispositif permettant d’éviter que les programmes ne tournent en boucle. Elle permet d’interdire la construction de certaines combinaisons qui, parce que dépourvues de signification, échoueraient à donner un résultat. Par exemple, grâce au typage, on ne peut additionner un mot et un chiffre : un mot a le « type » d’une chaîne de caractères, tandis que le chiffre 4 appartient au « type » des entiers naturels.
Il s’agit donc de contrôler la signification dans des langages formels. Le type correspond dans le calcul à la notion de signification dans le langage, il permet de définir les limites de ce qui fait sens : de même qu’il y a des règles de grammaire pour assurer la construction de phrases pourvues de sens, de même les langages de programmation, au moyen desquels nous communiquons avec la machine, obéissent à des règles, à une grammaire dont les types sont une composante essentielle.

Endy Hammache est philosophe des sciences. Il est docteur de l'université Jean-Moulin Lyon-III.

Propos recueillis par Yannis Hausberg.

Cause commune30 • septembre/octobre 2022