Une machine électronique
Introduction :
Dans ce cours, nous continuons notre histoire de l’informatique par l’apparition des premiers ordinateurs électroniques, dont nous allons voir le rôle qu’ils ont joué pendant la Seconde Guerre mondiale. Ce sera l’occasion d’étudier l’ordinateur moderne sous son aspect le plus physique : son aspect électronique. Nous allons aussi continuer à étudier la représentation binaire des données en nous intéressant aux nombres réels et aux textes.
La première génération
La première génération
Les débuts
Les débuts
Dans les années 1930, les mathématiciens progressent dans la compréhension et la théorisation du calcul automatique.
Le Britannique Alan Turing, notamment, fournit la première description théorique de ce que fait, mathématiquement, une machine à calculer programmable. Pour ces travaux, il est considéré comme l’un des fondateurs, si ce n’est le fondateur, de la science informatique.
D’un point de vue technique, les progrès en électronique permettent la conception des premières machines à programmer automatiques utilisant les propriétés de l’électricité.
On considère parfois que la première génération d’ordinateurs est celle des calculateurs électromécaniques (vers 1940-1955), c’est-à-dire composés à la fois d’éléments électriques et mécaniques (valves, tubes à vide, etc.).
C’est notamment pendant la Seconde Guerre mondiale, et pour des applications militaires, que nombre de ces machines furent développées.
Machines de guerre
Machines de guerre
En Allemagne, l’ingénieur allemand Konrad Zuse conçoit la machine Z2, qui servit aux calculs nécessaires au guidage des missiles de la Wermarcht. Plus tard, Zuse développera des modèles civils, les Z3 et Z4.
En Angleterre, c’est pour la cryptanalyse, c’est-à-dire le décryptage des codes secrets, que le renseignement britannique développèrent des calculateurs électromécaniques appelées « bombes », comme la célèbre Colossus.
Colossus, la plus imposante des « bombes » britanniques (image des Archives Nationales Britanniques, domaine public)
Les cryptanalystes britanniques (les casseurs de codes secrets) de l’équipe de Bletchley Park, dont le fameux Alan Turing, ont joué un rôle essentiel dans le renseignement allié, qui sera tenu secret pendant des décennies.
L’ENIAC est l‘équivalent américain de ces projets. Conçu pour réaliser des calculs balistiques, il ne sera terminé qu’après la guerre. À sa conception, l’ENIAC est le calculateur le plus puissant au monde, et de loin. Mais cette prouesse est plus due à ses dimensions (il pèse 30 tonnes et occupe la surface d‘un terrain de volley-ball) qu’à la qualité de sa conception (par exemple, il utilise encore le décimal au lieu du binaire).
L’ENIAC (Electronic Numerical Integrator and Computer) in Philadelphia, Pennsylvania.
Un entretien coûteux
Un entretien coûteux
Les calculateurs électromécaniques sont des machines qui requièrent toute une équipe pour leur usage et leur entretien.
D’abord, à cause de la fragilité des composants mécaniques : les tubes à vide peuvent éclater si un insecte s’introduit dedans (ce qui est l’origine du mot « bug »), il faut alors trouver quel tube est cassé parmi les milliers de l’appareil et le changer. Ensuite, parce que le passage des instructions à la machine est une procédure fastidieuse, qui demande souvent de recabler la machine à plusieurs endroits.
Les réels en binaire
Les réels en binaire
Pour calculer, par exemple, des trajectoires de missiles, il ne suffit plus de savoir réaliser des opérations sur les nombres entiers. Nous allons voir dans cette partie comment représenter en binaire des nombres réels.
Codage en virgule fixe
Codage en virgule fixe
Codage en virgule fixe :
Le codage binaire d’un nombre réel est dit en virgule fixe si l’on attribue pour ce codage deux paquets de bits : un pour les nombres avant la virgule, un pour les nombres après la virgule.
Dans un codage en virgule fixe, la partie entière (les nombres avant la virgule) est codée comme un nombre entier, voire un entier relatif. En revanche, il ne serait pas du tout pratique de coder ainsi les nombres après la virgule.
Par exemple, comme avec $1$ octet, on peut représenter les nombres de $0$ à $255$, si l’on utilise $1$ octet pour coder les nombres après la virgule comme un nombre entier, on pourrait coder $12,005$ ou $12,137$ mais pas $12,9$ ou $12,561$.
Voilà pourquoi on utilise une autre convention.
Dans le codage binaire en virgule fixe, chaque bit après la virgule code l’inverse d’une puissance de $2$.
$4$ | $2$ | $1$ | . | $\dfrac{1}{2}$ | $\dfrac{1}{4}$ | $\dfrac{1}{8}$ | $\dfrac{1}{16}$ | $\dfrac{1}{32}$ | $\dfrac{1}{64}$ |
C’est, au final, la même chose que ce qui se fait en décimal, où chaque nombre après la virgule code l’inverse d’une puissance de $10$ (les dixièmes, centièmes, millièmes…).
Voici des nombres réels codés en virgule fixe avec un octet de chaque côté de la virgule :
$0101\,1010\,1000\,0000$ | $90 + \dfrac{1}{2} = 90,5$ |
$0001\,1111\,1010\,0000$ | $31 + \dfrac{1}{2} + \dfrac{1}{8} = 31,625$ |
$0000\,0000\,0000\,0001$ | $0 + \dfrac{1}{256} = 0,00390625$ |
$0000\,0011\,1111\,1111$ | $3 + \dfrac{1}{2} + … + \dfrac{1}{128}+\dfrac 1{256} = 3,99609375$ |
Dans un codage en virgule fixe, la précision possible est définie par le nombre de bits après la virgule.
Codage en virgule flottante
Codage en virgule flottante
Dans ses machines civiles comme militaires, l’ingénieur allemand Konrad Zuse introduit une nouvelle manière de représenter les nombres réels, le codage en virgule flottante, qui deviendra la représentation la plus utilisée de nos jours.
Codage en virgule flottante :
Dans un codage en virgule flottante d’un nombre réel, le nombre est représenté par trois éléments :
- un bit de signe ($0$ positif, $1$ négatif) ;
- un nombre entier, appelé mantisse, exprimée dans une base donnée ;
- et un autre entier, l’exposant, indiquant à quelle place la virgule doit être placée dans la mantisse pour donner le nombre réel.
En d’autres termes, le nombre sera égal à : $$\text{signe}\,\times\,\text{mantisse}\,\times\,\text{base}^{\text{exposant}}$$
Prenons l’exemple d’un codage décimal d’un nombre réel en virgule flottante : si j’ai un bit de signe positif, une mantisse égale à $8\,164\,251$ et un exposant de $5$, alors mon nombre vaut :
$8\,164\,251\times10^{-5} = 81,64251$
Si mon exposant vaut $3$, alors mon nombre est de :
$8\,164\,251\times10^{-3} = 8164,251$
En pratique, dans un ordinateur, le codage n’est pas décimal mais est la plupart du temps binaire.
- Le fonctionnement est le même que le codage en virgule fixe (chaque nombre après la virgule est l’inverse d’une puissance de $2$), à ceci près que l’exposant indique où se trouve réellement la virgule.
Lorsque l’on choisit de faire des calculs sur les réels, il faut donc faire un certain nombre de choix :
- soit virgule fixe et, quand c’est le cas : « où placer la virgule ? » ;
- soit virgule flottante et, quand c’est le cas : « combien de bits pour l’exposant ? ».
Chacun de ces choix peut avoir sa pertinence :
- quand on connaît l’ordre de grandeur des entiers sur lesquels on va travailler, la virgule fixe est meilleure que la virgule flottante, puisque aucun bit n’est utilisé pour placer l’exposant ;
- quand on ne connaît pas l’ordre de grandeur, la virgule flottante sera plus sûre car elle permettra de meilleures possibilités : les flottants permettent à la fois de coder des nombres très grands (mais avec peu de précision après la virgule) et des nombres très petits.
Nombre flottant :
On appelle nombre flottant ou flottant (float) un nombre réel exprimé en virgule flottante.
Le problème de l’arrondi
Le problème de l’arrondi
Un autre problème provient de la propriété suivante :
Il y a moins de fractions qui « tombent juste » dans le système binaire que de fractions qui « tombent juste » dans le système décimal.
- $\dfrac{1}{10}$ en décimal : $0,1$
- $\dfrac{1}{10}$ en binaire : $0,110\,0110\,0110\,0110…$
Pour donner un ordre de grandeur, voici le début de la liste des nombres qui tombent juste en binaire, classés par le nombre de chiffres nécessaire pour les exprimer en décimal :
$\begin{aligned} 0&,5 \\ 0,25\,&;\,0,75 \\ 0,125\,;\,0,375\,&;\,0,525\,;\,0,875 \\ .&.. \end{aligned}$
En conséquence, il est très, très souvent nécessaire d’arrondir les nombres qui sont exprimés en virgule fixe ou flottante.
On peut arrondir $\dfrac{1}{10}$ par
$0,110\,0110\,0110\,0110\,0110\,0110$ ; ce qui, en décimal, n’est pas égal à $0,1$, mais à
$0,100\,0000\,0149\,0116\,1193\,8476\,5625$.
Pour cette raison, il faut absolument éviter de tester l’égalité de deux nombres exprimés en virgule fixe ou en virgule flottante.
Par exemple, cette expression booléene a toutes les chances de valoir « faux » dans un programme informatique :
$0,1 + 0,1 + 0,1 + 0,1 + 0,1 = 0,5$
La norme IEE 754
La norme IEE 754
Jusque dans les années 1980, chaque fabricant d’appareils informatiques possédait ses propres normes sur la représentation des nombres réels en virgule flottante (combien de bits accorder à chaque valeur, comment gérer le signe du nombre, comment faire les arrondis, etc.), ce qui compliquait beaucoup la tâche des informaticiens.
La norme IEE 754 définit un certain nombre de formats standards pour la représentation des nombres flottants. Aujourd’hui, la majorité des langages de programmation et des unités de calcul en nombre flottant utilisent des formats issus de cette norme.
Il y a encore d’autres façons de représenter les réels que les virgules fixes et les virgules flottantes (le calcul formel, la forme rationnelle, le système de nombres logarithmiques, etc.), mais elles ne sont pas étudiées dans ce cours.
Coder des caractères alphabétiques
Coder des caractères alphabétiques
Une question de standardisation
Une question de standardisation
Représenter des caractères alphabétiques en binaire est, a priori, une affaire bien plus simple : il suffit de se mettre d’accord sur une norme qui assigne un caractère spécifique à une chaîne de bits donnée.
En pratique, la tâche s’avère plus compliquée que cela, notamment à cause de la question du nombre de bits utilisés par caractère : plus ce nombre est élevé, plus il est possible de représenter des caractères différents, mais plus chaque caractère prend de la place en mémoire, ou dans une télécommunication.
Jusque dans les années 1960, chaque matériel informatique possédait son propre format, et les appareils informatiques étaient souvent fournis avec des programmes et des tables de correspondance permettant de traduire les formats d’un appareil à un autre.
Un effort de standardisation a été fait à partir des années 1960, mais, comme nous allons le voir, plusieurs formats différents existent encore à l’heure actuelle, chacun possédant des avantages et des inconvénients sur les autres.
Trois formats standards
Trois formats standards
ASCII :
Le format ASCII (American Standard Code for Information Interchange) a été conçu dans les années 1960. Chaque caractère est codé sur $7$ bits, il y a donc $128$ caractères disponibles.
Ce code a été prévu pour écrire l’anglais tel que parlé aux États-Unis, il manque donc de nombreux caractères utilisés dans d’autres langues, comme le tréma ( ¨ ). Le dollar ($\text{\textdollar}$) est un caractère présent, mais il n’y a aucun autre symbole monétaire (ni l’euro € ni la livre $\pounds$).
La table ASCII extraite d'un manuel d'imprimante de 1972, domaine public.
Un caractère de contrôle est un « caractère » codé par une norme qui n’en est pas vraiment une, mais qui est plutôt une indication qui peut s’avèrer utile dans la présentation du texte comme « début de texte », « passage à la ligne » ou « fin de texte ».
La table ASCII comporte $33$ caractères de contrôle.
Lettres | En base 2 | ||||||
A | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
B | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
C | 1 | 0 | 0 | 0 | 0 | 1 | 1 |
D | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
E | 1 | 0 | 0 | 0 | 1 | 0 | 1 |
F | 1 | 0 | 0 | 0 | 1 | 1 | 0 |
G | 1 | 0 | 0 | 0 | 1 | 1 | 1 |
H | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
I | 1 | 0 | 0 | 1 | 0 | 0 | 1 |
J | 1 | 0 | 0 | 1 | 1 | 0 | 0 |
K | 1 | 0 | 0 | 1 | 0 | 1 | 1 |
L | 1 | 0 | 0 | 1 | 1 | 0 | 0 |
M | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
N | 1 | 0 | 0 | 1 | 1 | 1 | 0 |
O | 1 | 0 | 0 | 1 | 1 | 1 | 1 |
P | 1 | 0 | 1 | 0 | 0 | 0 | 0 |
Q | 1 | 0 | 1 | 0 | 0 | 0 | 1 |
R | 1 | 0 | 1 | 0 | 0 | 1 | 0 |
S | 1 | 0 | 1 | 0 | 0 | 1 | 1 |
T | 1 | 0 | 1 | 0 | 1 | 0 | 0 |
U | 1 | 0 | 1 | 0 | 1 | 0 | 1 |
V | 1 | 0 | 1 | 0 | 1 | 1 | 0 |
W | 1 | 0 | 1 | 0 | 1 | 1 | 1 |
X | 1 | 0 | 1 | 1 | 0 | 0 | 0 |
Y | 1 | 0 | 1 | 1 | 0 | 0 | 1 |
Z | 1 | 0 | 1 | 1 | 0 | 1 | 0 |
ISO-8859 :
Le format ISO-8859 commence à être utilisé dans les années 80. Il s’agit d’une extension de l’ASCII sur $8$ bits au lieu de $7$ (il y a donc deux fois plus de caractères disponibles, soit $128$ nouveaux caractères).
Le format ISO-8859 existe en plusieurs versions, chacune d’entre elles possédant un ensemble différent de caractères supplémentaires par rapport à l’ASCII. Ces différentes versions ne sont qu’en partie compatibles les unes avec les autres.
Le plus utilisé (et le plus utile pour écrire en français) est sans doute le format Latin-1, ou ISO-8859-1, qui introduit les caractères les plus couramment utilisés dans les langues d’Europe de l’Ouest.
Unicode :
Unicode a été créé pour réunir dans un seul format l’ensemble des caractères utilisables dans toutes les langues du monde.
Le format d’Unicode le plus célèbre est UTF-8. Il utilise un nombre de bits par caractère qui dépend du caractère : les caractères courants, ceux de l’ASCII, sont codés sur 8 bits (1 octet), certains caractères plus rares sont codés sur 4 octets.
UTF-16 et UTF-32 sont deux autres formats célèbres. Ils sont bien plus lourds, mais contiennent bien plus de caractères.
Par exemple, dans UTF-32, tous les caractères sont codés sur 4 octets. Un texte ne comportant que des caractères ASCII sera donc quatre fois plus lourd en UTF-32 qu’en UTF-8, mais par contre, le format UTF-32 comporte vraiment beaucoup de caractères (les caractères occidentaux, cyrilliques, chinois, japonais… même les hiéroglyphes égyptiens).
Des usages différenciés
Des usages différenciés
- La norme ASCII est la plus utilisée pour la programmation informatique. En effet, les codes des programmes informatiques sont souvent pensés pour privilégier la fiabilité et l’efficacité au confort de lecture, et la norme ASCII est la plus ancienne. De plus, toutes les autres normes sont compatibles avec elle, et le code ASCII est celui qui prend le moins de place en mémoire.
- La norme ISO-8859 est la plus utilisée pour les documents textes (.pdf, .txt, .doc, .odt). Pour les documents textes, chaque document n’a besoin que de signaler dans les métadonnées le type de format ISO-8859 utilisé dans le document, ce qui permet au lecteur d’utiliser la table de caractères adéquate pour lire le texte. On s’attend à ce que quelqu’un qui veuille lire ou écrire un texte en hongrois ou en portugais dispose de logiciels qui lisent le format correspondant.
- La norme UTF-8 est la plus utilisée sur le World Wide Web (plus de $92\,\%$ des sites Web). Enfin, sur Internet, la possibilité d’être lu et compris par le plus grand nombre est essentielle, et le format UTF-8 permet de s’assurer que des personnes venant d’un peu partout autour du globe pourront communiquer avec le même code dans les commentaires d’une page web ou sur un réseau social.
Conclusion :
En devenant capable de traiter des problèmes complexes et proches d’enjeux réels, les calculateurs électromécaniques deviennent des enjeux technologiques et scientifiques importants.
Mais ces machines sont encore trop énormes, et demandent trop d’entretien, pour pouvoir être utilisées en-dehors de contextes très spécifiques.
À la fin de la Seconde Guerre mondiale, des avancées techniques vont permettre de passer du calculateur électromécanique à l’ordinateur électronique – c’est ce que nous verrons dans le prochain cours.