Architecture Des Systèmes Informatiques Parti1
Architecture Des Systèmes Informatiques Parti1
Architecture Des Systèmes Informatiques Parti1
des machines
et des systèmes
y
7
8554
informatiques
6787
.69:1
.245
.154
:160
9221
Alain Cazes
Ancien maître de conférences en informatique
8885
Joëlle Delacroix
0494
e édition
m:RU
o
vox.c
r
chola
nal.s
natio
inter
7
8554
6787
.69:1
Illustration de couverture :ȱ
.245
.154
:160
9221
8885
558:
0494
www.dunod.com
ISBN 978-2-10-078008-2
m:RU
o
vox.c
r
chola
nal.s
natio
inter
Table des matières
7
8554
6787
CHAPITRE 1 • STRUCTURE GÉNÉRALE ET FONCTIONNEMENT D’UN ORDINATEUR 1
.69:1
1.1 Introduction 1
.245
1.2 Structure et fonctionnement d’un ordinateur 3
1.2.1 Structure générale d’un ordinateur .154 3
1.2.2 La mémoire centrale 4
:160
1.4.1 Le problème 15
1.4.2 L’ordinateur 15
558:
23
2.1.1 Rappel du rôle d’un ordinateur 23
2.1.2 Problème, algorithme, programme et instructions 25
r
chola
7
3.1.3 Analyse syntaxique 40
8554
3.1.4 Analyse sémantique 42
3.1.5 Génération du code final 44
6787
3.2 L’édition des liens 46
3.2.1 Rôle de l’éditeur de liens 46
.69:1
3.2.2 Fonctionnement de l’éditeur de liens 47
3.3 Le chargement
.245
60
3.3.1 Rôle du chargeur 60
3.3.2 Chargement et édition des liens dynamique .154 61
3.4 Le préprocesseur 62
:160
3.4.4 Un exemple 63
3.5 L’utilitaire Make 64
558:
3.7 Conclusion 68
3.8 Qu’avez-vous retenu ? 68
STA
m:RU
7
8554
CHAPITRE 5 • LES CIRCUITS LOGIQUES 105
6787
5.1 Les circuits logiques 105
5.1.1 Définition 105
.69:1
5.1.2 Les circuits combinatoires 106
5.1.3 Les circuits séquentiels 114
.245
5.1.4 Technologie des circuits logiques 116
5.2 Le futur… .154
:160 122
SOLUTIONS 136
natio
inter
VIII Architecture des machines et des systèmes informatiques
7
7.4 Les interruptions : modification du flux d’exécution d’un programme machine 174
8554
7.4.1 Principe des interruptions 174
7.4.2 Un exemple 178
6787
7.5 Amélioration des performances 182
.69:1
7.5.1 Parallélisme des instructions 183
7.5.2 Parallélisme des processeurs 188
.245
7.6 Conclusion 189
7.7 Qu’avez-vous retenu ? .154 190
:160
225
vox.c
7
9.2.4 Deux exemples 247
8554
9.3 Les interfaces d’accès aux périphériques 248
6787
9.3.1 Les unités d’échanges 249
9.3.2 Les bus d’extension 262
.69:1
9.4 Les différents modèles de gestion des entrées-sorties 266
9.4.1 La liaison programmée 267
.245
9.4.2 Entrées-sorties pilotées par les interruptions 269
9.4.3 Gestion des entrées-sorties asynchrones .154 271
9.5 Conclusion 274
:160
9221
Synthèse 281
10.13 Exercice de synthèse n° 1 281
10.14 Exercice de synthèse n° 2 283
SOLUTIONS 285
7
11.1.3 Définition du système d’exploitation multiprogrammé 302
8554
11.2 Structure d’un système d’exploitation multiprogrammé 303
6787
11.2.1 Composants d’un système d’exploitation 303
11.2.2 La norme POSIX pour les systèmes ouverts 305
.69:1
11.3 Principaux types de systèmes d’exploitations multiprogrammés 305
11.3.1 Les systèmes à traitements par lots 306
.245
11.3.2 Les systèmes interactifs 308
11.3.3 Les systèmes temps réel 309
11.3.4 Les systèmes mobiles .154 310
11.3.5 Virtualisation de systèmes 311
:160
7
8554
12.4.2 Exemple sous Linux 364
12.4.3 Exemple sous Windows 366
6787
12.5 Conclusion 367
12.6 Qu’avez-vous retenu ? 368
.69:1
.245
CHAPITRE 13 • GESTION DE LA MÉMOIRE CENTRALE 371
13.1 Mémoire physique et mémoire logique .154 371
13.2 Allocation de la mémoire physique 373
:160
7
8554
CHAPITRE 15 • INTRODUCTION AUX RÉSEAUX 455
15.1 Définition 455
6787
15.2 Les réseaux filaires 457
.69:1
15.2.1 Architecture des réseaux filaires 457
15.2.2 Circulation des informations 465
15.2.3 Exemple de réseau filaire 468
.245
15.3 Les réseaux sans fil 471
15.3.1 Architecture des réseaux sans fil
.154 472
15.3.2 Circulation des informations 474
:160
7
17.12 Processus léger 508
8554
Gestion de la mémoire centrale 509
6787
17.13 Gestion de la mémoire par partitions variables 509
17.14 Remplacement de pages 509
17.15 Mémoire paginée et segmentée 509
.69:1
17.16 Mémoire virtuelle et ordonnancement de processus 510
17.17 Pagination à la demande 511
.245
Système de gestion de fichiers 512
17.18 Modes d’accès .154 512
17.19 Organisation de fichiers 512
:160
SOLUTIONS 517
INDEX 539
:211
© Dunod – Toute reproduction non autorisée est un délit.
STA
m:RU
o
vox.c
r
chola
nal.s
natio
inter
inter
natio
nal.s
chola
rvox.c
om:RU
STA
:211
0494
558:
8885
9221
:160
.154
.245
.69:1
6787
8554
7
Chapitre 1
Structure générale
7
et fonctionnement
8554
d’un ordinateur
6787
1
.69:1
.245
.154
:160
9221
Dans cette partie introductive nous rappelons quelques éléments fondamentaux concer-
nant la programmation et l’algorithmique afin de présenter le vocabulaire utilisé. Il
8885
dans la résolution d’un problème avec un ordinateur. Après cette partie introductive
0494
1.1 INTRODUCTION
o
problème s’exprime sous la forme d’un énoncé qui spécifie les fonctions que l’on
souhaite réaliser. Par exemple définir toutes les fonctions d’un traitement de texte.
r
chola
Trouver une solution à ce problème repose sur l’existence d’un processeur sachant
exécuter une instruction (confectionner). En général un adulte saura exécuter l’instruc-
tion confectionner, c’est-à-dire connaîtra le sens du mot, et sera capable de faire
toutes les actions nécessaires permettant de résoudre le problème. On dira alors que
l’adulte est un bon processeur au sens où il saura exécuter l’instruction confec-
tionner portant sur la donnée œufs. Par contre un enfant pourra ne pas connaître le
mot confectionner : il ne saura pas faire les opérations nécessaires et ne pourra donc
pas résoudre le problème posé (faire une omelette). L’enfant connaît d’autres instruc-
tions, sait exécuter d’autres actions que confectionner, et pour qu’il puisse résoudre
le problème il faudra l’exprimer autrement, sur la base des actions, instructions,
qu’il est capable d’exécuter. Pour que l’enfant puisse résoudre le problème on pourra
l’exprimer sous la forme d’une séquence d’instructions appartenant au langage de
7
l’enfant. Par exemple on pourra exprimer le problème, la solution, sous la forme de
8554
la séquence des instructions suivantes :
1. casser 6 œufs dans un bol;
6787
2. battre les œufs avec un fouet;
3. saler, poivrer;
.69:1
4. placer la poêle sur le gaz;
5. allumer le gaz;
.245
6. cuisiner les œufs;
.154
7. éteindre le gaz.
:160
Dans cet exemple, le processeur enfant sait exécuter des instructions (casser, battre,
saler, poivrer, allumer, cuisiner…). De plus il connaît les objets à manipuler (œufs,
9221
gaz, poêle…). On dit alors que le processeur enfant est un bon processeur pour
exécuter l’algorithme représenté par la séquence précédente puisque l’enfant est
8885
codées à partir d’un alphabet (dans notre cas l’alphabet habituel). Les instructions
manipulent des données (œufs, sel, poivre, gaz, poêle…). Un processeur (ou machine
r
virtuelle) est une entité capable d’exécuter des instructions portant sur des données.
chola
L’ensemble des instructions que le processeur (la machine virtuelle) peut manipuler,
constitue son langage de programmation. Ainsi le langage de programmation du
nal.s
7
langage de programmation de l’ordinateur : le langage machine. Résoudre un problème
8554
avec un ordinateur consiste donc à exprimer ce problème sous la forme d’une
6787
séquence d’instructions machines que nous devrons soumettre aux outils permettant
l’exécution de cette séquence. Cette séquence d’instructions machine exécutables
par l’ordinateur s’appelle le programme machine.
.69:1
.245
1.2 STRUCTURE ET FONCTIONNEMENT
.154
D’UN ORDINATEUR
:160
ordinateur. Pour cela nous donnons tout d’abord une présentation de la structure
matérielle d’un ordinateur, de son fonctionnement, pour ainsi en déduire comment
8885
bien la quasi-totalité des ordinateurs actuels. Il est composé des éléments suivants :
0494
La figure 1.1 présente l’organisation générale d’un ordinateur. On y trouve deux parties
principales :
r
chola
modules;
natio
inter
4 1 • Structure générale et fonctionnement d’un ordinateur
– les périphériques avec lesquels dialogue le processeur au travers des unités d’échange
(ou contrôleurs). On distingue en général :
– les périphériques d’entrée tels que le clavier ou la souris;
– les périphériques de sortie tels que les imprimantes et les écrans de visualisation;
– les périphériques d’entrée et de sortie tels que les disques magnétiques ou les
modems pour accéder aux réseaux de communication.
7
8554
6787
Processeur
Horloge
central
.69:1
Bus
Réseau
Mémoire
.245
cache
comme une suite de ses instructions machine. La solution à un problème est donc
spécifique de chaque processeur. Le programme machine et les données qui sont
STA
manipulées par les instructions machine sont placés dans la mémoire centrale.
m:RU
d’exécuter une instruction que si elle est placée dans la mémoire centrale.
natio
inter
1.2 • Structure et fonctionnement d’un ordinateur 5
Cette mémoire est constituée de circuits élémentaires nommés bits (binary digit).
Il s’agit de circuits électroniques qui présentent deux états stables codés sous la
forme d’un 0 ou d’un 1. De par sa structure la mémoire centrale permet donc de
coder les informations sur la base d’un alphabet binaire et toute information stockée
en mémoire centrale est représentée sous la forme d’une suite de digits binaires. La
figure 1.2 présente l’organisation générale d’une mémoire centrale.
7
8554
0 1 1 1 0 0 1 1 1 0 0 1 0 1 0 1 3
1 0 0 0 1 1 0 0 0 1 1 1 0 0 1 0 4
1 0 0 0 1 0 0 1 0 1 0 1 0 1 1 0 5
6787
1 0 0 0 1 1 0 0 0 1 1 1 0 0 1 0 6
0 1 1 1 0 1 1 0 1 0 1 0 1 1 0 1 7
.69:1
.245
Mot mémoire Bus
d’adresse 2
.154
données
:160
9221
mots mémoires. Chaque mot est constitué par un certain nombre de bits qui définis-
sent sa taille. On peut ainsi trouver des mots de 1 bit, 4 bits (quartet) ou encore 8 bits
0494
(octet ou byte), 16 bits voire 32 ou 64 bits. Chaque mot est repéré dans la mémoire
par une adresse, un numéro qui identifie le mot mémoire. Ainsi un mot est un conte-
:211
nant accessible par son adresse et la suite de digits binaires composant le mot repré-
© Dunod – Toute reproduction non autorisée est un délit.
codée sur des mots. L’information est accessible par mot. La capacité de stockage de
la mémoire est définie comme étant le nombre de mots constituant celle-ci. Dans
l’exemple de la figure 1.2, notre mémoire a une capacité de 8 mots de 16 bits
o
vox.c
trouve en mémoire centrale est donc codée sur un alphabet binaire. La figure 1.3
chola
rappelle le nombre de combinaisons que l’on peut réaliser à partir d’une suite
d’éléments binaires. Coder l’information en mémoire centrale c’est donc associer à
nal.s
Codage de l’information
x 2 combinaisons 0 1
xx 4 combinaisons 0 0 n 2n
0 1
1 0 0 1
1 1 1 2
2 4
xxx 8 combinaisons 0 0 0 3 8
0 0 1 4 16
0 1 0 5 32
6 64
7
0 1 1
8554
1 0 0 7 128
1 0 1 8 256
1 1 0 9 512
6787
1 1 1 10 1024
.69:1
n bits donnent 2n combinaisons différentes
.245
Figure 1.3 Codage binaire.
.154
La figure 1.4 présente succinctement les différentes informations que l’on trouve
:160
Informations
8885
Données
558:
Instructions
0494
0001 0100
Nbentiers
Nbentiers négatifs
m:RU
positifs
Signe C1 C2
o
Nb Fractionnaires
vox.c
+
valeur absolue
Virgule fixe Virgule flottante
r
chola
Les instructions et les données sont codées sur des mots mémoires : elles peuvent
occuper un ou plusieurs mots mémoires selon la nature de l’ordinateur. Les instruc-
tions machines sont propres à chaque microprocesseur mais sont toujours construites
de la même manière : un code opération qui définit l’opération à exécuter, le champ
opérande qui définit la ou les données sur lesquelles portent l’opération :
– le code opération est codé sur un nombre de digits binaires qui caractérise un
microprocesseur. Ce nombre de bits définit en fait le nombre d’opérations
possibles avec cet ordinateur : un code opération sur 3 bits admet 8 combinaisons
permettant la définition de 8 opérations différentes (instructions machine)
possibles, sur 4 bits 16 instructions possibles etc. La taille du code opération est
donc un facteur déterminant qui caractérise complètement le nombre d’instruc-
tions qu’est capable d’exécuter un processeur;
7
– le champ opérande est une suite de bits qui permet de caractériser l’adresse de la ou
8554
des donnée(s) que manipule(nt) l’instruction machine définie par le code opéra-
tion. Il existe plusieurs types d’instructions machines qui peuvent manipuler une
6787
ou plusieurs données selon la « puissance » du langage machine du microproces-
seur utilisé. Il existe également plusieurs manières de définir, à partir du champ
.69:1
opérande, l’adresse d’une donnée : cela repose sur le mécanisme d’adressage d’un
microprocesseur qui définit les différentes manières de calculer une adresse de
.245
données. On parle également de modes d’adressages du microprocesseur.
.154
Les données sont les objets que manipulent les instructions, elles sont codées sur
un ou plusieurs mots machines et sont donc adressables (repérables) dans la mémoire
:160
centrale. L’adresse de la donnée est déterminée par le type d’adressage utilisé par
l’instruction machine. Le codage d’une donnée en mémoire dépend de son type : la
9221
figure 1.4 donne les différents types de données que manipulent les instructions
machines. Pour chaque type il existe des règles de codage. Par exemple pour coder
8885
Octet 01100101
Informations
STA
Position du bit 7 6 5 4 3 2 1 0
m:RU
0 1 1 0 0 1 0 1
Données Valeur de l’octet :
o
0 ´ 2 7 + 1 ´ 26 + 1 ´ 25 + 0 ´ 24 + 0 ´ 23 + 1 ´ 22 + 0 ´ 21 + 1 ´ 20
vox.c
Nb entiers positifs
La valeur maximale d’un entier sur p bits est 2p – 1
nal.s
faible. La valeur de l’entier est alors la somme des produits de chaque bit par le
nombre de symboles possibles dans la base d’expression du nombre (ici 2) élevé à la
puissance du rang du bit. Cette règle est générale et permet de déterminer la valeur
d’un entier codé sur n’importe quel alphabet. Dans le cas d’un alphabet binaire la
valeur maximale que peut prendre un entier codé sur p bits est 2p. Les principales
normes de codages existantes à l’heure actuelle ainsi que la structure des instructions
machine et les modes d’adressages courants sont détaillés au chapitre 4.
La mémoire centrale a pour objet le stockage des instructions et des données que
peut manipuler le microprocesseur. Les opérations possibles sur la mémoire sont la
lecture (acquisition par le microprocesseur) d’un mot et l’écriture (le microproces-
seur place un nouveau contenu) dans un mot mémoire. Une opération de lecture d’un
mot consiste à définir l’adresse du mot et à déclencher une commande de lecture qui
7
amène le contenu du mot de la mémoire vers le microprocesseur. Une opération
8554
d’écriture consiste à définir l’adresse du mot dont on veut changer le contenu puis à
déclencher une opération d’écriture qui transfère l’information du processeur vers le
6787
mot mémoire dont l’adresse est spécifiée.
Enfin d’autres éléments importants complètent la caractérisation d’une mémoire
.69:1
centrale :
– le temps d’accès à la mémoire qui mesure le temps nécessaire pour obtenir une
.245
information logée en mémoire;
– les technologies qui président à la construction de ces mémoires; .154
– le coût de réalisation de ces mémoires.
:160
Nous reviendrons en détail sur l’ensemble de ces points dans le chapitre sur la
9221
des signaux et permettant l’échange des informations entre les différents modules du
0494
figure 1.6, le bus d’adresses a une largeur de 3 fils et est donc capable de coder
des adresses allant de 0 à 7. Pour adresser un mot mémoire on fait appel à un circuit
r
fournit 2n signaux de sortie (8 dans notre exemple). Parmi les signaux de sortie un
seul est positionné à 1 tous les autres valant 0. Dans notre exemple, les sorties sont
nal.s
sortie 0 vaut 1 et toutes les autres valent 0. Pour adresser le mot mémoire 2 le
microprocesseur place sur le bus d’adresses la chaîne 010 (qui a pour valeur 2 en
base 10), la sortie 1 du décodeur vaut alors 1 et les autres valent 0. Ce circuit permet
donc de sélectionner un mot mémoire dans la mémoire centrale. La largeur du bus
d’adresses définit la capacité d’adressage du microprocesseur et il ne faut pas
confondre capacité d’adressage et taille physique de la mémoire;
Processeur
Commandes
Adresse
Données
7
8554
6787
Mémoire centrale
.69:1
Largeur
des bus :
.245
1 fil
3 fils
16 fils .154
Selection
:160
9221
Bus
8885
Tampon d’entrées-sorties
558:
0494
:211
STA
– le bus de données permet l’échange des informations (les contenus) entre les
m:RU
différents modules. Dans notre exemple le bus de données a une largeur de 16 fils
et donc la taille des mots mémoires auxquels on peut accéder ou dont on peut modi-
fier le contenu est de 16 bits;
o
vox.c
– le bus de commandes : c’est par ce bus que le microprocesseur indique la nature des
opérations qu’il veut effectuer. Dans notre exemple il a une largeur d’un fil et donc
r
chola
bus permettant la communication avec la mémoire. Sur cette figure 1.7, le bus
natio
inter
10 1 • Structure générale et fonctionnement d’un ordinateur
d’adresses a une largeur de m bits, le bus de données une largeur de p bits ce qui
détermine la capacité de stockage en bits de cette mémoire, soit 2m mots de p bits. Le
bus de commandes permet de déterminer le type d’opération (lecture ou écriture)
que l’on souhaite réaliser.
Bus d’adresses
m bits Fonctions : stockage
Adresse programme
et données
Mémoire Unités de stockage : Bit, Octet, Mot.
Mots
Lecture 2m mots de p bits
Adressage : Mot
Écriture
7
8554
Temps d’accès.
Bus de commandes
6787
Technologies.
Données
Coûts.
.69:1
p bits
Bus de données
.245
Figure 1.7 Bus de communication et mémoire centrale.
.154
1.2.4 Le processeur central ou microprocesseur
:160
Y1
Z Opération
Unité Arithmétique
558:
et Logique Y2
PSW
Bus interne
0494
Données
Registres
:211
Commandes
STA
Séquenceur
m:RU
Unité de Commande
Décodeur RI
CO
o
RAD
vox.c
RDO
Commandes Lecture/Écriture
r
chola
Les registres
Ce sont des zones de mémorisation de l’information internes au microprocesseur. Ils
sont de faible capacité et de temps d’accès très faible. Leur nombre et leur taille sont
variables en fonction du type de microprocesseur. Ils peuvent être de type adresse
(ils contiennent alors une adresse de mot mémoire) ou données (ils contiennent alors
le contenu d’un mot mémoire). Ils peuvent être spécifiques et avoir une fonction très
précise (par exemple le registre pointeur de pile) ou généraux et servir essentielle-
ment aux calculs intermédiaires, par exemple, de l’unité arithmétique et logique.
7
8554
L’unité arithmétique et logique (UAL)
Ce module est chargé de l’exécution de tous les calculs que peut réaliser le micro-
6787
processeur. Cette unité est constituée de l’ensemble des circuits arithmétiques et
logiques permettant au processeur d’effectuer les opérations élémentaires néces-
.69:1
saires à l’exécution des instructions machine. Elle inclut donc les circuits d’addition,
de soustraction, de multiplication, de comparaison, etc. Dans ce module se trouvent
.245
également des registres dont l’objet est de contenir les données sur lesquelles vont
.154
porter les opérations à effectuer. Dans notre exemple, l’UAL possède deux registres
d’entrée (E1 et E2) et un registre de sortie (S).
:160
commandes;
– le résultat est placé dans le registre S.
558:
Status Word), qui joue un rôle fondamental de contrôle de l’exécution d’un programme
et qui à tout instant donne des informations importantes sur l’état de notre micropro-
:211
cesseur. Par exemple puisque nous travaillons sur des mots de longueur finie la valeur
© Dunod – Toute reproduction non autorisée est un délit.
d’un entier codé sur un mot ne peut dépasser la valeur maximale représentable sur ce
STA
mot. Lorsque nous faisons l’addition de deux entiers le résultat peut avoir une valeur
qui n’est pas représentable sur un mot mémoire : il y a alors dépassement de capacité.
m:RU
Ce dépassement de capacité doit être signalé et noté pour ne pas perturber le fonc-
tionnement de l’ordinateur. Ce type d’information est stocké dans le PSW.
o
vox.c
L’unité de commande
r
Elle exécute les instructions machines et pour cela utilise les registres et l’UAL du
chola
deux registres (le registre d’adresses RAD et le registre de données RDO) permettant
natio
inter
12 1 • Structure générale et fonctionnement d’un ordinateur
la communication avec les autres modules via le bus. Enfin, via le bus de commandes,
elle commande la lecture et/ou l’écriture dans la mémoire centrale.
➤ Le compteur ordinal CO
C’est un registre d’adresses. À chaque instant il contient l’adresse de la prochaine
instruction à exécuter. Lors de l’exécution d’une instruction il est prévu, au cours de
cette exécution, la modification du contenu du CO. Ainsi en fin d’exécution de
l’instruction courante le compteur ordinal pointe sur la prochaine instruction à exécuter
et le programme machine peut continuer à se dérouler.
➤ Le registre d’instruction RI
C’est un registre de données. Il contient l’instruction à exécuter.
7
8554
➤ Le décodeur
Il s’agit d’un ensemble de circuits dont la fonction est d’identifier l’instruction à
6787
exécuter qui se trouve dans le registre RI, puis d’indiquer au séquenceur la nature de
cette instruction afin que ce dernier puisse déterminer la séquence des actions à
.69:1
réaliser.
.245
➤ Le séquenceur
Il s’agit d’un ensemble de circuits permettant l’exécution effective de l’instruction
.154
placée dans le registre RI. Le séquenceur exécute, rythmé par l’horloge du micropro-
cesseur, une séquence de microcommandes (micro-instructions) réalisant le travail
:160
les registres et l’UAL. Ainsi l’exécution effective d’une instruction machine se traduit
par l’exécution d’une séquence de micro-instructions exécutables par les circuits de
8885
base du microprocesseur. Nous reviendrons plus en détail sur cet aspect des choses
dans le chapitre 7, consacré à l’exécution des instructions machines.
558:
➤ Le registre RAD
0494
RAD est placée sur le bus d’adresses et devient la valeur d’entrée du circuit de sélection
de la mémoire centrale qui va à partir de cette entrée sélectionner le mot mémoire
STA
correspondant.
m:RU
➤ Le registre RDO
C’est un registre de données. Il permet l’échange d’informations (contenu d’un mot
o
circuit de sélection;
– déclenche une commande de lecture mémoire via le bus de commandes;
nal.s
7
8554
du type : CO, RAD, commande de lecture puis RDO, RI.
6787
1.3 FONCTIONNEMENT : RELATION
.69:1
MICROPROCESSEUR / MÉMOIRE CENTRALE
.245
L’objet de cette partie est de présenter succinctement comment s’exécute un programme
machine sur le matériel que nous venons de définir. Pour être exécutable une instruc-
.154
tion doit nécessairement être présente en mémoire centrale. La mémoire centrale
contient donc des instructions et des données. De plus toutes les informations en
:160
mémoire sont codées sur un alphabet binaire. Les informations sont alors, quelle que
soit leur nature, des suites de 0 et de 1. Il faut donc pouvoir différencier instructions
9221
et données afin que le registre instruction RI contienne bien des instructions et non
des données (et réciproquement). Dans le cas contraire le décodeur ne pourrait inter-
8885
préter la nature du travail à faire (RI ne contenant pas une instruction mais une
558:
Mémoire
0494
Instructions Données
:211
© Dunod – Toute reproduction non autorisée est un délit.
5
STA
m:RU
3
Horloge
o
vox.c
4 1
2
r
chola
nal.s
7
8554
3. l’instruction est transférée de la mémoire centrale vers le registre instruction RI
via le bus de données et le registre de données RDO;
6787
4. le décodeur analyse l’instruction placée dans le registre instruction RI, reconnaît
cette instruction et indique au séquenceur la nature de l’instruction;
.69:1
5. le séquenceur déclenche au rythme de l’horloge la séquence de micro-instructions
nécessaires à la réalisation de l’instruction.
.245
On peut résumer les étapes de l’exécution d’une instruction (chargement/déco-
dage/exécution) par l’algorithme suivant : .154
début
:160
➥ de l’instruction;
fin
:211
suivant :
début
o
vox.c
exécuter l’instruction;
fin faire
nal.s
fin
natio
inter
1.4 • Un exemple 15
1.4 UN EXEMPLE
Pour résumer ce que nous venons d’étudier, nous allons prendre un exemple de
problème à résoudre avec un ordinateur. Nous définissons tout d’abord le problème
et l’ordinateur cible c’est-à-dire son langage de programmation (langage machine).
Puis nous construisons le programme machine exécutable par cet ordinateur. Enfin
nous plaçons ce programme en mémoire centrale. Il peut alors être exécuté par le
microprocesseur.
1.4.1 Le problème
Notre problème consiste à réaliser l’addition de X qui vaut 4 avec Y qui vaut 1 et à
placer le résultat dans Z. Nous souhaitons donc, à l’aide de notre ordinateur, réaliser
7
l’opération : Z = X + Y avec X = 4 et Y = 1.
8554
6787
1.4.2 L’ordinateur
Cet ordinateur a la structure générale définie dans la figure 1.11. Les mots de la
.69:1
mémoire sont des octets (8 bits), tous les registres du microprocesseur ont une largeur
de 8 bits, les instructions et les données entières sont codées sur un mot mémoire.
.245
Données : X est codé : 000001002 ; Y est codé : 000000012.
.154
1.4.3 Le langage machine
:160
Le code opération est codé sur 4 bits, le champ opérande sur 4 bits. Le champ opérande
9221
ne référence qu’une donnée. Ainsi pour faire l’addition de deux nombres un tel
langage suppose que la première donnée est spécifiée dans l’instruction et la seconde
occupe une adresse implicite. Dans de nombreuses machines cette adresse implicite
8885
est un registre appelé registre Accumulateur (noté A). L’addition porte alors sur la
donnée spécifiée dans l’instruction et le contenu de A, le résultat étant placé dans A.
558:
0494
STA
0001 0100
m:RU
0001 0100 Charger le contenu du mot mémoire d’adresse 0100 dans le registre A
o
0010 0101
mémoire d’adresse 0101 et placer le résultat dans le registre A
0011 0110 Placer le contenu du registre A dans le mot mémoire d’adresse 0110
r
chola
Les instructions du langage sont définies dans la figure 1.10. La figure 1.11 résume
les différentes phases amenant à l’exécution du programme machine solution de notre
problème sur cette machine :
– les données ont été chargées aux adresses 0100 (pour X), 0101 (pour Y), le résultat
à l’adresse 0110 (pour Z);
– le programme machine est chargé à l’adresse 0111;
– le compteur ordinal est chargé avec l’adresse 0111.
À titre d’exercice vérifiez que l’exécution du programme machine résout bien notre
problème.
Faire l’addition
7
8554
de X qui vaut 4 0001 0100
et de Y qui vaut 1, Traduction en langage machine 0010 0101 Programme
placer le résultat 0011 0110 machine
6787
dans Z 0000
.69:1
Z=X+Y Chargement
en mémoire
.245
centrale
Mémoire .154
Instructions
Adresses
:160
Données
0011 11001001
9221
0110 00000000
Exécution 0111 00010100
Horloge
558:
RI
1000 00100101
CO
RAD 1001 00110110
0494
les échanges entre mémoire centrale et unité d’échange. On trouve des instruc-
tions d’écriture permettant au microprocesseur de placer des informations dans
l’unité d’échange et des instructions de lecture permettant au microprocesseur
d’acquérir des informations à partir des unités d’échanges. De plus des d’outils de
synchronisation permettant d’harmoniser les activités du processeur avec celles
des périphériques qu’il pilote sont nécessaires : il ne faut, par exemple, envoyer
des caractères vers une imprimante que si celle-ci est prête à imprimer et attendre
dans le cas contraire. Dans nos ordinateurs les unités d’échanges ne communi-
quent pas directement avec le bus interne du processeur mais au travers de bus,
dits bus d’extension. Il existe une assez grande variété de ces bus d’extension
(ISA, USB, FireWire, Fiberchanel, PCI…) qui satisfont des fonctionnalités
diverses et plus ou moins générales. Nous reviendrons plus en détail sur cette
7
question dans le chapitre traitant des questions de communication;
8554
– elle est en communication avec les périphériques et à ce titre doit être capable de
les piloter.
6787
.69:1
1.6 CONCLUSION
.245
Dans ce chapitre nous avons fait le tour de toutes les étapes importantes nécessaires
à la résolution d’un problème avec un ordinateur. La figure 1.12 résume ces diffé-
rentes étapes. .154
:160
Programme assembleur/machine
ion)
9221
Problème
tat Chargement (SE)
ploi
’ex
ed
8885
ilati
mp
Co
0494
(séquence
vox.c
• Décodage
d’instructions • Exécution de la séquence
machine) de micro-instructions
r
chola
nal.s
Nous voyons qu’une des étapes consiste à exprimer l’algorithme avec un langage
de haut niveau. En fait il existe plusieurs niveaux de langage de programmation :
– les langages de haut niveau (C, C++ , ADA, JAVA, COBOL, PASCAL, PYTHON…)
ne sont pas directement exécutables par le processeur cible que nous utilisons :
l’ordinateur. Il faut donc « traduire » les programmes exprimés dans ces langages
afin d’obtenir le programme machine exécutable par le processeur cible. C’est
l’objet de la compilation et/ou de l’interprétation. Les compilateurs (interpré-
teurs) sont des programmes (du Système d’Exploitation : SE) qui ont la connais-
sance de la syntaxe des langages de haut niveau et qui connaissent le langage
machine de la machine cible. Ces langages sont nécessaires car on ne sait pas
traduire directement le langage naturel en langage machine alors que l’on sait
construire des traducteurs pour ces langages de haut niveau;
7
– les langages de bas niveaux sont des langages directement exécutables par un
8554
microprocesseur. Ce sont les langages machines. Ils se présentent sous deux formes :
6787
– les langages machine codés binaires. Ce sont les seuls réellement exécutables
par le processeur. Codés sous forme binaire ils sont difficiles à manipuler;
.69:1
– les langages d’assemblage. Ce sont des langages machines symboliques au sens
où les codes opération et les champs opérande d’une instruction sont exprimés
.245
à l’aide de symboles.
Par exemple dans la petite machine qui nous a servis d’exemple, 00010010 est une
.154
instruction machine demandant de charger le contenu de l’adresse mémoire 0010 dans
:160
beaucoup plus simple à utiliser que le langage machine codé binaire. Bien sûr un
programme écrit en langage d’assemblage n’est pas directement exécutable par le
558:
fréquente. Elle se justifie encore lorsque l’on recherche une grande efficacité, par
exemple, dans la programmation des jeux vidéos ou des interfaces graphiques.
STA
7
8554
des informations entre processeur et périphériques.
Enfin, nous commençons à le voir, le système d’exploitation joue un rôle central
6787
dans la gestion et le fonctionnement des ordinateurs. Nous y consacrons la troisième
partie de cet ouvrage.
.69:1
Pour terminer cette introduction, quelques mots pour préciser le processus de
démarrage d’un ordinateur. En plus de la mémoire centrale (communément appelée
.245
mémoire RAM) il existe une mémoire ROM, dite mémoire morte, uniquement acces-
sible en lecture donc non modifiable par programme et qui de plus n’est pas volatile :
quand le courant est coupé, le contenu de cette mémoire ROM n’est pas altéré .154
contrairement aux mémoires RAM pour lesquelles le contenu est perdu lorsque le
:160
courant est coupé. Cette mémoire ROM est chargée, une fois pour toutes, avec un
programme : le bootstrap.
9221
7
8554
6787
.69:1
.245
.154
:160
9221
8885
558:
0494
:211
STA
m:RU
o
vox.c
r
chola
nal.s
natio
inter
PARTIE 1
PRODUCTION
DE PROGRAMMES
7
8554
6787
.69:1
.245
.154
L’ensemble des chapitres de cette partie est centré autour de la notion de chaîne de
:160
programmation ainsi que les différents niveaux de langages disponibles sur un ordi-
nateur. Nous abordons ainsi les concepts de langage machine et langage haut niveau,
8885
puis nous nous intéressons aux différentes étapes permettant la traduction d’un
programme écrit en langage haut niveau vers son équivalent écrit en langage machine
558:
Du problème
au programme machine
7
8554
2
6787
.69:1
.245
.154
:160
ordinateur, ceci sous forme d’un programme écrit dans un langage de programma-
tion dit langage de haut niveau, qui code une solution appelée algorithme. L’ordina-
8885
teur ne pouvant exécuter que des instructions codées en langage machine, il est
nécessaire de traduire ce langage de haut niveau vers le langage machine de l’ordina-
558:
L’ordinateur est présent de nos jours dans de multiples domaines et lieux. En une
cinquantaine d’années, il a envahi notre quotidien et il est bien des domaines à
présent où son utilisation et sa puissance se révèlent indispensables. En effet, l’ordi-
o
vox.c
nateur a investi de multiples espaces et remplit des missions très diverses qui vont du
calcul scientifique pour par exemple séquencer l’ADN ou analyser les modèles
météorologiques, au pilotage de procédé tel que la surveillance d’une centrale
r
chola
sorte son unique rôle : archiver des données et exécuter un programme de traitement
natio
inter
24 2 • Du problème au programme machine
sur ces données en vue de résoudre un problème. L’ordinateur offre à l’être humain
une puissance de stockage, de calcul et de traitement bien supérieure à ce à quoi il
peut prétendre par lui-même. Prenons trois exemples :
– en paléontologie, l’analyse cladistique a pour but de mettre en évidence les liens
de parenté existants entre différents organismes afin d’identifier des clades1 et de
construire les arbres évolutifs. Pour parvenir à ce but, le paléontologue doit iden-
tifier entre plusieurs organismes la possession en commun de caractères dérivés
due à une ascendance commune. Une telle recherche ne peut se faire que par une
comparaison simultanée d’une grande quantité de données, c’est-à-dire de carac-
tères et d’espèces, qu’il est inenvisageable de réaliser sans le concours de l’ordi-
nateur. En effet la quantité de données à comparer est telle que pour un être
humain établir un seul arbre demanderait un temps considérable. Grâce à l’ordi-
7
nateur, il est possible d’établir et de calculer des millions d’arbres possibles en un
8554
temps raisonnable2 ;
6787
– en informatique de gestion, les systèmes de bases de données permettent de
stocker, classer et gérer des millions de données dans un espace bien plus réduit
qu’au temps où seul le support papier existait. Par ailleurs, les performances des
.69:1
méthodes d’interrogations liées à ces systèmes rendent possibles des extractions
de données suivant des objectifs multicritères dans des temps réduits, là où il
.245
faudrait un traitement manuel de plusieurs heures. Songez au catalogue informa-
.154
tique de la bibliothèque municipale de votre ville, comme il est aisé de demander
à l’ordinateur de rechercher dans l’ensemble des livres traitant de la musique
:160
baroque, les seuls ouvrages consacrés à la fois à Haendel et Vivaldi. Vous n’avez
plus alors qu’à vous diriger vers le rayon désigné, prendre le livre correspondant à
9221
la cote fournie; là où il vous aurait fallu soit compulser le classeur papier trié par
ordre alphabétique ou chacun des livres du rayon musique;
8885
peut pas piloter son appareil sans le concours de l’informatique embarquée. Celle-
ci lui permet entre autre une vitesse de réaction supérieure en prenant elle-même
STA
d’éviter l’impact.
r
chola
1. Une clade (du grec klados « rameau ») désigne une branche d’un arbre évolutif comprenant un
ancêtre et ses descendants.
2. TASSY Pascal, Le paléontologue et l’évolution, Collection Quatre à Quatre, Éditions Le Pommier-
nal.s
7
8554
– l’algorithme est codé sous forme d’instructions dans un langage exécutable et
compréhensible par l’ordinateur : c’est l’activité de programmation qui construit
6787
un programme. Une instruction équivaut à un ordre qui entraîne l’exécution par
l’ordinateur d’une tâche élémentaire.
.69:1
1.
.245
J’ai un problème à résoudre :
b .154
:160
a périmètre ?
9221
8885
Périmètre = 2 a + 2 b
0494
:211
© Dunod – Toute reproduction non autorisée est un délit.
STA
perimetre := (2 * a) + (2 * b);
end;
nal.s
7
8554
algorithme dans un langage assimilable par l’ordinateur. Cette activité de program-
6787
function perimetre (a, b : in integer) return integer is
begin
.69:1
perimetre := (2 * a) + (2 * b);
end; Programme en langage de haut niveau
instructions de haut niveau
.245
.154
:160
COMPILATEUR
9221
mul Im R1 2
mul Im R2 2 Programme en langage d’assemblage :
558:
ret
:211
ASSEMBLEUR
STA
MÉMOIRE
m:RU
01101110111110011
01111010001011100 Programme à exécuter :
10111101110111111 instructions machine et valeurs en binaire
o
CPU
vox.c
00111011110111011
00111111000111101
r
chola
BUS Traduction
nal.s
7
8554
caractères et instructions) ne peuvent donc être représentées que par une combi-
naison de 0 et 1, c’est-à-dire sous forme d’une chaîne binaire. C’est le niveau de
6787
programmation le plus bas et le plus proche du matériel, celui du langage machine.
À ce niveau, la programmation et les instructions du langage sont totalement
.69:1
dépendantes de l’architecture de la machine et du processeur et manipulent directe-
ment les registres du processeur ou encore les adresses en mémoire physique, tout
.245
cela sous forme de chaînes binaires. Ainsi, une instruction machine (figure 2.3) est
une chaîne binaire composée essentiellement de deux parties :
– le code opération désigne le type d’opération à effectuer (addition, ou logique,
.154
lecture mémoire…);
:160
– le reste de l’instruction sert à désigner les opérandes, c’est-à-dire les données sur
9221
lesquelles l’opération définie par le code opération doit être réalisée. Ces opérandes
sont soit des mots mémoires, soit des registres du processeur ou encore des valeurs
immédiates.
8885
558:
32 bits
0494
STA
00100110 : multiplication
etc.
o
Chaque instruction est par ailleurs repérée par une adresse qui mémorise la posi-
r
chola
7
– un champ étiquette, non obligatoire, qui correspond à l’adresse de l’instruction
8554
machine;
6787
– un champ code opération, qui correspond à la chaîne binaire code opération de
l’instruction machine;
.69:1
– un champ opérandes pouvant effectivement comporter plusieurs opérandes séparés
par des virgules qui correspondent aux registres, mots mémoires ou valeurs immé-
.245
diates apparaissant dans les instructions machine.
.154
étiquette code opération désignation des opérandes
:160
9221
qu’au niveau machine, est encore fastidieuse pour l’être humain et requiert surtout
de connaître l’architecture du processeur et de la machine. On parle ainsi du langage
o
nécessite une étape de traduction, car seules les instructions en langage machine sont
compréhensibles et exécutables par la machine. Pour pouvoir exécuter un programme
nal.s
écrit en langage d’assemblage, il faut donc traduire les instructions de celui-ci vers
natio
inter
2.2 • Les différents niveaux de langage de l’ordinateur 29
les instructions machine correspondantes. Cette phase de traduction est réalisée par
un outil appelé l’assembleur3.
7
8554
ainsi des structures opératoires semblables à celles des algorithmes telles que les
itérations, les boucles, les conditionnelles.
6787
Ainsi les langages de haut niveau sont plus ou moins spécialisés par rapport à une
classe de problèmes à résoudre : COBOL est destiné aux applications de gestion tandis
.69:1
que FORTRAN est plutôt orienté vers le domaine du calcul scientifique. D’autres
langages sont plus universels tels que C, C++ , Ada, Java ou encore Pascal.
.245
De nos jours, les langages haut niveau sont classés selon plusieurs grandes familles.
Deux familles de langages importants et courants sont la famille des langages dits
.154
procéduraux et la famille des langages dits objets :
:160
– le langage procédural : l’écriture d’un programme est basée sur les notions de procé-
dures et de fonctions, qui représentent les traitements à appliquer aux données du
9221
– le langage objet : l’écriture d’un programme est basée sur la notion d’objets, qui
représentent les différentes entités entrant en jeu dans la résolution du problème.
558:
À chacun de ces objets sont attachées des méthodes, qui lorsqu’elles sont activées,
modifient l’état des objets. Les langages Java et Eiffel sont deux exemples de
0494
langages objets.
Les langages évolués étant indépendants de la machine, ils ne peuvent être direc-
:211
© Dunod – Toute reproduction non autorisée est un délit.
tement exécutés par la machine. Un programme écrit en langage haut niveau doit
STA
donc être converti vers son équivalent en langage machine. C’est le rôle du traduc-
teur de langage, qui est spécifique à chaque langage évolué utilisé.
m:RU
Les traducteurs sont divisés en deux catégories : les compilateurs et les inter-
préteurs.
o
– un compilateur traduit une fois pour toutes le langage évolué en langage machine
vox.c
et construit ainsi un programme qualifié de programme objet qui est stocké sur un
support de masse tel qu’un disque;
r
chola
3. Par abus de langage, le terme assembleur désigne tout à la fois le langage d’assemblage lui-
nal.s
– un interpréteur lit une à une les instructions du langage évolué, puis il les convertit
immédiatement en langage machine avant qu’elles ne soient exécutées au fur et à
mesure. Il n’y a pas de génération d’un fichier objet conservant la traduction des
instructions en langage évolué vers le langage machine et la traduction doit donc
être refaite à chaque nouvelle demande d’exécution du programme.
Plus généralement, le passage d’un programme dit programme source écrit en
langage de haut niveau vers un programme exécutable en langage machine est assuré
par un processus comportant plusieurs étapes dont l’une est la compilation, que l’on
qualifie de chaîne de production de programmes.
7
DE PROGRAMMES
8554
La chaîne de production de programmes est présentée sur la figure 2.5.
6787
L’éditeur de texte est un logiciel interactif permettant de saisir du texte à partir
d’un clavier et de le stocker dans un fichier – le programme source –, sur un support
.69:1
.245
Algorithme
.154
Éditeur
:160
Programme source
langage évolué
9221
Compilateur
8885
Compilateur
558:
Langage d’assemblage
0494
Assembleur
:211
Programme objet
mémoire
STA
langage machine
centrale
m:RU
Programme translatable
langage machine
Programme translaté
r
chola
langage machine
Chargeur
nal.s
7
8554
2.4 UN EXEMPLE
6787
Considérons que nous souhaitions écrire un programme qui permet le calcul du péri-
.69:1
mètre ou de la surface soit d’un cercle de rayon r, soit d’un carré de côté a, soit d’un
rectangle de côtés a et b, soit d’un triangle équilatéral de côté a et de hauteur h. La
.245
première étape consiste donc à écrire un algorithme correspondant à ce programme,
c’est-à-dire à donner une solution possible au problème. Dans une analyse basée sur
.154
l’utilisation finale d’un langage procédural tel que C par exemple, la solution va
s’attacher à identifier les fonctions à réaliser : ici, par exemple, nous pouvons identi-
:160
L’algorithme suivant pourra être écrit par exemple pour la fonction périmètre :
fonction périmètre :
:211
cercle)
STA
cas objet :
triangle : retourner (3 × a);
cercle : retourner (2 × π × r);
r
chola
fin cas;
natio
inter
32 2 • Du problème au programme machine
fin
Qui se traduit par exemple en langage C par le programme suivant :
#define triangle 1
#define cercle 2
#define carre 3
#define rectangle 4
int perimetre (objet, a, r, h, b)
int objet, a, b, h, r;
{
switch (objet) {
case 1 : return (3 * a);
case 2 : return (2 * π * r);
7
8554
case 3 : return (4 * a);
case 4 : return (2 * a + 2 * b);}
6787
}
.69:1
Dans une analyse basée sur l’utilisation finale d’un langage objet tel que C++ par
exemple, la solution va s’attacher à identifier les objets concernés : ici, par exemple,
nous identifierons 4 objets, le cercle, le triangle, le carré et le rectangle, chacun étant
.245
associé à deux méthodes, la méthode perimetre et la méthode surface qui
.154
lorsqu’elles sont appelées rendent respectivement le périmètre ou la surface de
l’objet concerné. Le carré et le rectangle sont quant à eux tous les deux des quadrila-
:160
Dans cette analyse, nous allons définir une classe quadrilatere, une classe
cercle et une classe triangle. Une classe définit une collection d’objets qui parta-
8885
gent les mêmes propriétés et sur lesquels les mêmes traitements peuvent être
exécutés. Nous créons ensuite deux objets carre et rectangle, instances de la
558:
7
8554
int quadrilatere :: perimetre (void)
{
return (2 * a + 2 * b);
6787
}
.69:1
int quadrilatere :: surface (void)
{
.245
return (a * b);
}
int main()
.154
{
:160
surfacec = carre.surface();
perimetrec = carre.perimetre();
558:
surfacer = rectangle.surface();
perimetrer = rectangle.perimetre();
0494
}
:211
© Dunod – Toute reproduction non autorisée est un délit.
2.5 CONCLUSION
STA
7
8554
6787
.69:1
.245
.154
:160
9221
8885
558:
0494
:211
STA
m:RU
o
vox.c
r
chola
nal.s
natio
inter
Chapitre 3
La chaîne de production
7
de programmes
8554
3
6787
.69:1
.245
.154
La chaîne de production de programmes désigne le processus permettant la création
:160
d’un programme exécutable placé en mémoire centrale à partir d’un programme dit
9221
prog.c
Éditeur de texte source Compilateur
0494
prog.o
:211
objet
STA
Bibliothèques
Éditeur de liens
m:RU
prog.exe
o
programme exécutable
vox.c
prog.exe
chola
Nous abordons ensuite le fonctionnement d’un outil très courant pour simplifier la
construction d’un programme exécutable à partir de plusieurs modules sources :
l’utilitaire Make.
3.1 LA COMPILATION
La compilation constitue la première étape de la chaîne de production de programmes.
Elle permet la traduction d’un programme dit programme source écrit le plus souvent
en langage de haut niveau vers un programme dit programme objet qui est soit direc-
tement le langage machine, soit le langage d’assemblage. Le programme objet est
stocké sur le disque.
7
Le compilateur est une application. C’est un logiciel dépendant de la machine
8554
physique vers laquelle il doit produire le langage. Ainsi un programme compilé sur
une machine A ne s’exécutera pas forcément sur une machine B, notamment si B est
6787
différente physiquement de A.
.69:1
Exemple
La compilation d’un programme écrit en langage C s’obtient en tapant la commande
.245
cc – o prog.c et produit un fichier objet de nom prog.o. De même la compilation d’un
.154
programme écrit en Fortran s’obtient en tapant la commande xlf – c fichier.f et
produit un fichier objet fichier.o.
:160
du sens) ;
– l’optimisation et la génération du code objet.
:211
STA
définir la structure d’un langage haut niveau. La définition d’un langage de haut niveau
vox.c
s’appuie sur :
– un alphabet : c’est l’ensemble des symboles élémentaires disponibles dans le langage
r
chola
élémentaires admis par le langage dont la structure est donnée par une grammaire;
natio
inter
3.1 • La compilation 37
– des phrases ou instructions : une phrase est un groupe de lexèmes du langage dont
la structure est elle aussi donnée par une grammaire. Cette structure peut être décrite
par un arbre qualifié d’arbre syntaxique.
Par exemple, A1 est un mot du langage composé des symboles élémentaires A et 1.
A1 = 3; constitue une phrase du langage.
Finalement, un programme est constitué comme étant une suite de phrases du
langage, chacune des phrases respectant une syntaxe donnée par la grammaire asso-
ciée au langage. Formellement, une grammaire est définie par :
– un ensemble de symboles terminaux qui sont les symboles élémentaires admis dans
le langage (exemples : DEBUT, FIN, *, + , = , …);
– un ensemble de symboles non terminaux (exemples : < nombre >, < terme >, …);
7
– un ensemble de règles syntaxiques encore appelées productions (exemple :
8554
< nombre > :: = < chiffre > | < nombre > < chiffre >).
Pour décrire la syntaxe d’un langage et spécifier les règles de production de la
6787
grammaire associée, on utilise couramment la notation dite notation de Backus-Naur
ou BNF (Backus-Naur Form), développée à l’origine pour décrire la syntaxe du
.69:1
langage Algol 60. Avec ce formalisme, une règle de production s’écrit :
< objet_1 du langage > :: = < objet_2 du langage > | < objet_3 du langage >
.245
et décrit la syntaxe de l’objet_1 du langage comme étant soit l’objet_2 du langage,
soit l’objet_3 du langage. « | » code l’alternative et « :: = » sépare un objet de sa
.154
description.
:160
Exemple
9221
STA
Un exemple
Les règles de Backus-Naur suivantes permettent la description d’un langage de
m:RU
➥ d’affectations> FIN
<suite de déclarations> :: = <déclaration> | <déclaration> <suite
nal.s
➥ de déclarations>
natio
inter
38 3 • La chaîne de production de programmes
7
8554
Ainsi, la première règle spécifie que l’objet programme est construit à partir du
symbole terminal PROGRAM suivi d’un objet <identificateur> et d’un objet <corps
6787
de programme>. Un objet <identificateur> est lui-même décrit comme étant
composé soit d’une lettre seule, soit d’une lettre suivie d’un chiffre. Les lettres
.69:1
admises sont les 26 lettres majuscules de l’alphabet et les chiffres admis sont les
chiffres allant de 0 à 9. L’objet <corps de programme> est par ailleurs défini
.245
comme étant un objet <suite de déclarations> suivi du symbole terminal DEBUT,
suivi d’un objet <suite d’affectations> suivi du symbole FIN. Et ainsi de suite…
.154
Le programme Z suivant a été écrit en respectant la syntaxe dictée par ces
règles.
:160
PROGRAM Z
9221
INT A;
INT B;
8885
INT C2;
DEBUT
558:
A = 4;
0494
B = A / 2;
C2 = B + A;
:211
FIN
STA
reconnaît dans cette suite de caractères les lexèmes du langage en s’appuyant sur les
règles de Backus Naur les définissant. Par ailleurs, l’analyseur lexical élimine les
r
espaces non significatifs et les commentaires qui n’ont pas de signification propre.
chola
Pour rendre plus aisées les étapes ultérieures, il traduit les lexèmes reconnus qui
constituent des chaînes de caractères en symboles plus aisément manipulables, par
nal.s
exemple en entiers.
natio
inter
3.1 • La compilation 39
Lexèmes
P
r Suite Suite
o
g de caractères de symboles
r Analyseur lexical
a
m
m
e
7
8554
Ainsi, les lexèmes du langage L_exemple peuvent être codés sur l’ensemble Z des
6787
nombres entiers positifs, négatifs ou nuls en appliquant les règles suivantes :
cas (type_lexème reconnu) :
.69:1
entier : codage_lexème = valeur de l’entier;
symbole + : codage_lexème = – 1;
.245
symbole – : codage_lexème = – 2;
symbole * : codage_lexème = – 3; .154
symbole / : codage_lexème = – 4;
symbole = : codage_lexème = – 5;
:160
symbole ; : codage_lexème = – 6;
9221
➥ 26 (chiffre + 1));
fin cas;
:211
© Dunod – Toute reproduction non autorisée est un délit.
– un identificateur reçoit une valeur dans l’ensemble [– 296, – 11] : en effet, l’iden-
tificateur A est codé par la valeur – 11 tandis que l’identificateur Z9 est codé par
o
– 6 (;), – 9 (FIN).
natio
inter
40 3 • La chaîne de production de programmes
7
L’analyseur syntaxique (figure 3.3) analyse la suite de symboles issus de l’analyseur
8554
lexical et vérifie si cette suite de symboles est conforme à la syntaxe du langage telle
qu’elle est définie par les règles de Backus-Naur. Pour cela, l’analyseur syntaxique
6787
essaye de construire l’arbre syntaxique correspondant au programme. Dans cet arbre,
les feuilles correspondent aux symboles issus de l’analyse lexicale et les nœuds inter-
.69:1
médiaires correspondent aux objets grammaticaux. Si l’analyseur syntaxique ne
parvient pas à construire l’arbre syntaxique du programme compilé, alors cela traduit
.245
le fait que la syntaxe du programme est erronée.
.154
BNF
:160
A
n l
9221
Suite Arbres
a e
l x de symboles syntaxiques
y i Analyseur syntaxique
8885
s c
e a
u l
558:
r
0494
Erreurs de syntaxe
L’arbre syntaxique est construit par application successive des règles de Backus-
Naur définissant la syntaxe du langage, à l’ensemble des symboles issus de l’analyse
m:RU
lexicale. Cette construction se poursuit soit jusqu’à ce que le dernier symbole ait été
pris en compte avec succès (la syntaxe est correcte), soit jusqu’à ce qu’il ne soit plus
o
étant équivalente à la suite : – 17 (G) 5 (5) – 5 (=) 2 (2) – 6 (;). L’arbre syntaxique
natio
inter
3.1 • La compilation 41
PROGRAM Z – 7 – 36
INT A ; – 10 – 11 – 6
INT B ; – 10 – 12 – 6
INT C2 ; – 10 – 91 – 6
<programme>
DEBUT –8
A=4; – 11 – 5 – 4 – 6
B=4/2; – 12 – 5 – 11 – 4 – 2 – 6
C2 = B + A ; – 91 – 5 – 12 – 1 – 11 – 6
PROGRAM <identificateur> FIN –9
(– 7) Z (– 36)
<corps de programme>
FIN
7
(– 9)
8554
<suite de déclarations>
6787
DEBUT
(– 8)
.69:1
<suite d’affectations>
<declaration>
.245
<suite de déclarations>
INT ; <affectation> <suite d’affectations>
(– 10) (– 6) .154
;
(– 6)
:160
(– 5)
<suite de déclarations> <affectation>
8885
<entier>
<declaration> 4 (4) ;
558:
= (– 6)
INT ; <declaration> (– 5)
0494
(– 10) (– 6) <identificateur>
INT ; C2 (– 91) <terme>
<identificateur>
:211
(– 10) (– 6) <operateur>
© Dunod – Toute reproduction non autorisée est un délit.
B (– 12)
<identificateur>
STA
<identificateur> <affectation>
B (– 12)
C2 (– 91)
m:RU
+ <terme>
<identificateur> = <terme> <operateur> <terme> ; (– 1)
B (– 12) (– 5) (– 6)
o
vox.c
/
(– 4)
r
chola
correspondant à une telle phrase ne peut pas être construit. En effet, la règle de
production relative à un objet de type affectation échoue sur le deuxième
symbole. En effet, le symbole « 5 » est rencontré à la place du symbole « = ». Une
erreur syntaxique est donc levée (figure 3.5).
G 5 = 2 ; – 17 5 – 5 2 – 6
<corps de programme>
7
8554
<affectation>
6787
<identificateur> =
.69:1
G (– 17) (– 5) ?
NON => erreur
.245
Figure 3.5 Arbre syntaxique impossible à construire sur l’analyse de G 5 = 2.
.154
:160
begin
A : = 5;
B : = A/2;
for (i = 1 to 5)
loop
tab(i) : = B + i;
end loop;
end;
L’analyseur sémantique signale dans ce programme deux erreurs sémantiques dues
à des incohérences de type :
– le résultat de l’opération A/2 donne un résultat qui est de type réel alors que la
variable B est déclarée de type entier;
7
8554
– la variable i qui permet de parcourir l’ensemble des cases du tableau tab dans la
boucle est de type réel.
6787
procedure prog_ada is
float B;— variable B de type réel
.69:1
integer A, i;— variables A et i de type entier
tab : array(1.5) of float;— tableau de 5 réels
.245
begin
A : = 5;
.154
B : = A/2;
for (i = 1 to 5)
:160
loop
tab(i) : = B + i;
9221
end loop;
end;
8885
encore problème car elle amène à additionner entre elles une variable de type entier (i)
avec une variable de type réel (B). Dans ce dernier cas, le compilateur peut insérer de
0494
lui-même un ordre de conversion de la variable i du type entier vers réel, comme l’expli-
cite l’exemple suivant.
:211
© Dunod – Toute reproduction non autorisée est un délit.
procedure prog_ada is
float B;— variable i de type réel
STA
B : = A / 2;
for (i = 1 to 5)
r
loop
chola
tab(i) : = B + (entierversreel)i;
end loop;
nal.s
end;
natio
inter