Le langage binaire est le langage parlé par les ordinateurs, les calculatrices et plus généralement par toutes les machines électroniques. Alors que les humains utilisent de multiples symboles pour former des mots puis des phrases et ainsi transmettre entre eux de l’information, les machines n’utilisent que deux symboles : le 0 et le 1.
I – Les nombres en base 2
Pour commencer, rappelons comment on encode un nombre en base 2 (c’est-à-dire au moyen de deux symboles, le 0 et le 1). Dans la vie de tous les jours, tu manipules des nombres en base 10, c’est-à-dire qu’un nombre « se voit » sous la forme de puissance de 10. Par exemple, 145, c’est 1 centaine, 4 dizaines et 5 unités soit :
\( \begin{array}{rl}145 &= 100+40+5\\ &= 1\times 10^2 + 4\times 10^1 + 5\times 10^0\end{array} \)
En base 2, il faut « voir » les nombres sous la forme de puissance de 2 :
\( \begin{array}{|c|c|c|c|c|c|c|c|}\hline 2^7 & 2^6 & 2^5 & 2^4 & 2^3 & 2^2 & 2^1 & 2^0\\\hline 128&64&32&16&8&4&2&1\\\hline\end{array} \)
Ce qui donne pour notre exemple :
\( \begin{array}{rl}145 &= 128+16+1\\ &= 1\times 2^7 + 1\times 2^4 + 1\times 2^0\\ &= 1\times 2^7 + 0\times 2^6+0\times 2^5+1\times 2^4 + 0\times 2^3+0\times 2^2+0\times 2^1+1\times 2^0\end{array} \)
Le nombre 145 se code donc en binaire par la séquence de 8 symboles suivantes : \( 10010001 \) .
Le nombre entier le plus grand que l’on peut coder avec une séquence de 8 symboles est 255 codé par \( 11111111 \) car :
\( \begin{array}{rl}255 &= 128+64+32+16+8+4+2+1\\ &= 1\times 2^7 + 1\times 2^6+1\times 2^5+1\times 2^4 + 1\times 2^3+1\times 2^2+1\times 2^1+1\times 2^0\end{array} \)
Ce regroupement par paquet de 8 symboles est très important en informatique car il entretient un lien très étroit avec la façon dont est stockée l’information sur la machine. On parle de paquets de 8 bits et on dit que ces 8 bits forment un octet. Ainsi un octet peut encoder un nombre entier compris entre 0 et 255.
Cet encodage en base 2 est en outre très bien adapté pour les systèmes électroniques car il est simple à mettre en oeuvre au niveau matériel. En effet, les systèmes électroniques fonctionnent avec du courant basse tension et au sein des puces électroniques, un courant qui passe se traduit par un 1 alors qu’un courant qui ne passe pas se traduit par un 0.
II – Le langage binaire par l’exemple
Garde bien à l’esprit un point important : il existe autant de langages machine que de processeurs sur le marché. Ainsi le langage de ta calculatrice Ti sera différent du langage d’une Casio qui sera lui même différent du langage utilisé par ton ordinateur, tout ça parce qu’il ne partage pas le même type de processeur.
Pour notre exemple et dans un souci de vulgarisation, nous allons donc imaginer un langage machine volontairement hyper simplifié qui fonctionne sur un processeur totalement fictif.
Supposons que tu tapes sur notre machine l’instruction suivante qui permet d’ajouter 2 à 1 et de stocker le résultat dans X :
\( 2+1\rightarrow X \)
Traduit en un langage plus proche de la machine, on parle de langage de bas niveau ou d’assembleur, cela donne :
\( \text{ADD 2 1 X } \)
Et voici le mot machine associé :
\( 10000011000000100000000101011000 \)
Lorsque notre processeur lit ce mot, il commence par le découper en paquet :
\( 10000011\text{ – }00000010\text{ – }00000001\text{ – }01011000 \)
Pour notre processeur maison, un paquet, c’est une séquence de 8 bits c’est-à-dire 1 octet. Comme il y a 4 paquets de 8 bits chacun, on dit que notre processeur est un processeur 32 bits :
- le premier paquet indique au processeur l’opération qu’il doit effectuer sur les paquets qui suivent, on parle de code opération ou d’opcode (ici, opcode = ADD)
- les deux paquets suivants sont les nombres sur lesquels le processeur doit effectuer l’addition
- le dernier paquet est la variable dans laquelle le processeur doit stocker le résultat
La valeur utilisée dans cet exemple pour le code opération est totalement arbitraire, par exemple on a défini que l’instruction ADD est codé par \( 10000011 \) . En réalité, chaque type de processeur possède ses propres codes pour chaque instruction, on dit qu’il possède son propre jeu d’instructions.
Il faut également savoir que le découpage en paquet est la plupart du temps très différent de celui qu’on vient de voir. Les différents paquets ne sont pas forcément codés sur 8 bits et ceux-ci peuvent ne pas représenter directement la valeur des nombres mais plutôt les adresses en mémoire où sont stockés ces nombres.
Au final, tous les programmes informatiques finissent inévitablement en une longue succession de 0 et de 1 que seule la machine parvient à décoder et à comprendre.
III – Conclusion
On retiendra qu’un programme informatique, c’est une succession de 0 et de 1 que le processeur va lire par paquet. Certains de ces paquets lui indique la nature des opérations qu’il doit effectuer sur des données stockées en mémoire afin de produire un résultat qui sera lui-même stocké en mémoire. Le nombre d’opérations qu’un processeur est capable d’effectuer par seconde (on parle de flops) n’a cessé d’augmenter au fil des années passant de quelques opérations par seconde dans les années 40 à plusieurs milliards d’opérations par seconde aujourd’hui.
Au début de l’ère informatique, les programmeurs codaient directement en langage binaire mais tu te doutes bien que ce travail était long, fastidieux et source d’erreurs, et qu’il fallait une parfaite connaissance du processeur sur lequel le programme s’exécutait afin d’utiliser le jeu d’instructions approprié.
Les brillants programmeurs de l’époque ont donc rapidement eu l’idée d’inventer un langage intermédiaire appelé l’assembleur qui, tout en ayant une syntaxe assez proche de la machine, reste compréhensible par l’être humain. Par la suite, ils inventèrent des langages dit de haut niveau (dont le Python fait partie) qui laissent encore une plus grande liberté au programmeur dans son processus de création puisqu’il n’a plus à se soucier du processeur sur lequel va s’exécuter son programme. Pour traduire un langage de haut niveau vers le langage binaire, il faut un programme spécifique : c’est le rôle du compilateur.
IV – Pour aller plus loin
Wikipédia est un bon point d’entrée si le sujet t’intéresse :
- architecture générale d’un processeur, d’un microprocesseur et d’un microcontrôleur
- langage machine et assembleur
- langages de bas niveau et de haut niveau
- différences entre langage compilé et langage interprété
C’est un domaine très vaste et extrêmement technique qui, pour être appréhender correctement, demande des connaissances approfondies dans des domaines variés, aussi bien matériels que logiciels et peut-être que tes futurs études te permettront de creuser davantage le sujet.