Previous Up Next

Chapitre 3  Les ordinateurs

Le mot "ordinateur" a été créé en 1955 à la demande d'IBM, et tire son étymologie du terme moyenâgeux "ordonnateur", désignant l'autorité divine suprême... Plus prosaïquement, un ordinateur se définit comme une instance matérielle, concrète, d'une Machine de Turing Universelle (cf. 3.6). Il est donc capable, dans la limite de ses capacités en espace mémoire (nécessairement finies) et en vitesse de calcul, d'exécuter n'importe quel algorithme qu'on lui fournit sous forme de programme, sur n'importe quelle donnée discrète, qu'on lui fournit également. Il se distingue ainsi fondamentalement d'une simple machine à calculer par sa capacité à enchaîner plusieurs opérations en suivant des instructions paramétrables, permettant la réalisation d'opérations complexes non initialement "câblées". Toute la difficulté de conception d'un ordinateur vient donc de cette nécessité de lui faire exécuter des suites d'opérations, en synchronisant l'action de ses différents composants.

Nous allons passer en revue ici la nature de ces composants et leur organisation interne, en reprenant cette fois la distinction classique entre leur aspect matériel, "hardware" (qui se traduit littéralement par : "quincaillerie") et leur aspect logiciel, "software" (néologisme créé par opposition à "hardware"). L'intégration récente et de plus en plus systématique des ordinateurs dans des réseaux ajoute une couche de complexité supplémentaire à cette organisation, que l'on tâchera également d'introduire.

1  Le matériel

Nous nous en tiendrons ici la plupart du temps aux ordinateurs les plus répandus, à savoir les micro-ordinateurs proposés aux particuliers, de type "PC" (pour Personnal Computers) ou "Mac" (pour MacIntosh, leur constructeur).

1.1  Les composants externes

Depuis les années 90, les ordinateurs vivent dans un environnement complexe, illustré par la figure 3.1



Figure 3.1: environnement matériel des ordinateurs


Il convient d'abord de distinguer l'ordinateur lui-même de ses "périphériques", qui ne sont que des constituants annexes. Le coeur d'un ordinateur est constitué : Les autres composants sont donc : La logique de cette organisation est donc celle de la figure 3.2



Figure 3.2: organisation générale d'un ordinateur


Les premiers ordinateurs, jusque dans les années 70-80, étaient réduits à une Unité Centrale et des mémoires. Les programmes et les données étaient alors exclusivement fournis sous forme de cartes perforées et les résultats d'un calcul se lisaient aussi sur des cartes perforées...

1.2  L'architecture de Von Neumann

Entrons maintenant dans l'organisation interne (on parle aussi "d'architecture matérielle") du coeur de notre ordinateur.

Si Turing peut être considéré comme le père de l'informatique théorique, l'homme à l'origine de la conception des ordinateurs actuels est John Von Neumann. Von Neumann, né en Hongrie, était un très grand mathématicien, ayant laissé sa trace dans de nombreux domaines, y compris en physique (quantique) et en économie (théorie des jeux). D'origine juive, il a émigré aux Etats Unis dans les années 1930. En 1935, il a accueilli dans son Université de Princeton, pour un stage universitaire, un certain Alan Turing. Les deux hommes se connaissaient donc mais n'ont jamais pour autant travaillé ensemble à la réalisation d'un ordinateur. Pendant la guerre, Von Neumann, a participé au projet "Manhattan", qui a donné lieu à la bombe atomique américaine, en se consacrant particulièrement aux calculs balistiques. Sensibilisé par cette expérience à l'intérêt des calculateurs automatiques, il a ensuite travaillé avec des ingénieurs à la conception d'un tel calculateur. En 1945, il a écrit à leur intention un rapport où il détaillait les principes qui devaient selon lui présider à la réalisation d'une machine universelle (un ordinateur, donc). Ces principes sont depuis connus sous le nom "d'architecture de Von Neumann", et sont ceux encore utilisés de nos jours pour la conception des ordinateurs actuels.

Le schéma général (très simplifié) de l'architecture de Von Neumann est celui de la figure 3.3.



Figure 3.3: architecture de Von Neumann


Les deux innovations majeures introduites par Von Neumann par rapports aux calculateurs existant à son époque sont, ainsi, l'intégration : Pour bien comprendre comment fonctionne un ordinateur, il nous faut détailler chacun des composants de cette architecture.

1.3  La mémoire centrale (RAM)

La mémoire vive d'un ordinateur est composée d'un ensemble de "mots mémoire", qui sont des suites de bits de taille fixe. Mais, de même que dans un tableur comme Excel, chaque case d'une feuille de calcul est identifiée par une référence (comme A2, D7...), chaque mot mémoire est identifié par son "adresse". Celle-ci est indispensable pour référencer chaque mot mémoire et ainsi retrouver ce qui a été préalablement stocké dans l'un d'eux. L'adresse est simplement un code, donc une autre suite de bits. Le nombre de bits réservé au codage de l'adresse doit évidemment être suffisant pour permettre d'associer une adresse différente à chaque mot mémoire. La figure 3.4 montre un exemple de mémoire RAM (ultra simple) constituée de 16 mots mémoire de 2 octets chacun (le contenu de la mémoire n'est pas représenté). Chaque mot mémoire a donc une adresse comprise entre 0 et 15.



Figure 3.4: structure d'une RAM élémentaire


Une particularité fondamentale de la mémoire centrale, dans l'architecture de Von Neumann, c'est qu'elle sert à stocker indifféremment aussi bien des bits codant des données que des bits codant des traitements, des instructions (on verra par la suite comment coder une instruction dans un mot mémoire). Il n'y a pas de distinction entre les deux, pas de séparation. On retrouve là ce qui caractérisait également les Machines de Turing Universelles, sur le ruban desquelles pouvait figurer aussi bien des données que le code d'une autre machine de Turing (cf. 3.6). Cette capacité à coder avec des 0/1 aussi bien des données que des traitements, c'est le fondement de l'informatique.

1.4  L'unité de commande

Cette unité fondamentale joue un peu le rôle de la tête de lecture des machines de Turing. Elle est elle-même composée de deux "registres". Un registre est simplement une petite unité de mémoire vive (un ensemble de bits, donc, encore !), d'accès rapide. Les deux registres de l'unité de commande sont : On peut représenter l'unité de commande de notre machine rudimentaire comme dans la figure 3.5.



Figure 3.5: structure de l'unité de commande


Détaillons maintenant de quoi est composée une instruction élémentaire, telle qu'elle peut être stockée dans un mot mémoire ou dans le registre d'instruction. Une telle instruction est en fait constituée de 4 parties. Dans notre exemple, chaque partie tiendra donc sur ½ octet soit 4 bits.

Nous détaillerons simplement le codage des instructions élémentaires de type arithmétique (addition, soustraction, multiplication, division). Les 4 parties du code de l'instruction ont alors la signification suivante :



Ainsi, par exemple, "0011 1001 0011 0001" est l'instruction d'effectuer une division (code 0011) entre le nombre stocké dans le mot mémoire d'adresse 9 (code 1001) et celui stocké à l'adresse 3 (code 0011) et de stocker le résultat dans le mot mémoire d'adresse 1 (code 0001).

Rappelons-nous en effet qu'un algorithme est une suite d'instructions permettant de résoudre une classe de problèmes. Ainsi, l'algorithme donné en 3.1 nécessite toujours de faire des divisions, mais les nombres à diviser dépendent du nombre de départ n (que l'on fournit comme donnée d'entrée). Programmer un algorithme, c'est donc bien programmer des instructions génériques, dont la valeur complète dépendra des instances précises du problème que l'on voudra résoudre (et donc, comme dans notre instruction élémentaire, des données stockées aux adresses citées).

1.5  L'horloge

L'horloge de l'Unité Centrale est un métronome électronique qui lance des "tops" à intervalles de temps réguliers. Ces "tops d'horloge" donnent la cadence à laquelle travaille l'ordinateur et permettent à l'ensemble des composants de l'Unité Centrale de se synchroniser.

Plus les tops sont rapprochés, plus l'ordinateur est rapide. La fréquence de l'horloge se compte en nombre de tops par secondes, dont l'unité de mesure est le Hertz, ou plutôt le Mega-Hertz MH (1MH = 106 Hertz). Voici l'ordre de grandeur de la vitesse des ordinateurs ces dernières années :

1.6  L'unité de traitement

L'unité de traitement est le composant qui exécute les calculs. Il est lui-même composé : L'unité de traitement se représente habituellement comme dans la figure 3.6 (on rappelle dans l'UAL le code des opérations élémentaires qui y sont câblées) :



Figure 3.6: structure de l'unité de traitement


L'UAL est ainsi la "machine à calculer" de l'ordinateur. Elle est simplement constituée de circuits électroniques câblés une fois pour toute pour transformer des 1 en 0 ou des 0 en 1 (c'est-à-dire en fait pour actionner des interrupteurs faisant passer ou non du courant) de façon à ce que les bits du registre résultat correspondent bien au codage du résultat du calcul qui lui est demandé. Elle ne sait faire que des opérations élémentaires (dans notre exemple : simplement les 4 opérations arithmétiques de base).

1.7  Les bus

Les flèches reliant les composants entre eux sont en fait des ensembles de fils permettant de transporter plusieurs bits en parallèle. On les appelle pour cela des bus.

Dans le schéma de la figure 3.3, figurent ainsi 3 bus dont les noms désignent le type de données qu'ils transportent. Le bus "ordres" sert à transmettre les demandes d'exécution d'opérations de l'unité de commande vers l'unité de traitement. Le bus "instructions" fait transiter les instructions élémentaires des mots mémoire vers le registre d'instruction de l'unité de commande, et le bus "données/résultats" fait circuler (dans les deux sens) le contenu des mots mémoires entre la mémoire et les différents registres de l'unité de traitement.

Ces différents bus peuvent contenir un nombre de fils différent. Le nombre de fils du bus de données/résultats détermine la capacité du microprocesseur. Un "microprocesseur 32 bits" (ordre de grandeur des puces actuelles) contient donc un bus données/résultats composé de 32 fils.

1.8  Le cycle d'exécution d'une instruction

Supposons maintenant que la mémoire centrale de notre ordinateur contienne un programme et des données, et que l'on souhaite exécuter ce programme sur ces données. Lancer cette exécution revient à mettre dans le compteur ordinal (CO) l'adresse où se trouve stockée la première instruction du programme. A partir de là, le programme est exécuté étape par étape, instruction par instruction. L'exécution d'une instruction élémentaire, codée suivant la convention expliquée en 1.4 se fait suivant un cycle comprenant 3 phases : Ces cycles sont rythmés par les tops d'horloge, chaque phase correspondant à un nombre fixe de "tops" successifs. Dans notre exemple, pour la phase 1, qui nécessite de faire transiter l'instruction courante de la mémoire vers le RI en utilisant le bus d'instruction, 4 tops d'horloge seront nécessaires (car un mot mémoire fait 16 bits et le bus n'a une capacité que de 4 bits).

Illustrons ce fonctionnement à l'aide d'un exemple complet sur notre ordinateur miniature (seuls les bits "utiles" de la mémoire et des registres sont donnés). La figure 3.7 montre la situation de départ, les trois suivantes montrent l'état de l'ordinateur après l'exécution de chaque phase d'un cycle.



Figure 3.7: situation de départ


Pour aider à la compréhension, on fait à chaque étape figurer en gras les composants actifs à cette étape.
La figure 3.8 montre l'état de l'ordinateur à l'issue de la première phase du premier cycle. L'instruction courante a transité à travers le bus "instructions" et se retrouve désormais dans le registre d'instruction. Notons que, si le bus "instructions" est composé de 4 fils, comme sur notre schéma, alors qu'une instruction dans un mot mémoire est stockée sur 2 octets, alors ce transfert a dû se faire, au mieux, en 4 passages successifs (correspondant chacun à un top d'horloge).



Figure 3.8: premier cycle, phase 1


La figure 3.9 montre l'état de l'ordinateur à l'issue de la deuxième phase du premier cycle. Le bus "ordres" a fait tout d'abord transiter les 4 premiers bits de l'instruction courante à l'UAL, qui a reconnu que c'était le code d'une addition (l'opération active dans l'UAL est donc l'addition). Les deux suites de 4 bits suivantes correspondent aux adresses en mémoire où l'UAL doit aller chercher les données sur lesquelles effectuer cette opération. Ces données viennent remplir les registres "donnée 1" et "donnée 2" de l'UAL en passant pas le bus "données/résultats".



Figure 3.9: premier cycle, phase 2


La figure 3.10 montre l'état de l'ordinateur à l'issue de la troisième et dernière phase du premier cycle. L'UAL a réalisé l'opération qui lui était demandée et a rempli avec le résultat son registre "résultat". La dernière partie de l'instruction courante indique l'adresse du mot mémoire où ce résultat doit être stocké. C'est ce qui est fait en utilisant de nouveau le bus "données/résultats". Par ailleurs, pour préparer le cycle suivant, le compteur ordinal est augmenté de 1.



Figure 3.10: premier cycle, phase 3


A l'issue de ce cycle, la première instruction élémentaire a été entièrement exécutée et la machine est prête à démarrer un nouveau cycle pour exécuter la deuxième (et dernière) instruction du programme.

La figure 3.11 montre la situation de l'ordinateur à la fin de l'exécution de ce deuxième cycle (sans détailler les 3 phases, cette fois). Un nouveau cycle peut commencer, mais nous supposons qu'il n'y a plus d'information pertinente à l'adresse référencée par le CO (ou il y en a une signifiant "FIN") : l'exécution du programme est donc terminée.



Figure 3.11: situation à l'issue du deuxième cycle


Mais quel programme, finalement, notre ordinateur a-t-il effectué, sur quelles données, et pour trouver quel résultat ? Reprenons le fil de cet exemple. Le programme, l'algorithme réalisait donc l'opération composée suivante :

nombre 1 + nombre 2 = nombre 3
nombre 3 * nombre 4 = résultat

ou encore : résultat = ( nombre 1 + nombre 2 ) * nombre 4

Les nombres 1, 2 et 4 sont les données sur lesquelles le programme a été exécuté. Nombre 3 est un résultat intermédiaire et le résultat final est noté "résultat". En fait, l'algorithme composé des 2 instructions exécutées par l'ordinateur réalise la fonction suivante :

f : N3—→N
  (x,y,z) ⊢→ (x+y)*z

La valeur réelle des nombres sur lesquels le calcul a été effectué dépend de ce qui est stocké dans la mémoire aux adresses utilisées par le programme. Dans notre exemple, elles valaient respectivement (en décimal) : x=5, y=14 et z=2. La valeur du résultat final de notre exécution est donc : (5 + 14) * 2 = 38.

Sur la figure 3.7, les deux mots mémoire présents aux adresses 0001 et 0010 respectivement contenaient des instructions, tandis que les mots mémoire dont les adresses étaient 1011, 1100 et 1101 contenaient des données. L'exemple a aussi montré comment l'enchaînement de plusieurs opérations élémentaires pouvait permettre de réaliser une opération plus complexe.

1.9  L'architecture de Von Neumann et les autres

On peut montrer qu'une machine construite suivant l'architecture de Von Neumann a bien la capacité de calcul d'une Machine de Turing Universelle : c'est donc bien un ordinateur. La version qui en a été présentée ici est néanmoins extrêmement simplifiée. En plus des composants cités, elle inclut classiquement un certain nombre de registres, permettant de stocker des résultats intermédiaires, et bien d'autres dispositifs. De même des codes d'instructions spéciaux permettent par exemple de "sauter" de l'instruction courante à une autre instruction non contiguë dans la mémoire (c'est-à-dire stockée ailleurs que dans le mot mémoire suivant immédiatement celui contenant l'instruction courante), ou d'exprimer un "test".

Ce schéma d'organisation interne est celui qui préside depuis 1945 à la réalisation de la grande majorité des ordinateurs. Parmi ceux-ci, les plus efficaces dans les années 90 étaient ceux construits suivant l'architecture RISC (pour “ Reduce Intruction-Set Computer”), dont la particularité est de n'intégrer qu'un nombre réduit d'instructions élémentaires pré-cablées (comme les opérations arithmétiques dans notre exemple) et un grand nombre de registres. La caractéristique fondamentale de l'architecture de Von Neumann, dont la version RISC n'est qu'une variante, est qu'elle exécute les instructions d'un programme les unes après les autres, dans un ordre fixé à l'avance par l'écriture du programme. On parle pour cela d'ordinateurs séquentiels. C'est aussi ainsi que fonctionnent les machines de Turing.

C'est ce à quoi s'oppose une autre "race" d'ordinateurs appelés "parallèles". Ces derniers sont construits suivant des principes un peu différents : ils incluent plusieurs processeurs fonctionnant indépendamment les uns des autres et échangeant entre eux des données. De nombreuses variantes sont possibles suivant le nombre de processeurs présents, le type de mémoire(s) associée(s) à chacun d'eux et leur mode d'interconnexion.

Ces ordinateurs parallèles, quand ils sont utilisés au maximum de leur capacité, sont évidemment beaucoup plus rapides que les ordinateurs séquentiels, puisque plusieurs opérations s'y effectuent en même temps. On les appelle aussi pour cela supercalculateurs. Les machines les plus rapides au monde appartiennent à cette catégorie. Ils ne sont néanmoins pas adaptés à tous les types d'applications et sont beaucoup plus difficiles à programmer que les ordinateurs séquentiels, puisque le programmeur doit prévoir à l'avance ce que chacun des processeurs sera chargé de calculer.

Ils sont donc pour l'instant réservés à la résolution de problèmes très particuliers, pouvant se décomposer en sous-problèmes relativement indépendants les uns des autres et nécessitant chacun de gros calculs, comme la génération ou le traitement d'images ou la prévision météorologique.

Avec le développement des réseaux, on peut aussi maintenant simuler le comportement d'une machine parallèle en faisant interagir entre eux plusieurs ordinateurs usuels, qui se répartissent les calculs à effectuer. Certains programmes plus ou moins scientifiques (comme SETI : Search for Extraterrestrial Intelligence, ou des projets de bioinformatique) ont mis à contribution les ordinateurs personnels de particuliers bénévoles pour répartir leurs calculs, via Internet. L'utilisation de réseaux d'ordinateurs demande aussi, bien sûr, une programmation spécifique.

1.10  Les unités d'échange

Revenons pour finir à nos ordinateurs. Pour que le "coeur" de l'ordinateur puisse échanger des informations avec les périphériques, il faut qu'une connexion entre eux soit assurée. C'est ce que réalisent des "unités d'échanges". Chacune est spécialisée dans l'interface entre l'Unité Centrale, la mémoire centrale et un certain périphérique. L'écran, lui, a un statut un peu à part : il se contente de visualiser une partie de la mémoire centrale appelée "mémoire d'affichage", où sont stockés les composants graphiques des programmes en cours d'exécution. L'organisation matérielle générale d'un ordinateur est donc celle du schéma de la figure 3.12.




Figure 3.12: relations entre l'UC et les unités d'échange


Dans les ordinateurs actuels les plus performants, ces unités d'échange peuvent elles-mêmes inclure une Unité Centrale spécialisée uniquement dans la gestion d'un certain périphérique ou d'une certaine fonction, constituant ce que l'on appelle par exemple une "carte graphique", une "carte son" ou une "carte réseau".

Signalons pour terminer la célèbre Loi de Moore, vérifiée depuis le début des années 60 (Moore est un des fondateurs de la société Intel) : tous les 18 mois, la capacité de mémoire des ordinateurs et leur vitesse de calcul sont doublées, pendant que leur prix à qualité équivalente est divisé par deux.

2  Le logiciel

La partie "logicielle" d'un ordinateur est constituée de l'ensemble des codes stockés dans sa mémoire, et plus particulièrement de ses programmes. Mais, depuis les débuts de l'informatique, les codes se sont superposées les uns sur les autres, constituant ce qu'on appelle des couches logicielles. Nous allons essayer ici de démêler ces couches.

2.1  langages d'assemblage et langages évolués

Ecrire un programme, c'est donc écrire une suite d'instructions élémentaires s'enchaînant les unes après les autres pour réaliser un traitement sur des données. Dans le disque dur et la mémoire centrale, ces programmes sont codés sous forme de bits à la façon du mini-programme dont l'exécution est détaillée en 1.8. De tels programmes sont aussi appelés des "programmes exécutables", puisqu'ils sont directement prêts à être exécutés.

Au début de l'informatique, dans les années 50, programmer revenait ainsi à écrire de telles suites d'instructions élémentaires. Les langages de programmation les plus proches de ce codage de "bas niveau" sont appelés "langages d'assemblage" ou "Assembleurs". Programmer dans un tel langage nécessite de connaître l'architecture matérielle de l'ordinateur sur lequel il s'exécutera ; il y a ainsi presque autant de langages d'assemblage différents que de microprocesseurs. Par exemple, imaginons un ordinateur similaire à notre ordinateur rudimentaire, mais disposant en plus (pour simplifier la suite) d'une dizaine de registres numérotés de 1 à 10, ayant chacun la taille d'un mot mémoire. Le mini-programme exécuté en 1.8 pourrait alors s'écrire en Assembleur de la façon suivante :

ADD 1 2 3
MUL 3 4 5

Dans lequel ADD et MUL signifient respectivement "addition" et "multiplication" et où les numéros 1 à 5 désignent des registres (il est plus facile d'utiliser les registres pour stocker des données intermédiaires que de désigner directement des adresses en mémoire). Chaque instruction élémentaire est constituée exactement de la même façon que les instructions binaires de notre mini-programme : la première donne ainsi l'ordre d'additionner le contenu du registre 1 avec celui du registre 2, et de stocker le résultat dans le registre 3.

Les programmes écrits en Assembleur se traduisent immédiatement en programmes exécutables. Mais programmer en Assembleur n'est ni très simple ni très agréable. Aussi, de nouveaux langages de programmation ont peu à peu été définis pour faciliter la tâche des programmeurs. En inventer un nouveau, cela signifie : La difficulté vient plutôt de la seconde condition que de la première. En effet, toutes les langues humaines sont en principe capables d'exprimer toute méthode de calcul, tout algorithme, de façon plus ou moins informelle. Mais les ordinateurs ne comprennent rien aux langues humaines. De plus, les langues humaines sont beaucoup trop imprécises et ambiguës pour être traduisibles directement en Assembleur. Le problème est donc de définir une langue qui sera traduisible en Assembleur, de telle sorte que cette traduction elle-même puisse s'exprimer par un algorithme.

Ce rôle de traduction est joué par ce qu'on appelle les compilateurs. Un compilateur est un logiciel capable de transformer un programme écrit dans un langage de programmation donné L1 en un programme réalisant le même traitement mais écrit dans un autre langage L2 (en général un Assembleur), comme le montre le schéma de la figure 3.13.



Figure 3.13: rôle d'un compilateur


Les compilateurs étant des programmes, ils sont eux-mêmes écrits dans un certain langage de programmation (et s'ils ne sont pas écrits en Assembleur, ils doivent eux-mêmes être compilés...)..

L'utilisation de compilateurs a permis la définition de langages de programmation de "haut niveau" ou "évolués". Dans de tels langages, on peut s'abstraire de la connaissance matérielle de l'ordinateur sur lequel s'exécutera le programme pour se concentrer sur sa seule logique.

Pascal est un langage de ce type. En Pascal, notre mini-programme peut s'écrire (à quelques instructions près) :

BEGIN
nombre3 := nombre1 + nombre2 ;
nombre5 := nombre3 * nombre4 ;
END.

ou plus simplement :

BEGIN
nombre5 := (nombre1 + nombre2) * nombre4;
END.

Dans ce programme, ":=" et ";" ainsi que les mots clés BEGIN et END sont des symboles propres au langage Pascal. Les mots "nombre1" à "nombre5", eux, ne désignent plus une adresse en mémoire ni un registre mais une variable, c'est-à-dire un espace mémoire quelconque, abstrait, auquel est attribué un nom, sans que le programmeur ait à préciser où il se trouve physiquement.

Tout programme écrit en Pascal commence par le mot BEGIN et se termine par le mot END. La première instruction du premier programme (après le BEGIN) signifie donc que la variable nommée "nombre3" recevra comme contenu le résultat de l'addition des contenus respectifs des variables nommées respectivement "nombre1" et "nombre2". Ce sera au compilateur Pascal de transformer ce programme (appelé aussi "programme source" parce qu'il est écrit dans un langage évolué) en la suite d'instructions en Assembleur donnée plus haut. En Python, on écrira cette même instruction :

nombre5 = (nombre1 + nombre2) * nombre4

Mais attention : le symbole "=" apparaissant dans cette formule n'est pas une égalité au sens mathématique du terme. C'est une instruction, un ordre signifiant que ce qui est écrit à droite est la nouvelle valeur qui doit être stockée dans la variable écrite à gauche. Ainsi, en informatique, une instruction comme :

n=n+1

est tout à fait recevable, alors qu'elle n'aurait pas grand sens en mathématique ; elle signifie : la nouvelle valeur de n est son ancienne valeur + 1.

2.2  La démarche de conception d'un programme

Concevoir un programme pour résoudre un problème donné, c'est donc suivre la démarche de la figure 3.14.



Figure 3.14: démarche de conception d'un programme


Dans ce schéma, les phases d'Analyse et de Traduction sont des opérations intellectuelles humaines, alors que les phases de Compilation et d'Exécution sont réalisées automatiquement par la machine. Le programme source et le programme exécutable sont deux versions numériques (stockées sous forme de bits dans la mémoire) du même algorithme. Le programme source est écrit en langage évolué, alors que le programme exécutable est le résultat de sa compilation. En général, quand on achète un logiciel dans le commerce, c'est uniquement le programme exécutable (illisible, même pour informaticien) qui est fourni. Quand le code source est aussi fourni, on parle de "logiciel libre", puisque tout informaticien peut alors lire le programme (à condition qu'il connaisse le langage dans lequel il est écrit) et le modifier s'il le souhaite.

Une erreur syntaxique est une faute d'écriture (l'équivalent d'une faute d'orthographe ou de grammaire en français) ; elle est signalée par le compilateur quand celui-ci ne sait pas comment interpréter certaines instructions du programme source afin de les traduire dans le langage cible (Assembleur). Ces erreurs, quasiment inévitables même par les programmeurs expérimentés, proviennent d'un non respect des préconisations (draconiennes !) du langage de haut niveau utilisé pour le programme source. Par exemple, oublier de commencer un programme par BEGIN, oublier de le terminer par END ou ne pas séparer deux instructions élémentaires en Pascal par le symbole ";" constituent des fautes de syntaxe.

Une erreur sémantique, beaucoup plus grave, provient d'une mauvaise conception de la méthode suivie pour résoudre le problème. C'est alors l'algorithme lui-même qui doit être modifié, ce qui oblige à remettre en cause les partis pris de la phase d'Analyse.

2.3  Le système d'exploitation

Parmi les logiciels les plus usuels, il en est un qui est devenu indispensable à tous les ordinateurs actuels : c'est le système d'exploitation ou système opératoire (traduction de "Operating System"). Le système d'exploitation d'un ordinateur est en quelque sorte son gestionnaire central, son chef d'orchestre. En tant que programme, il peut être écrit en Assembleur (sinon, il est écrit dans un autre langage et compilé) et est en permanence actif quand l'ordinateur est sous tension. En fait, quand on allume un ordinateur, on provoque automatiquement la recopie du système d'exploitation du disque dur vers la mémoire centrale ; ce programme étant volumineux, c'est ce qui explique que le "démarrage" d'une machine soit si long.

Ses rôles principaux sont les suivants : En résumé, le système d'exploitation est la couche logicielle de base qui s'intercale toujours entre l'utilisateur et le matériel, comme l'illustre le schéma suivant de la figure 3.15.



Figure 3.15: rôle du système d'exploitation


Les systèmes d'exploitation les plus couramment installés sur les ordinateurs actuels sont :

2.4  La hiérarchie des répertoires (ou dossiers) et des fichiers

Nous avons vu dans la première partie de ce document que les données stockées par les ordinateurs peuvent provenir de sources très variées : textes, formules mathématiques, images, etc., chacune correspondant à un mode de codage spécifique. Il ne saurait pourtant être question de stocker toutes ces données "en vrac" dans la (les) mémoire(s) des ordinateurs. De même que pour classer rationnellement des documents papiers, on les range dans des pochettes et des classeurs, le système d'exploitation gère la mémoire disponible à l'aide de fichiers et de réperoires (on parle aussi de dossiers). La figure 3.16 est un exemple de copie d'écran d'un environnement Windows où sont présents de tels composants (les traits symbolisant les liens entre un dossier et la fenêtre montrant son contenu ont été ajoutés).



Figure 3.16: copie d'écran d'un environnement Windows






Figure 3.17: arborescence correspondant à l'environnement précédent



Un fichier sert à stocker des données de même nature (par exemple : caractères provenant d'un texte ou fichier son contenant la version numérisée d'une chanson). C'est une unité logique : un fichier ne correspond pas à un espace mémoire réservé une fois pour toute, il n'a pas de taille fixe prédéfinie et les données qu'il contient peuvent éventuellement ne pas être contiguës en mémoire. Mais, pour l'utilisateur, la façon dont le système d'exploitation gère les fichiers est invisible (les informaticiens disent "transparente"). Tout est fait pour que l'utilisateur ait l'impression que les fichiers qu'il visualise se présentent comme des suites de données cohérentes.

Dans les systèmes Windows, les fichiers reçoivent un nom qui se termine toujours par une "extension" de 3 lettres précédée d'un point. Ces 3 lettres permettent de repérer avec quel logiciel le fichier a été rempli : elles indiquent donc indirectement le mode de codage des données stockées dans ce fichier. Ainsi, un fichier ".txt" contient du texte, donc est codé par une succession de bits correspondant à des codes ASCII, un fichier ".exe" est un programme exécutable, codé sous formes d'instructions élémentaires comme en 1.4, un fichier ".bmp" code une image bitmap...

Les dossiers (ou répertoires), eux, sont plutôt à considérer comme des boîtes ou des classeurs : ils ne contiennent pas directement des données, mais servent d'unités de rangement, pour recevoir soit des fichiers, soit d'autres dossiers (ils peuvent aussi rester vides).

Les fichiers et les dossiers sont structurés dans la mémoire de l'ordinateur de façon arborescente. Ainsi, par exemple, l'ensemble de fichiers et de dossiers qui apparaissent dans l'environnement Windows de la figure 3.16 correspond à l'organisation arborescente de la figure 3.17 (attention : c'est un arbre avec le tronc ou la racine en haut et les feuilles en bas...).

Dans un tel arbre, les fichiers ne peuvent figurer qu'au niveau des feuilles (puisqu'eux-mêmes ne peuvent pas contenir d'autre fichier ou dossier). Les dossiers, eux, constituent les noeuds intermédiaires et n'apparaissent au niveau des feuilles que quand ils sont vides.

C'est le système d'exploitation qui gère toute cette organisation : il permet par exemple d'ajouter, de déplacer, de supprimer, de recopier... tout dossier ou fichier.

2.5  Les autres couches logicielles

Tout logiciel installé sur une machine prend place "au dessus" du système d'exploitation, avec qui il échange les données nécessaires à son fonctionnement. Par exemple, quand un logiciel prévoit une fonction "impression", la demande d'exécution de cette instruction par l'utilisateur est transmise par le logiciel au système d'exploitation, seul habilité à lancer une telle commande.

La figure 3.18 donne une reprsentation imagée de cet "empilement".



Figure 3.18: emplilement du système d'exploitation et d'un logiciel applicatif


Les couches logicielles peuvent bien sûr se superposer indéfiniment les unes aux autres, comme dans la figure 3.19.



Figure 3.19: emplilement de plusieurs logiciels


Dans cette dernière figure, Netscape est un navigateur (ancêtre de Mozilla et de Firefox), un "Plug-in" est un logiciel donnant des fonctionnalités supplémentaires aux navigateurs Internet, permettant par exemple de visualiser des vidéos ou d'écouter des fichiers musicaux en MP3.

Une telle organisation en "couches" explique pourquoi quand on installe un nouveau programme dans un ordinateur, il faut tenir compte des autres couches déjà présentes (et principalement du système d'exploitation) : un programme prévu pour échanger des données/ordres avec Linux sera incapable de fonctionner avec Windows (et réciproquement).

Les machines vendues dans le commerce ont ainsi tendance à inclure de plus en plus de couches pré-installées. La tendance en informatique est donc d'"internaliser" le plus possible de traitements, pour faciliter l'usage courant des ordinateurs. Chaque couche constitue en quelque sorte une machine spécialisée dans certains services.

3  Les réseaux

Un réseau est constitué de composants reliés entre eux pour échanger des données. Le réseau téléphonique en est un exemple, existant bien avant les ordinateurs.

L'idée de connecter des ordinateurs remonte en fait aux années 60. C'était l'époque de la guerre froide entre Américains et Soviétiques. Or, il est apparu dans ce contexte que stocker des informations stratégiques (en particulier militaires) dans un ordinateur unique rendait le site de ce stockage très vulnérable à une attaque ciblée. Pour remédier à cette faiblesse, des chercheurs américains ont eu l'idée de répartir le stockage de données sensibles entre plusieurs machines distantes mais reliées entre elles, la défaillance ou la destruction de l'une d'elles pouvant être compensée par les autres. Le réseau mis en place à cette occasion n'est autre que l'ancêtre de l'Internet...

Au delà des motivations stratégiques initiales, la constitution de réseaux informatiques apporte une dimension supplémentaire à la puissance des machines. Ils permettent en particulier de mettre en commun leurs ressources (mémoires, processeur et périphériques). Ainsi, à l'intérieur d'un réseau, des données stockées sur une certaine machine sont disponibles à toutes les autres qui lui sont reliées (ce qui évite de les recopier à plusieurs endroits). De même, un calcul important peut être réparti entre les processeurs de plusieurs ordinateurs. Enfin, plusieurs machines peuvent être reliées par l'intermédiaire d'un réseau à une imprimante ou à un scanner, ce qui est plus économique que d'en associer à chacune d'elles. Tout se passe donc comme si la capacité de stockage (la mémoire) et la capacité de calcul (processeur) d'une machine mise en réseau étaient augmentée de celles des machines auxquelles elle est reliée.

En contrepartie de cette mise en commun, des systèmes de sécurité doivent être mis en place afin d'éviter que quiconque ayant accès aux données disponibles sur un réseau puisse les modifier ou les détruire à sa guise...

Les ordinateurs seront sans doute de plus en plus indissociables des réseaux dans lesquels ils sont intégrés. Il est donc primordial de comprendre les principes de fonctionnement de ces nouvelles organisations à la fois matérielles et logicielles.

3.1  La notion de protocole

Le réseau informatique le plus simple que l'on puisse imaginer est celui qui est constitué de deux ordinateurs reliés entre eux.

Pour qu'ils puissent s'échanger des données, ces deux ordinateurs doivent tout d'abord disposer d'un moyen physique de faire circuler entre eux des bits : en général un cordon ou un système émetteur/récepteur d'ondes. Mais cela ne suffit pas ! En effet, comment un ordinateur peut-il "savoir" s'il doit attendre des données, comment reconnaît-il le début ou la fin d'une transmission ? Il faut pour cela définir des conventions d'échange, un langage commun pour communiquer. C'est ce qu'on appelle un "protocole de communication". Nous-mêmes, quand nous téléphonons, nous utilisons un protocole implicite qui consiste généralement à échanger un "allô" puis à décliner son identité. Les fins de communications sont également balisées par des formules d'au revoir plus ou moins rituelles. Les ordinateurs procèdent de même, mais de façon systématiquement normalisées.

Imaginons par exemple deux ordinateurs A et B reliés physiquement entre eux. A doit transmettre à B le contenu d'un fichier de données. Comme un fichier peut être de taille arbitrairement grande, il ne peut être question de l'envoyer “d'un seul coup” à travers le cordon. Les données doivent tout d'abord être découpées en parties appelées "trames". Une trame est constituée d'un ensemble de bits. Parmi ceux-ci, certains sont les bits de données (le code du fichier à transmettre), d'autres sont des bits de contrôle nécessaires au protocole : il servent à numéroter les trames, à donner leur longueur, etc.

Imaginons que la taille du fichier à transmettre impose de le découper en 3 trames, numérotées respectivement 1, 2 et 3. Les étapes de la transmission du fichier peuvent alors par exemple être les suivantes : Chacune de ces étapes correspond à un échange de bits : chaque phase de l'échange est codée suivant le protocole de communication commun aux deux machines. Un protocole est ainsi un langage spécifique qui comprend à la fois des mots clés (pour signifier le début ou la fin d'une transmission) et des règles (redemander une trame qui a été mal reçue, etc.). Il est bien sûr stocké sous forme de couche logicielle dans la mémoire de chaque ordinateur qui l'utilise.

3.2  topologie des petits réseaux

Quand on veut étendre la notion de réseau à plus de deux composants (qu'ils soient des machines ou autre chose !), une des premières questions qui se pose est sa topologie, c'est-à-dire l'organisation, l'architecture concrète de ses connexions. Ce paramètre est particulièrement important puisqu'on souhaite que tout point du réseau puisse communiquer avec n'importe quel autre.

La solution apparemment la plus simple consiste à relier physiquement chaque point à tous les autres, comme sur le schéma de la figure 3.20.



Figure 3.20: réseau à connexion complète


Mais une telle solution n'est pas du tout économique en nombre de connexions physiques (il faut mettre des fils partout !) et est de ce fait inapplicable.



Figure 3.21: réseau en anneau





Figure 3.22: réseau en étoile





Figure 3.23: réseau en bus


Pour les réseaux informatiques de petite taille (jusqu'à 100 machines environ), les topologies adoptées sont généralement plutôt en anneau (figure 3.21), en étoile (figure 3.22) ou en bus (figure 3.23). Notons que dans le cas d'un réseau en étoile, le point central auquel sont reliées toutes les machines n'est pas lui-même une machine mais un composant particulier (dans les réseaux informatiques, on l'appelle un "hub").

Toute topologie "hybride", obtenue en combinant ces différentes possibilités, est aussi possible. Ces organisations sont celles employées dans les réseaux locaux, c'est-à-dire ceux qui permettent de relier des machines à l'intérieur d'un même site de travail (comme une entreprise ou une université).

3.3  Exemples de protocoles pour les petits réseaux

Les trames circulant sur de tels réseaux doivent spécifier les références de leur expéditeur et de leur destinataire. Les protocoles de communication pour l'échange de données dans les réseaux locaux doivent en outre prendre en compte la topologie avec laquelle ces réseaux sont constitués. On donne ici la description de deux protocoles parmi les plus simples et les plus courants.

3.4  Les réseaux maillés

Quand il s'agit de relier entre eux un très grand nombre de composants (comme pour le réseau téléphonique) ou quand on veut interconnecter entre eux une multitude de petits réseaux locaux (comme pour Internet), une autre organisation est nécessaire.

La topologie la plus adaptée est alors celle du réseau maillé. Comme son nom l'indique, elle se propose de constituer un filet (net en anglais !) dont les points extrêmes sont les composants à relier et dont les "mailles", les noeuds intermédiaires sont ce que nous appellerons des relais. Un réseau maillé peut ainsi prendre la forme de la figure 3.25 (les relais sont figurés par des rectangles noirs, les ronds peuvent eux-mêmes désigner des réseaux locaux) :



Figure 3.25: réseau maillé


3.5  Deux protocoles possibles dans les réseaux maillés

Comment transitent les données entre deux points dans un réseau maillé ? Quel protocole y est mis en place ? On distingue deux stratégies, répondant à deux types d'usages différents : la commutation de circuits (mode de fonctionnement des téléphones fixes) et la commutation par paquets (qui régit le fonctionnement de l'Internet). Chacune correspond à un protocole particulier, qui englobe les protocoles précédents (et constitue donc des couches s'empilant sur celles correspondant à ces protocoles).

3.6  L'Internet

L'Internet est certainement le réseau le plus connu, et la littérature le concernant est pléthorique. Nous ne ferons qu'effleurer ici quelques unes de ses caractéristiques. Internet est en fait un réseau de réseaux associant des sous-réseaux de structures hétérogènes.

Ce qui le caractérise, c'est un ensemble de protocoles de communication permettant à ces structures de communiquer entre elles via des routeurs, au-delà de leurs différences techniques.

Internet trouve son origine dans la stratégie militaire évoquée au début de ce chapitre. Son ancêtre s'appelait ARPAnet (réseau conçu pour l'ARPA ou Advanced Research Project Agency, le département de la défense américain) et est né en 1969. A l'époque, il a relié quatre universités de la côte ouest américaine, leur permettant des connexions à distance et des échanges de courriers électroniques.

Dès 1972, une quarantaine de lieux s'étaient joints à ce premier réseau, et des structures équivalentes avaient vu le jour en France et en Angleterre. C'est à ce moment que le protocole TCP (pour Transmission Control Protocol) a été défini, à l'initiative de Vint Cerf. Il inclura plus tard le protocole IP (Internet Protocol), et on parle désormais de TCP/IP. En 1980, ces protocoles sortent du secret militaire et entrent dans le domaine public ; n'importe qui peut les utiliser gratuitement. C'est ce qui a permis à Internet de prendre le pas sur les autres réseaux naissant à cette époque, au point qu'à partir de 1988, le nombre de connexions double chaque année. L'année suivante voit la création du RIPE (Réseau IP Européen), chargé de coordonner Internet en Europe, et deux informaticiens du CERN (le laboratoire de physique nucléaire à la frontière franco-suisse) inventent le moyen de définir et de transmettre des documents hypertextes : c'est la création du langage HTML (Hyper Text Markup Language), du protocole HTTP (Hyper Text Transfer Protocol) et la naissance du World Wide Web (littéralement "toile d'araignée mondiale"). Cette nouvelle fonction commencera à prendre un essor considérable grâce à "Mosaic", le premier "navigateur" doté d'une interface graphique, bientôt relayé par Netscape en 1995.

A l'heure actuelle, les principales fonctions d'Internet sont les suivantes : L'accès à chacune de ces fonctions pour un particulier nécessite un minimum d'équipements. Tout d'abord, il faut des moyens matériels. En plus, bien sûr, d'un ordinateur, un modem ou un boîtier ADSL est nécessaire pour relier celui-ci avec le réseau téléphonique (voir partie 2.8), dont l'infrastructure est utilisée pour se rattacher à un routeur. Mais l'accès aux routeurs eux-mêmes est le privilège de sociétés ou d'organismes qui ont payé ce droit et qui s'appellent des "pourvoyeurs de service". Tout particulier qui souhaite disposer d'un point d'entrée sur Internet doit donc s'abonner à un tel pourvoyeur. Les universités françaises sont leur propre pourvoyeur de service : elles sont rattachées au Réseau à haut débit Renater, spécialement mis en place pour la recherche et l'enseignement supérieure. L'abonnement à un pourvoyeur donne généralement droit à une adresse électronique et à la possibilité de stocker des pages personnelles sur un serveur, c'est-à-dire une machine contenant des données accessibles en permanence à partir de tous les points du réseau. Enfin, un ordinateur connecté physiquement à Internet ne sera capable d'accéder vraiment aux données de ce réseau que s'il dispose des couches logicielles adaptées aux protocoles TCP/IP. Ces programmes peuvent être soit spécialisés dans une certaine fonction ("Thunderbird" ne permet que de gérer son courrier électronique) soit plus généralistes (avec "Mozilla", on peut s'occuper de son courrier, "surfer sur le Web" et éditer des pages HTML).

Les protocoles TCP/IP peuvent aussi être utilisés dans le cadre d'un réseau local privé : on parle alors d'Intranet. Un tel réseau rend disponibles les fonctions d'Internet (en particulier la visite de pages Web), mais à un nombre restreint d'utilisateurs. Ils sont de plus en plus utilisés dans les entreprises ou les grandes organisations.

L'explosion actuelle d'Internet semble promettre l'émergence d'un "nouvelle économie" (via notamment le commerce électronique) et de services nouveaux (pour la formation à distance, par exemple). Elle pose aussi des problèmes juridiques et éthiques inédits dans les domaines de la sécurité (paiement électronique, piratage, téléchargements illégaux, etc.), du fichage de données personnelles et des droits d'auteurs, problèmes amplifiés par le caractère "hors frontière" de tout ce qui se passe sur Internet.

3.7  Le Web et son avenir

Le Web désigne l'ensemble des pages hypertextes lisibles à partir des navigateurs, et l'ensemble des données auxquelles elles donnent accès (fichiers sons, images, vidéo, etc.). Chaque page est désignée par son URL (Uniform Ressource Locator), appelée aussi son adresse. La particularité du Web est la présence de liens entre pages, qui permettent justement la "navigation" de page en page par de simples clics de souris.

Le Web est né en 1991 à l'initiative d'un informaticien du Cern, Tim Berners-Lee. On peut dire que le Web est à l'Internet ce que le logiciel est au matériel dans un ordinateur. Il est aussi structuré en réseau, mais c'est un réseau virtuel, dont la structure est complètement indépendante de la structure physique de l'Internet : la création de liens est laissée à l'initiative des créateurs de pages. Deux pages stockées dans des serveurs situés aux antipodes l'un de l'autre sur la planète peuvent être très proches si elles contiennent des liens qui permettent de passer de l'une à l'autre. Le Web s'est ainsi développé spontanément, grâce aux multiples contributeurs bénévoles qui l'ont investi. Il constitue à l'heure actuelle une source de données et d'informations quasi inépuisable.

L'un de ses créateurs, Tim Berners-Lee cherche maintenant à promouvoir une évolution importante : il s'agit de rendre les données du Web (essentiellement textuelles, à l'heure actuelle) compréhensibles non seulement aux humains mais aux ordinateurs, afin d'améliorer la recherche d'information et le raisonnement automatique à l'échelle de l'Internet : c'est le projet du "Web sémantique". L'aventure du Web n'en est encore qu'à son enfance...


Previous Up Next