10 commentaires

photo d’une carte-mère
Cet article fait partie d’une série d’articles :

L’informatique, c’est un tas de puces électroniques, de circuits imprimés et de câbles qui permettent à chacun de nous de communiquer avec d’autres personnes, de réaliser des graphiques ou de l’imagerie 3D, de jouer et créer de la musique et une infinité d’autres choses. Il n’en reste que ce n’est qu’une machine purement électronique : un assemblage de composants.

S’il est assez intuitif de se remémorer ou de comprendre les lois physiques comme la loi d’Ohm ou les lois de Norton ou Thévenin sur les circuits électriques d’une part, et qu’on peut également arriver à créer ses propres programmes basiques (comme un « hello world ») dans un IDE tout fait d’autre part, ce qui est longtemps resté mystérieux pour moi, c’est le passage d’un monde électronique (un tas de composants électroniques) à un monde logiciel remplis de programmes (une suite de lignes de code). Le mystère tient en fait en une simple ligne : comment un circuit électrique est-il capable de calculer en binaire et de faire en temps réel ce qu’on lui demande ?

Si vous voulez partir de zéro en ce qui concerne le fonctionnement de votre PC, je vous conseille de lire les articles précédents dans cette série d’articles. Dans le cas contraire, je supposerai que le transistor est un composant que vous connaissez.

Introduction

Expliquer un PC contenant cent milliards de transistors, des fils partout et des centaines de millions de lignes de code est — vous l’aurez compris — beaucoup trop compliqué. On va plutôt commencer par étudier un système électronique et un programme simplistes.

Pour cela, quelques rappels.

Le transistor

Comme suggéré dans l’introduction, je vous propose de lire cet article qui explique son fonctionnement.
Pour le résumer, il s’agit d’un composant électronique à trois bornes où l’état électrique (allumée ou éteinte) de la borne de sortie « E » dépend de l’état électrique (allumées ou éteintes) des deux autres bornes d’entrée « C » et « B ».

Les deux entrées contrôlent donc la borne de sortie :

shéma et symbole du transistor
Schéma et symbole du transistor

L’ensemble se fait en appliquant des tensions électriques (généralement on parle de 5 V) aux différentes bornes d’entrée.

Le binaire

Le binaire est un mode de calcul qui au lieu d’utiliser dix chiffres comme on a l’habitude, n’en utilise que deux : $0$ et $1$.
Vous pouvez apprendre à compter en binaire si vous voulez, j’ai un joli cours pour ça, mais ce n’est pas ce qui nous intéresse ici.

Plutôt que de parler d’appliquer 5 V à une borne et 0 V à une autre borne, on dit qu’on met les bornes à $1$ et à $0$ respectivement. Mathématiquement, on pourrait dire qu’il s’agit d’un changement de variable. Utiliser une notation avec des 0 et des 1 est plus rapide, c’est pour ça qu’on utilise ce système dans l’électronique et donc dans l’informatique en général.

Un programme

Dans la vie de tous les jours, par exemple lors d’un festival ou un concert, vous pouvez obtenir un « programme » : il s’agit de la liste des représentations ou des activités qui seront données ce jour là. Chaque ligne du programme correspond à un événement, chaque événement suit le précédent.

Une recette de cuisine, c’est également un programme : chaque ligne correspond à une instruction à opérer, et l’ensemble des des instructions doivent être effectuées dans l’ordre si on veut obtenir le résultat attendu.

Un dernier exemple, les instructions données sur un distributeur automatique constituent également un programme : il faut insérer la carte, puis taper son code, puis reprendre sa carte, puis prendre les billets. Chaque instruction appelle une action de la part de l’utilisateur. Si l’utilisateur n’agit pas, alors le distributeur automatique reste bloqué sur l’étape en cours.

En informatique, c’est plus ou moins la même chose : un programme représente une suite de tâches à effectuer pour l’ordinateur : l’ordinateur accomplit les tâches les unes à la suite des autres, dans l’ordre où elles sont écrites.

Notre ordinateur simpliste

Connaissant le fonctionnement d’un transistor et sachant que l’on peut brancher les transistors les uns à la suite des autres (tout ceci est expliqué dans mon article sur le transistor) pour former des portes logiques (portes ET, portes OU…), on va utiliser le branchement électrique composé de plusieurs portes logiques suivant :

schéma d’un additionneur avec retenu
Les entrées sont A et B, les sorties sont S et Rs (on ignore Re, il n’est pas essentiel ici).

Notre programme simpliste

Je l’ai dit, un programme c’est une suite d’instructions. Notre suite d’instructions à appliquer sur notre ordinateur est ceci :

  1. Brancher la borne A à du 5 V ;
  2. Brancher la borne B à du 5 V.

Ou, en terme binaires :

  1. Mettre la borne A à 1 ;
  2. Mettre la borne B à 1.

Et c’est tout.

Lors de l’exécution de ces tâches (de ce programme) on va laisser faire le circuit électrique et regarder ce qui se passe sur les bornes S et Rs. Il ne s’agit ici que de physique : loi d’Ohm, effet transistor, circulation du courant, etc.

Exécution du programme

Maintenant que l’on dispose du matériel et du logiciel, on va pouvoir mettre tout ça en route.

Initialement, on n’a encore rien branché : les bornes A et B sont à 0 et 0. Les sorties, elles, sont ici à 0 et 0 aussi.
On peut tout mettre ça dans un tableau :

ABRsS
0000

Mettons la sortie A à 1. On obtient ceci :

ABRsS
1001

Mettons la sortie B à 1 (notons qu’il est dit nul part de remettre A à 0, donc on n’y touche pas et on laisse A à 1) :

ABRsS
1110

On peut regrouper les trois lignes successives dans un même tableau. Ce tableau représentant l’ensemble des états d’entrée possibles avec les sorties correspondantes, porte le nom de table de vérité :

ABRsS
0000
1001
1110

Ajoutons deux colonnes :

  • une qui juxtapose les valeurs de Rs et de S en « RsS », formant donc des nombres à deux chiffres en binaire ;
  • une où je convertis la valeur binaire de RsS en décimal.
ABRsSRsS(bin)RsS(déc)
0000000
1001011
1110102

Qu’est ce qu’on observe ? On observe que pour chaque ligne du tableau, quand on fait A+B on obtient RsS !

  • 0+0 = 0
  • 0+1 = 1
  • 1+1 = 2

Le montage utilisé ici, avec les portes logiques branchées telles qu’elles le sont là est un montage additionneur : il affiche en binaire sur les sorties Rs et S la somme des valeurs en entrée sur A et B.
Ce type de montage est un vrai montage qui est réellement utilisé en électronique.

Exécution du programme sur l’ordinateur un peu moins simpliste

Dans les PC, à la place d’un additionneur sur deux entrées, on utilise un montage similaire mais beaucoup plus gros, avec 5, 10, 1000 entrées et plein de sorties également.

Le montage, correctement branché permettra alors de faire l’addition (en binaire) des entrées. La suite de 1 ou 0 sur les sorties correspondra au nombre d’entrées qui seront à 1, en binaire.

Pour aller plus loin, maintenant, si on allume successivement les entrées l’une après l’autre, le montage va « afficher » sur les sorties les nombres en binaire correspondant à 1, 2, 3, 4… On aura alors réalisé un montage qui compte tout seul !
Or électriquement, on peut faire en sorte que nous n’ayons qu’à appuyer une seule fois sur un bouton et les entrées s’allumeront de façon séquentielle. Ajoutons une petite LED à chaque sortie et on aura un compteur en binaire avec des LED : les LED afficheront (en binaire) le nombre d’entrées actives.

Voilà notre premier ordinateur capable de réaliser de façon autonome une opération « compliquée »

Et un vrai ordinateur ?

Les vrais ordinateurs fonctionnent comment ? C’est simple : on appuie sur « On » et il nous ouvre le système d’exploitation, récupère nos e-mails, nous affiche le bureau, se met à jour, le tout sans que nous n’ayons encore touché à quoi que ce soit.
Le principe est exactement celui de notre ordinateur compteur : une fois qu’on l’a allumé, il effectue des actions dictées par un circuit électrique capable d’activer les entrées séquentiellement dans le temps.

En pratique, quand on appuie sur le bouton « On » de l’ordinateur, un petit programme très basique (le BIOS et/ou le POST, similaires dans l’idée à ce qu’on a vu au dessus) va mettre sous tension les différents composants et commencer à détecter les données qui sont inscrites dessus, sous forme binaire.

Ensuite, ce sont les données du disque dur qui sont envoyées au CPU, un assemblage de milliards de transistors et de portes logiques qui va utiliser ces données comme données d’entrée. La sortie est quant à elle branchée sur votre écran ou chaque pixel est ainsi allumé et colorée : c’est comme ça que des programmes présentes sur votre disque dur vont aller afficher votre bureau et vos icônes.

Vous avez sûrement déjà entendu parler de la fréquence du processeur (les « 2,3 GHz » du processeur, ou le « 1 333 MHz » de la mémoire). Il s’agit ici de la fréquence d’horloge du processeur. Les opérations sont effectuées les unes à la suite des autres, séquentiellement, et « 2,3 GHz » signifie que le processeur est capable d’effectuer jusqu’à 2,3 milliards de cycles de calculs par seconde.

Et les programmes ?

Pour qu’un ordinateur puisse afficher votre bureau, il suffit que le système d’exploitation (Windows, Linux, ou OS-X…) soit installé sur votre disque dur. Si c’est fait correctement, alors le système d’exploitation s’ouvrira tout seul après l’allumage de l’ordinateur.

Ceci dit, un système d’exploitation (SE) seul ne permet pas de faire grand chose : il ne permet ni de surfer (c’est Firefox ou Chrome qui font ça) ni de taper une lettre (comme Word ou Writer). Ceci est le rôle des programmes. Ces programmes sont accessibles quand on clique sur leur icônes.

Les icônes sont un moyen facile de lancer des programmes, mais là-aussi tout se fait de façon binaire au niveau de transistors : en bougeant la souris sur une partie de l’écran, la position de la souris est calculée par une sous-partie du SE appelé le « pilote ». Les coordonnées sont mises en relation avec les données servant à afficher l’image du bureau et les coordonnées correspondant à l’image d’une icône sont retenues : à ce moment là, une liste d’instructions correspondant à l’icône sont envoyées au processeur et l’ordinateur exécute le programme sur lequel on vient de cliquer.
En fait, quoi qu’on fasse, que ce soit déplacer la souris, presser une touche du clavier ou cliquer sur la souris, l’ordinateur effectue des calculs binaires et réagit en conséquence (appuyer sur la touche « A » provoque la modification des pixels de l’écran qui vont aller vous afficher la forme d’une lettre « A »).

Bien-sûr, chaque programme étant différent, un clic n’aura pas le même effet partout : dans le navigateur, il peut signifier « changer de page web », alors que dans un jeu vidéo c’est plutôt « donner un coup d’épée ».

Et programmer ?

Programmer, c’est imaginer, inventer, écrire puis donner une suite d’instructions à l’ordinateur.
C’est faire un programme informatique : quand on sait comment fonctionne l’ordinateur et qu’on a commencé à apprendre son langage (un langage de programmation), on peut lui faire faire ce qu’on veut. Ainsi, quand on cliquera sur l’icône de son propre programme, ce seront vos instructions à vous qui seront exécutées par l’ordinateur.

Choisir convenablement les bonnes instructions et le bon ordre dans lequel exécuter ces instructions, ainsi que savoir comment écrire ces instructions dans une autre langue (celle de l’ordinateur), ça correspond au travail du programmeur. Non seulement écrire des programmes demande des connaissances dans le langage informatique donnée, mais il faut également savoir comment interpréter les actions de l’utilisateur (clic de la souris, touche du clavier…). Mieux encore, il s’agit aussi de créer une interface graphique pour le programme : créer des menus, dessiner des icônes, gérer les transitions et les animations.

Pour les suites logiciels plus imposants, il s’agit parfois de découper le programme en plusieurs sous-programmes qui vont chacun être responsables d’une tâche. Généralement il y a alors différentes personnes travaillant sur les différentes parties du programme. Il convient alors au chef de projet de faire en sorte que tout le monde utilise bien les mêmes spécifications, dans le but de pouvoir à la fin « assembler » chaque partie du programme.
Le plus souvent même, les différents programmes sont écrits et créés par des entreprises ou des groupes de personnes différentes : le logiciel The GIMP est édité par la fondation Gnome, mais peut fonctionner sur Windows (édité par Microsoft), le tout avec du matériel créé par Intel.

Toutes ces choses spécialisées : architecture d’un programme, codage, design, 3D, interaction avec l’utilisateur… font partie des métiers de l’informatique, et généralement chaque personne est spécialisée dans un domaine précis (avec tout de même des capacités ou des connaissances dans les autres domaines).

image d’en-tête de Frankieleon

10 commentaires

gravatar
Lokoyote wrote:

Un très bon billet qui permet de mettre à plat la théorie et la pratique.
Personnellement j'ai toujours l'impression de manquer une échelle entre comment la pièce fonctionne et le PC actuel, il y a tellement un gap techno que j'ai du mal à imaginer comment sont produits les processeurs pour être aussi petits et aussi complexe tout en gardant les mêmes propriétés physique des anciens transistors !

gravatar
Le Hollandais Volant wrote:

@Lokoyote : Les procs ne sont qu’un assemblage de 10^9 transistors, rien de plus.
Et ce qui s’affiche à l’écran, n’est qu’une matrice de pixels dont la luminosité varie en fonction des boutons qu’on presse sur le clavier. Dit comme ça, tel que c’est, ça permet de lever une grande partie de cette magie.

Pour imaginer ce que font 10^9 transistors, il faut voir que les puces intégrées ne sont pas venues du jour au lendemain : au début on avait de vrais transistors physiques (lampes à vide), puis des transistors en silicium. Les premiers circuits intégrés n’avaient que quelques milliers de transistors. Ensuite, on n’a pas cessé d’en rajouté.
Un peu comme la nature avec la vie : d’une cellule, puis quelques cellules, puis peu à peu des organes, et enfin des êtres vivants complexes, après 10^9 années… Ou encore comme sont fait les logiciels : Windows, Linux ne faisaient que quelques kilooctets au départ, avec quelques dizaines de milliers de lignes de code. La complexité (et la modularité) est venue avec le temps. Les CPU aujourd’hui sont d’ailleurs très modulaires : différentes zones de la puce font différents calculs (FPU, North-bridge, South-bridge, CAN/CNA, etc.)…

La gravure du silicium en elle-même est rendue possible grâce aux lasers et à des lentilles, qui focalisent la lumière sur des zones de plus en plus petites. En soit, la gravure des puces de silicium n’est pas différente de la lithographie (d’ailleurs, le procédé utilisé par les graveurs se nomme la photolithographie) ou de la photographie argentique. Tout comme, je ne sais pas si tu as fait ça au collège ou au lycée, sont gravées les circuits imprimés, à l’aide des UV et de produits comme le perchlorure de fer.

gravatar
Juju wrote:

Le fossé s'élargie de jour en jour entre la technologie et ce que le commun des gens est capable de comprendre; nous sommes des utilisateurs avant toutes choses (malheureusement)
Merci pour ces contributions à la compréhension du monde.

Pourquoi et comment est-on passé du binaire à l'hexadécimal ?

gravatar
Le Hollandais Volant wrote:

@Juju : Oui, c’est vrai. Et il en va de même avec tout.
Une voiture aussi : si tu regardes sous le capot d’une 2 CV, tu vois le moteur et n’importe qui peut à peu près identifier les éléments (il y en a peu). Une voiture moderne, c’est à peine si 5 garagistes (des experts, quand-même) différents ne font pas des diagnostiques différents pour une même panne…

Pourquoi et comment est-on passé du binaire à l'hexadécimal ?

On n’est pas passé sur binaire à l’hexa : les ordinateurs fonctionnent toujours en binaire.

L’hexa est juste là pour faciliter l’écriture du binaire pour nous autres humains.

Par exemple, le nombre « 2017 » s’écrit en binaire « 11111100001 ». Comme la base (2) est un nombre très petit, même un nombre aussi petit que 2017 donne un nombre en binaire de onze chiffres… Ça devient rapidement très très long. L’hexa permet de condenser tout ça, et relativement simplement, car 4 digits en binaire se contiennent dans 1 digit en hexa.
Ainsi, le 2017 qui était 11111100001 peut s’écrire ainsi, en faisant des paquets de quatre digits : 111-1110-0001 ensuite, chaque paquet de quatre devient un digit en hexa. En hexa, ce nombre devient : 7-E-1.

Cela vient du fait que 2⁴ = 16¹ (quatre digit en base deux = un digit en base seize).

Si tu veux un cours complet pour apprendre à compter et à convertir (à la main et de tête) en binaire et héxa (et même n’importe quelle base) j’ai ça ici : https://lehollandaisvolant.net/tuto/bin/

gravatar
Vincent wrote:

Même si j'ai de bonnes compétences de base en programmation, je dois avouer que l'interface entre hardware et programmation m'échappe encore... merci pour cet article qui m'aide un peu dans ce sens mais ça reste très dur à capter.

gravatar
Le Hollandais Volant wrote:

@Vincent : programmer dans un langage de haut niveau (n’importe quel langage), revient à écrire des instructions. Le compilateur transforme ensuite ces instructions en binaire. Et ce binaire là, ben il correspond à l’ordre dans lequel différents transistors doivent s’allumer ou s’éteindre.

Coder revient à écrire une séquence d’allumage/extinction pour une série de transistors. Exécuter le programme, ça revient à tester ladite séquence et voir ce qu’il en résulte en sortie : les transistors étant reliés les uns aux autres dans un modèle « en cascade », on observe l’état des transistors tout au bout de la chaîne. Ces transistors sont reliés aux pixels de l’écran (par exemple) et un programme qu’on exécute va donc modifier des pixels sur l’écran, autrement dit afficher un truc.

gravatar
Matthieu wrote:

Bien jouer "Le Hollandais Volant", ils sont vraiment bien rédigés et compréhensibles tes billets!
Je suis personnellement assez friand de ce genre de contenue et hormis wiki (qui trop souvent difficile à décrypter pour un néophyte quand on arrive sur des contenues s’éloignant trop des bases d'un bac S), peu de site propose ce genre de contenu, ça devient rare de trouver des contenues de vulgarisation scientifique étoffée qui ne sont pas que des copiés-collés incompréhensibles et/ou obsolètes .

Juste une petite remarque rapport à ton dernier commentaire ;
"programmer dans un langage de haut niveau (n’importe quel langage), revient à écrire des instructions. Le compilateur transforme ensuite ces instructions en binaire."
Ce n'est pas le compilateur qui transpose les instructions en binaire mais l'assembleur, les compilateurs sont bien au-dessus du binaire tant pour un langage de haut niveau tel python , java, ruby, etc. que de bas niveau C, C++, Obj-C, etc.

Un exemple simple est le code source de ta page, je ne sais pas si tu réalises toi-même tes scripts mais si c'est le cas tu dois probablement coder sensiblement de la même manière que moi, ton scripte édité en Php et compilé sur ton serveur (apache ou autres) via le compilateur Php qui renvoie une "page" au format HTML5-XHTML compréhensible par nos navigateurs, navigateurs qui eux-mêmes interprètent (comme un compilateur) les scripts JS, les balises HTML, style CSS, etc. afin d'obtenir le contenu desirer mais aucun de ces langages n'utilisent le binaire (hormis quelque paramètre de fonction a la marge). Personnellement je travaille sur la conception de code web et serais incapable de coder quoi que ce soit en binaire...

En tout des cas merci pour tes billets, vu leur nombre j'ai trouvé une occupation pour cet été^^,

gravatar
Le Hollandais Volant wrote:

@Matthieu : Bonjour, déjà merci :)
Oui tu as raison, l’assembleur passe entre le langage de haut niveau et le binaire. Dans ce cas, j’ajouterai que certains langages ont même des préprocesseurs : LESS ou SASS, par exemple, pour le langage CSS. Le code écrit par le codeur est transformé en CSS qui est ensuite utilisé par le navigateur. Un peu pareil pour le jQuery, qui n’est qu’une façon d’écrire du JS.

Ton exemple PHP/JS/HTML est parlant, c’est aussi pour ça que ce sont (PHP et JS) des langages de scripts : ils sont interprétés et exécutes à la volée, sans être compilés dans un fichier binaire.

En tout des cas merci pour tes billets, vu leur nombre j'ai trouvé une occupation pour cet été^^,

Il y en a 195 :p
Tu peux t’aider de la liste ici : https://couleur-science.eu/?liste

gravatar
Ade wrote:

Supers articles!! Je n’y connais absolument rien en informatique mais j’etais très curieuse de comprendre comment du hardware, donc un assemblage de matériaux « inerte » pouvait donner un outil qui « réfléchit » et nous permet de faire tant de choses. Tout est très bien expliqué et accessible et je pense que j’ai tout compris! Une seule chose m’échappe encore néanmoins. Je ne comprends pas qu’est ce qui donne l’ordre au transistor de s’allumer ou s’eteindre? Comment ils comprennent qu’ils doivent s’allumer ou s’éteindre étant donné que c’est grâce à eux qu’on est capable d’ecrire un programme leur demandant de s’allumer ou s’eteindre? Ma question est un peu confuse mais dans ma tête ça sonne un peu comme qui de l’œuf ou la poule est arrivé en premier, il faut des transistors pour tout faire fonctionner mais c’est en codant qu’on commande aux transistors de fonctionner?!
En tout cas merci beaucoup pour ce contenu!!

gravatar
Le Hollandais Volant wrote:

@Ade : ce sont les actions de l'utilisateur qui initient la plupart des actions. Quand on appuie sur une touche, ça envoie une impulsion électrique sur un ou plusieurs transistors, ensuite, dans le cycle de calcul, cette modification sur un transistor est prise en compte dans la suite des calculs.

D'autres interruptions (réseau, l'heure, température, ou des résultats d'opération précédentes...) peuvent également activer/désactiver des transistors et donc modifier le cours des calculs.

L'ensemble des calculs commence quand on allume l'ordinateur.

(autrement, merci pour ton retour :))


Votre commentaire sera visible après validation par le webmaster.