Architecture des ordinateurs et machines
Architecture des ordinateurs et machines
28 janvier 2020
Résumé
Cet article est une présentation de ce qu’on appelle communément
l’architecture des ordinateurs en Informatique. Il est destiné aux étu-
diants de niveau Licence ou Master en Informatique, notamment à
ceux préparant un CAPES d’informatique, comme aux enseignants
du secondaire qui souhaitent accompagner l’apparition de la discipline
Informatique au lycée. Il suit un plan en 5 parties :
— La genèse des ordinateurs où l’on introduit progressivement et
en suivant la voie historique les étapes qui ont conduit aux fon-
dements de l’architecture que l’on connaît actuellement
— L’architecture de base des ordinateurs en exposant les grands
principes communs à toutes les réalisations
— La présentation d’un Ordinateur Réduit Facile Évolutif Universel
(que nous appelons ORFEU) illustrant ce type d’architecture et
son langage d’assemblage (LAMOR). Cet ordinateur et ce lan-
gage pouvant également servir de base à l’élaboration de séances
d’enseignement.
— Quelques extensions facilitant la programmation d’un ordinateur
de base
— Les architectures évoluées du processeur et des mémoires
Il est suivi d’une brève conclusion et de quelques annexes
1
1.1 Étymologie . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 Quelques définitions . . . . . . . . . . . . . . . . . . . 5
1.3 Bref historique . . . . . . . . . . . . . . . . . . . . . . 6
1.4 Les premières machines à calculer mécaniques . . . . . 7
1.5 L’introduction de la mémoire . . . . . . . . . . . . . . 8
1.6 Le codage binaire . . . . . . . . . . . . . . . . . . . . . 8
1.7 Le calcul logique . . . . . . . . . . . . . . . . . . . . . 9
1.8 La programmation . . . . . . . . . . . . . . . . . . . . 10
1.9 Les machines électromécaniques . . . . . . . . . . . . . 12
1.10 L’ordinateur : machine électronique universelle . . . . 13
1.11 Le microordinateur . . . . . . . . . . . . . . . . . . . . 14
1.12 L’ordinateur quantique . . . . . . . . . . . . . . . . . . 15
3 ORFEU 27
3.1 L’unité arithmétique et logique . . . . . . . . . . . . . 27
3.2 La mémoire . . . . . . . . . . . . . . . . . . . . . . . . 28
3.3 Les instructions . . . . . . . . . . . . . . . . . . . . . . 28
3.4 Un exemple de programme ORFEU . . . . . . . . . . . 29
3.5 LAMOR . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.5.1 Codes opération symboliques . . . . . . . . . . 32
3.5.2 Étiquettes et identificateurs symboliques d’un
opérande . . . . . . . . . . . . . . . . . . . . . 33
3.5.3 Un exemple de programme LAMOR . . . . . . 33
3.6 Dix exemples de programmes LAMOR . . . . . . . . . 34
2
4.3.4 Composition de modes d’adressage . . . . . . . 42
4.4 Pile d’exécution . . . . . . . . . . . . . . . . . . . . . . 43
4.4.1 Sous-programmes . . . . . . . . . . . . . . . . . 43
4.4.2 Coroutines . . . . . . . . . . . . . . . . . . . . 44
4.5 Interruptions . . . . . . . . . . . . . . . . . . . . . . . 44
4.6 Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . 45
4.7 Modes et sécurité . . . . . . . . . . . . . . . . . . . . . 46
5 Architectures évoluées 47
5.1 Le processeur . . . . . . . . . . . . . . . . . . . . . . . 47
5.1.1 Microprogrammation . . . . . . . . . . . . . . . 47
5.1.2 Jeu réduit d’instructions . . . . . . . . . . . . . 48
5.1.3 Ensemble d’UAL spécialisées . . . . . . . . . . 48
5.1.4 Chaînes de calcul . . . . . . . . . . . . . . . . . 48
5.1.5 Architectures multicœurs . . . . . . . . . . . . 49
5.1.6 Architectures parallèles . . . . . . . . . . . . . 49
5.2 Les Mémoires . . . . . . . . . . . . . . . . . . . . . . . 51
5.2.1 L’antémémoire . . . . . . . . . . . . . . . . . . 52
5.2.2 La mémoire centrale . . . . . . . . . . . . . . . 52
5.2.3 La mémoire morte . . . . . . . . . . . . . . . . 53
5.2.4 Les mémoires de masse . . . . . . . . . . . . . . 54
5.2.5 Organisation des informations . . . . . . . . . . 54
5.2.6 La mémoire virtuelle . . . . . . . . . . . . . . . 56
6 Conclusion 59
ANNEXES 60
3
8 Exemples de programmes 68
8.1 Expression arithmétique . . . . . . . . . . . . . . . . . 68
8.2 Instruction conditionnelle . . . . . . . . . . . . . . . . 68
8.3 Instruction alternative . . . . . . . . . . . . . . . . . . 69
8.4 Itération . . . . . . . . . . . . . . . . . . . . . . . . . . 69
8.5 Algorithme d’Ahmès . . . . . . . . . . . . . . . . . . . 70
8.6 Adressage indexé . . . . . . . . . . . . . . . . . . . . . 70
8.7 Appel et retour de sous programme . . . . . . . . . . . 71
8.8 Adressage indirect et pointeurs . . . . . . . . . . . . . 72
8.9 Pile . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
8.10 Sous programme récursif . . . . . . . . . . . . . . . . . 74
9 La grammaire de LAMOR 76
9.1 La Forme de Backus-Naur (BNF) . . . . . . . . . . . . 76
9.2 L’automate . . . . . . . . . . . . . . . . . . . . . . . . 78
10 ORFEU et la calculabilité 78
10.1 Modèles de calcul . . . . . . . . . . . . . . . . . . . . . 79
10.2 Réduction du jeu d’instructions . . . . . . . . . . . . . 80
10.2.1 Instructions de contrôle de séquence . . . . . . 80
10.2.2 Instructions arithmétiques . . . . . . . . . . . . 81
10.2.3 Instructions logiques . . . . . . . . . . . . . . . 82
10.2.4 Instruction de décalage arithmétique . . . . . . 83
10.2.5 Conclusion . . . . . . . . . . . . . . . . . . . . 84
1 La genèse
1.1 Étymologie
Le Dictionnaire historique de la langue française 1 précise que le
mot Ordinateur fut d’abord employé pour « celui qui institue (en par-
lant du Christ) ». Entre le XIe et le XVIIe siècle, il désigne celui qui
est chargé de « régler les affaires publiques », puis au XIXe siècle, «
celui qui met de l’ordre ».
De son côté, le Dictionnaire des sciences 2 dirigé par Michel Serres
et Nayla Farouki évoque « un vieux mot de latin d’église qui désignait,
dans le rituel chrétien, celui qui procède à des ordinations et règle le
cérémonial ».
1. Dictionnaire historique de la langue française 2 volumes - NE - Alain Rey - 2016 -Le
Robert
2. Le Trésor : dictionnaire des sciences - Michel Serres, Nayla Farouki - 1997 - Flam-
marion
4
C’est l’idée de mise en ordre qui semble prévaloir. Ordinateur appa-
raît dans les dictionnaires du XIXe siècle comme synonyme peu usuel
de ordonnateur : celui qui met en ordre.
Le sens nouveau a été proposé par le professeur de philologie Jacques
Perret dans une lettre datée du 16 avril 1955 en réponse à une demande
de François Girard, responsable du service de publicité d’IBM France,
dont les dirigeants estimaient le mot calculateur (computer ) bien trop
restrictif en regard des possibilités de ces machines.
C’est un exemple très rare de la création d’un néologisme authen-
tifiée par une lettre manuscrite et datée (cf. Figure 1 Lettre de Jacques
Perret à François Girard (1955) page 5)
5
exécutant les instructions d’un ensemble structuré de pro-
grammes, le traitement rapide de données codées sous forme
numérique qui peuvent être conservées et transmises. »
Dictionnaire Larousse 4
Wikipedia 5
Dictionnaire Reverso 6
6
— L’introduction de la mémoire
— Le codage binaire
— Le calcul logique
— La programmation
— Les machines électromécaniques
— L’ordinateur : machine électronique universelle
— Le micro-ordinateur
— L’ordinateur quantique
7
Figure 3: Machine à calculer numérique
8
Figure 5: Introduction de la mémoire
8. [Link]
9. [Link]
10. [Link]
11. [Link]
12. [Link]
9
Figure 6: Introduction du calcul logique
1.8 La programmation
Même en mémorisant les résultats intermédiaires dans la machine
à calculer, la suite des calculs doit néanmoins être mémorisée indépen-
damment.
L’étape suivante est d’une importance capitale : elle va consister à
introduire un nouvel élément qui va se charger de l’enchaînement au-
tomatique de la suite des calculs intermédiaires : l’unité de commande.
La mémoire va alors jouer un nouveau rôle : non seulement elle en-
registre les résultat des calculs intermédiaires mais elle va aussi devoir
enregistrer la suite des opérations à effectuer.
Cette suite d’opérations va être codée de façon à ce que l’unité de
commande puisse les réaliser.
C’est la naissance de la programmation.
C’est en 1834, que Charles Babbage 13 pendant le développement
d’une machine à calculer destinée au calcul et à l’impression de tables
mathématiques (machine à différences) eut l’idée d’y incorporer des
cartes du métier Jacquard, dont la lecture séquentielle donnerait des
instructions et des données à sa machine.
Par la suite il conçut une machine plus générale : la machine analy-
tique 14 (Figure 7, page 11) qu’il ne put jamais réaliser faute de crédits,
mais il passera le reste de sa vie à la concevoir dans les moindres dé-
tails et à en construire un prototype. Un de ses fils en construira l’unité
centrale (appelée le moulin) et l’imprimante en 1888 et fit une démons-
tration réussie de calcul de tables à l’académie royale d’astronomie en
1908.
10
Figure 7: La machine analytique (1871)
11
Un nouveau schéma voit alors le jour, qui va servir de modèle à
tous les développements ultérieurs (Figure 8, page 12).
Figure 8: L’ordinateur
12
1.10 L’ordinateur : machine électronique uni-
verselle
L’apparition de l’électronique va conduire à un développement spec-
taculaire, non sur le plan des principes, mais sur celui de la technologie ;
l’ensemble des calculs pouvant être effectués par ces machines s’étend
au fur et à mesure de la croissance de leur complexité. La question
posée est alors celle-ci : peut on perfectionner les machines à calculer
au point de pouvoir TOUT calculer avec elles ? C’est à cette question
nouvelle et essentielle que vont répondre, la même année (1936) deux
chercheurs : l’anglais Alan Turing 22 et l’américain Alonzo Church 23
son directeur de thèse à l’université de Princeton 24 .
La réponse tient en deux propositions simples :
1. On peut montrer qu’il existe des nombres et des fonctions NON
calculables.
2. Il est possible de construire des machines calculant TOUT ce
qui est calculable et ces machines ont toutes une puissance de
calcul équivalente 25 : cette proposition est une thèse – appelée «
thèse de Church-Turing » 26 – qui ne peut être démontrée, dans
la mesure où on ne peut pas prouver la non existence de machines
de puissance supérieure.
Le premier ordinateur fonctionnant en langage binaire fut le Co-
lossus 27 , conçu lors de la Seconde Guerre Mondiale ; il n’était pas
Turing-complet bien qu’Alan Turing ait travaillé au projet. À la fin de
la guerre, il fut démonté et caché à cause de son importance straté-
gique.
L’ENIAC 28 , mis en service en 1946, est le premier ordinateur en-
tièrement électronique construit pour être Turing-complet.
Pendant ce projet (en juin 1945 un an avant la démonstration de
l’ENIAC) est publié un article fondateur : First Draft of a Report on
the EDVAC 29 par John von Neumann donnant les bases de l’architec-
ture utilisée dans la quasi totalité des ordinateurs depuis lors. Dans
22. [Link]
23. [Link]
24. [Link]
25. Dans le sens où toute fonction calculable par l’une est calculable par les autres.
On qualifie alors ces machines de «Turing-complète» ([Link]
Turing-complet).
26. [Link]
27. [Link]
28. [Link]
29. [Link]
13
cet article Von Neumann veut concevoir un programme enregistré et
programmé dans la machine.
La première machine correspondant à cette architecture, dite de-
puis architecture de von Neumann, ne fut pas l’EDVAC 30 (Figure 9,
page 14) qui ne sera livré qu’en Aout 1949, mais une machine expé-
rimentale la Small-Scale Experimental Machine (SSEM ou "baby")
construite à Manchester en juillet 1948 31 .
Il est intéressant de noter que l’ENIAC fut conçue à l’IAS 32 contre
l’avis entre autres d’Albert Einstein et de Kurt Gödel, ces deux émi-
nents membres de l’institut considérant que cette coûteuse réalisa-
tion n’apporterait aucune contribution à la science 33 . L’obstination
de John von Neumann puisa son énergie dans un anticommunisme
fortement encouragé par le gouvernement américain, en pleine période
de guère froide, son principal argument en faveur de la construction de
la machine étant de gagner la course engagée entre russes et américains
pour la fabrication de la future arme nucléaire.
1.11 Le microordinateur
L’ENIAC et ses successeurs étaient fabriqués avec des circuits élec-
troniques à base de lampes à vide, de taille importante, à forte consom-
mation d’énergie et compte tenu de leur grand nombre le TMBF 34 de
30. [Link]
Computer
31. [Link]
32. [Link]
33. Le vrai paradis de Platon - John L. Casti - 2005 - Le Pommier
34. Temps Moyen de Bon Fonctionnement
14
l’ordinateur ne dépassait pas quelques heures.
Ce type d’ordinateur constitue ce qu’on appelle généralement la
première génération (1946-1956).
L’arrivée du transistor en 1947 va considérablement modifier la donne.
Tout comme les lampes à vide il va se comporter comme un inter-
rupteur, mais à moindres coût, taille et consommation d’énergie. Les
ordinateurs de ce type constituent la seconde génération (1956-1963).
D’abord utilisé comme simple composant sur des circuits imprimés
dans les années 60, il va se miniaturiser pour se fondre au sein de
circuits intégrés (dont le premier fut conçu en 1958) de taille de plus
en plus réduite au point d’être appelé « puce électronique ». Au début,
ce sont les mémoires qui constituent les premières puces. Elles sont
d’abord utilisées au sein de mécanismes électroniques classiques.
Ces ordinateurs constituent la troisième génération (1963-1971).
Puis, ce sera au tour de l’unité arithmétique et logique et de l’unité
de commande de se fondre dans un circuit intégré qu’on appellera le
microprocesseur dont le premier exemplaire fut créé en 1971 par la
société Intel.
Enfin l’intégration de cet ensemble et des composants permettant
de lui connecter des dispositifs d’entrée et de sortie dans un seul boîtier
donnera naissance au microordinateur (Figure 10, page 16).
La question de savoir qui a créé le premier micro-ordinateur est
source de controverse et dépend du degré d’intégration choisi. Selon
certaines sources la première machine vendue toute assemblée prête
à l’emploi, serait le Micral 35 conçu en 1972 par l’entreprise française
R2E 36 (Figure 11, page 17).
Il s’agit d’un des tous premiers ordinateurs de la quatrième géné-
ration (depuis 1971).
15
Figure 10: Le microordinateur
16
Figure 11: Le Micral (1972)
40. [Link]
41. [Link]
17
Figure 12: Prototype d’ordinateur quantique
Osons un parallèle
Tout comme le cycle de Carnot 43 fut le premier modèle des mo-
teurs à explosion, la machine de Turing fut le premier modèle des
ordinateurs.
Tout comme le cycle de Carnot a donné naissance au modèle
des moteurs à explosion actuels, (via le cycle de Beau de Rochas
pour les moteurs à essence 44 et au cycle Diesel 45 pour les moteurs
... Diesel), l’architecture de Von Neumann a donné naissance au
modèle des ordinateurs actuels.
Aujourd’hui, malgré toutes les avancées techniques indéniables,
ces modèles sont toujours d’actualité !
42. en 2020
18
On retiendra les composants suivants :
2.2 La mémoire
Elle est composée de cellules.
Une cellule est référencé par son adresse, qui est en général un
entier représentant le rang de son emplacement dans la mémoire. Il
en résulte qu’il est assez naturel d’organiser l’ensemble de ces cellules
comme un grand tableau. Si l’on désigne par M le nom de ce tableau,
l’adresse X d’une cellule peut être vue comme l’indice de cette cellule
dans le tableau M (cf. Figure 13 La mémoire page 21).
M[X] est alors l’identifiant de cette cellule dans ce tableau.
Par la suite on utilisera la notation abrégée [X] pour désigner cet
identifiant.
Les registres
Il s’agit de cellules distinguées qui jouent un rôle dédié et auxquelles
on attribue un nom. il n’y a pas de désignation d’adresse.
19
Ces cellules sont généralement intégrées au sein de composants tels
que l’Unité Arithmétique et Logique et l’Unité de Commande 46 .
Opérations de transfert
Lors de l’exécution d’une instruction, des opérations de transfert
entre cellules de mémoire et registres doivent être effectués.
On notera ces transferts par l’opérateur "←" de façon analogue à
une affectation.
A ← B signifie donc que la valeur de B est transférée vers la cellule
(mémoire ou registre) identifiée par A.
B est une expression arithmétique simple comprenant des identi-
fiants de cellules, des valeurs numériques et des opérateurs simples.
Si C est l’identifiant d’une cellule figurant dans l’expression B, la
valeur de C est la valeur contenue dans cette cellule.
Exemples :
20
Adresses Cellules
000... 000
000... 001
000... 010
000... 011
000... 100
000... 101
.........
.........
111... 010
111... 011
111... 100
111... 101
111... 110
111... 111
21
Figure 14: L’unité arithmétique et logique
22
2.4.1 Description
23
2.4.2 Fonctionnement
L’unité de commande orchestre l’exécution d’un programme en ré-
pétant indéfiniment les trois étapes ci-dessous :
répéter
1. RI ← [CO] : chargement dans le registre d’instruction RI du contenu
de la cellule désignée par le compteur ordinal CO.
2. CO ← CO + 1 : incrémentation du compteur ordinal
3. Exécution de l’instruction située dans le registre d’instructions : cf.
subsubsection 2.5.2 Exécution page 25
24
2.5 Les instructions
2.5.1 Constitution
Une instruction est stockée dans une cellule de mémoire.
Elle est constituée de 2 champs :
— un code opération noté OP qui indique quelle opération doit être
effectuée ;
— une adresse notée AD désignant l’opérande de cette opération.
On peut en distinguer plusieurs types :
— les instructions élémentaires, comprenant elles-mêmes :
— les instructions de transfert entre la mémoire et l’accumula-
teur de l’UAL : chargement et stockage ;
— les instructions effectuant des calculs arithmétiques et lo-
giques.
— les instructions de contrôle de séquence, permettant de réaliser
les instructions conditionnelles et répétitives
On conçoit que, pour chacune de ces catégories, une instruction doit
être d’une extrême simplicité et ne peut agir que sur un seul argument,
appelé ici un opérande.
2.5.2 Exécution
L’instruction est contenue dans le registre d’instruction RI.
Son exécution se déroule ainsi (cf. Figure 17 Exécution d’une ins-
truction page 26) :
Instructions de transfert
Instruction de chargement
Instruction de stockage
25
Figure 17: Exécution d’une instruction
26
Cette valeur est transférée dans le compteur ordinal : CO ← AD
3 ORFEU
ORFEU est un Ordinateur Réduit Facile Extensible Universel.
Il est conçu selon l’architecture fondamentale de Von Neumann,
décrite précédemment.
Il servira de guide pour illustrer précisément cette architecture en
la concrétisant par des exemples commentés de programmes mettant
en œuvre des algorithmes conçus selon divers paradigmes : program-
mation impérative, objets et récursive.
27
Les opérations booléennes agissent sur l’ensemble des bits d’une
cellule 51 .
3.2 La mémoire
La taille des cellules est de 16 bits (ou 2 octets).
La taille de la mémoire est de 4096 cellules.
L’adresse d’une cellule est un nombre entier compris entre 0 et
4095.
Le champ d’adressage est donc de 12 bits.
Le jeu d’instructions
COP AD Commentaire Exécution
Instructions logiques
28
1001 X Ou logique ACC ← ACC ∨ [X]
1010 X Ou exclusif ACC ← ACC ⊕ [X]
1011 X Décalage arithmétique ACC ← (ACC × 2[X] ) mod 216
Autres
Remarques :
— dans les instructions de contrôle de séquence, c’est la valeur de
l’adresse X, désignant la cellule de mémoire [X], qui est chargée
dans le compteur ordinal ;
— dans les instructions de transfert et les instructions arithmétiques
et logiques, [X] identifie la cellule d’adresse X. En partie gauche
d’une affectation (instruction STO) il s’agit du nom de cette cel-
lule. En partie droite il s’agit de sa valeur (contenu) ;
— l’instruction de décalage arithmétique est définie précisément ici 52 ;
— au démarrage d’un programme ORFEU, le compteur ordinal CO
est initialisé à 0. Cela signifie que la première instruction à exé-
cuter est contenue dans la cellule d’adresse 0.
Adresse Contenu
000000000000 0001000000000110
000000000001 0000000000110010
29
000000000010 0000000001000000
000000000011 0000000000000000
000000000100 0000000000000001
000000000101 1111111111111111
000000000110 0000000000000001
000000000111 0011000000010100
000000001000 1000000000000100
000000001001 0011000000001101
000000001010 0100000000000011
000000001011 0110000000000010
000000001100 0101000000000011
000000001101 0100000000000001
000000001110 1011000000000101
000000001111 0101000000000001
000000010000 0100000000000010
000000010001 1011000000000100
000000010010 0101000000000010
000000010011 0001000000000110
000000010100 0000000000000000
Adresse Contenu
1 50
2 64
3 0
4 1
5 -1
30
décimal) sur une instruction d’arrêt de l’ordinateur.
3.5 LAMOR
D’une façon générale, la conception d’un programme destiné à un
ordinateur se fait par l’intermédiaire d’un langage de programmation.
Ce langage est dit de haut niveau 53 s’il est capable de décrire un
programme destiné à une très large variété d’ordinateurs, indépendam-
ment de leur architecture et notamment de leur jeu d’instructions.
À l’inverse, si ce langage est destiné à l’écriture d’un programme
pour un ordinateur particulier, pour un jeu d’instructions bien défini,
il est appelé langage d’assemblage 54 .
31
La traduction d’un programme LAMOR vers une image mémoire
d’ORFEU peut se faire aisément à la main ou plus aisément à l’aide
d’un programme appelé un assembleur.
32
Table 4: Codes Opération
SIN DEBUT
X 50
Y 64
Z 0
UN 1
MUN −1
DEBUT CHA X
SSZ FIN # Tant−Que [X] ! = 0
ETL UN
SSZ SUITE # s i [X] p a i r s a u t e r à SUITE
CHA Z
ADD Y
STO Z # [ Z ] <−− [ Z ] + [Y]
SUITE CHA X
DAR MUN
STO X # [X] <−− [X] / 2
CHA Y
DAR UN
STO Y # [Y] <−− [Y] ∗ 2
SIN DEBUT # f i n du Tant−Que
FIN NOP 0
La table des adresses de ce programme est donnée par la Table 5
page 34 : "Table des adresses"
Adresse Identificateur
33
000000000001 X
000000000010 Y
000000000011 Z
000000000100 UN
000000000101 MUN
000000000110 DEBUT
000000001101 SUITE
000000010100 FIN
34
Afin d’adresser successivement les éléments de ce tableau, on pro-
cède à un calcul d’instructions
— avant l’itération, la cellule DEBUT contient l’instruction CHA
T qui charge le premier élément du tableau, d’adresse T
— en cours d’itération cette cellule est chargée dans l’Accumulateur
et est donc considérée comme une donnée
— puis le contenu de l’Accumulateur est incrémenté de la valeur de
la cellule d’adresse I et devient donc CHA T+[I]
— cette valeur est stockée dans la cellule d’adresse INS considérée
alors comme une donnée
— enfin la cellule d’adresse INS est exécutée en tant qu’instruction :
CHA T+[I]
35
— le calcul de maximum de [X] et [Y]
— le retour du résultat dans l’accumulateur
— le retour du contrôle au programme principal
36
— un programme principal contenant une pile
— un sous programme empiler de type procédure
— un sous programme dépiler de type mixte (fonction et procédure)
Le programme principal :
— empile successivement au somment de la pile les contenu des cel-
lules [A] puis [B]
— dépile successivement le somment de pile vers les cellules [C] puis
[D]
57. [Link]
37
si n = 0
0
carré(n) =
carré(n − 1) + 2 × n − 1 sinon
Il est constitué de deux parties :
— un programme principal contenant une pile
— un sous programme récursif de type fonction effectuant le calcul
du carré
38
Or certains de ces mécanismes, tels que le parcours d’un tableau,
la réalisation de sous-programmes, la représentation des objets, et la
récursivité nécessitent des calculs d’instructions.
Cela signifie que le programme se modifie en cours d’exécution. En
conséquence, la simple lecture du programme initial (celui écrit par le
programmeur) ne permet pas de rendre compte de son exécution, ce
qui va à l’encontre d’une programmation bien structurée permettant
une lisibilité et une maintenance abordable.
Certes, peu d’applications sont aujourd’hui écrites directement en
langage d’assemblage et encore moins en langage machine. Cependant
c’est encore le cas pour l’écriture de parties les plus profondes des
systèmes d’exploitation (celles nécessitant la connaissance de la struc-
ture détaillée de l’ordinateur) et de protocoles de bas niveau pour les
réseaux .
Des mécanismes plus élaborés sont donc nécessaires pour parve-
nir à une meilleure structuration de ces applications. Certains né-
cessitent simplement l’ajout de registres et d’instructions supplémen-
taires. D’autres imposent de compléter le cycle d’instructions 59 .
Quant aux programmes écrits dans des langages de haut niveau,
leur compilation va se trouver grandement simplifiée grâce à ces ex-
tensions.
39
Si certaines situations peuvent être prévues avant l’exécution de
l’instruction (division par 0), d’autres, comme le dépassement de ca-
pacité ne sont détectables qu’après.
Ainsi, lors d’une addition Z = X + Y, le dépassement de capacité
se produit quand Z est de signe contraire à X + Y :
xn−1 = yn−1 6= zn−1
où n est la taille (nombre de bits) de l’accumulateur.
Pour éviter d’inclure systématiquement ces tests dans un programme,
avant ou après l’exécution d’une instruction, une sortie supplémentaire
est ajoutée à l’Unité Arithmétique et Logique, reliée à un registre ap-
pelé le code condition.
Ce registre de quelques bits renseigne sur des situations résultant
de l’exécution de la dernière instruction telles que :
— tentative de division par 0 ;
— dépassement de capacité.
Il peut ensuite être testé par des instructions ad hoc de sauts condi-
tionnels qui doivent donc faire partie du jeu d’instructions du proces-
seur, telles que :
— SSD X : saut à X en cas de tentative de division par 0 ;
— SSC X : saut à X en cas de dépassement de capacité.
4.3 Adressage
Plusieurs mécanismes d’adressage appelés des modes d’adressage
concourent à la simplification et à la lisibilité des programmes écrits
ou compilés en langage machine.
Ces mécanismes nécessitent :
— une extension du format des instructions
— l’adjonction de registres au sein de l’unité de commande
— une extension de l’algorithme du cycle d’instructions
Un nouveau champ est ajouté au format des instructions.
Il comporte des informations relatives à différents modes d’adres-
sage, qui peuvent être combinés entre eux.
On s’intéressera ici aux modes les plus courants :
— adressage indexé
— adressage basé
— adressage indirect
D’autres modes plus élaborés sont utilisés dans des architectures
plus évoluées ou au sein de processeurs spécialisés.
40
4.3.1 Adressage indexé
Un ou plusieurs registres d’index permettent d’adresser directement
un élément d’un tableau.
Pendant la phase de recherche de l’opérande, lors de l’exécution
d’une instruction 60 , son adresse est calculée en ajoutant au champ
AD du registre d’instruction RI la valeur contenue dans le registre
d’index spécifié dans le champ du mode d’adressage.
Ainsi, par exemple, le chargement dans l’accumulateur du contenu
d’une cellule désignée par l’adresse X et par le registre d’index RI2
produira :
ACC ← [X + RI2 ]
ce qui permet d’adresser directement la cellule du tableau [X] d’in-
dice RI2 .
Généralement la taille du champ d’un registre d’index (nombre de
bits) est la même que celle du champ d’adressage de la mémoire.
ACC ← [RB2 + X]
ce qui permet d’adresser directement la cellule désignée par [X]
contenant l’attribut de l’objet désigné par le registre de base RB2 .
La taille du champ d’un registre de base (nombre de bits) est tou-
jours identique à du champ d’adressage de la mémoire.
On remarquera que, finalement, le mode d’adressage basé fonc-
tionne de façon identique à celui de l’adressage indexé. C’est l’utilisa-
tion qui en est différente.
60. cf. subsubsection 2.5.2 page 25 : "Exécution"
61. cf. subsubsection 2.5.2 page 25 : "Exécution"
41
De plus, en combinant ces deux modes d’adressage, on peut accéder
directement à un élément d’un tableau attribut d’un objet.
ACC ← [[X]]
Autrement dit, c’est le contenu du contenu de la cellule désignée
par [X] qui est chargée dans l’accumulateur.
42
Figure 18: La pile d’exécution
4.4.1 Sous-programmes
Pour la réalisation de sous-programmes, on ajoute encore 2 instruc-
tions :
43
— APS (Appel de sous-programme) et
— RET (Retour de sous-programme).
L’adresse du sous-programme est désignée par ADR
4.4.2 Coroutines
Les coroutines 62 sont des suites d’instructions pouvant s’exécuter
en quasi-parallélisme. Elles constituent le mécanisme de base des fils
d’exécution (Threads) 63 , des processus 64 et d’une façon générale de la
programmation concurrente 65 .
Aucune nouvelle instruction n’est requise pour réaliser des corou-
tines. Il suffit de considérer que chaque coroutine possède sa propre
pile. La commutation de coroutines se résume donc à un simple chan-
gement de pile.
4.5 Interruptions
Le cycle d’instruction précédemment décrit 66 ne permet aucune
communication de ou vers des composants extérieurs. Ces composants
sont d’une part les dispositifs d’entrée, de sortie ou de stockage d’in-
formations, d’autre part des dispositifs particuliers tels qu’une horloge
permettant par exemple la commutation automatique de processus en
partage de temps ou bien la réalisation de programmes en temps réel.
62. [Link]
63. [Link]
64. [Link]
65. [Link]
66. cf. subsubsection 2.4.2 page 24 : "Fonctionnement"
44
Le mécanisme de base permettant la prise en compte d’événements
extérieurs est intimement lié au cycle d’instruction qui doit être modi-
fié dans ce but. C’est le mécanisme d’interruption 67 (sous entendu : de
programme). Pour cela on complète l’unité de commande d’un simple
bit d’interruption : INT dont la valeur vrai par exemple, indique qu’un
événement extérieur est intervenu (faux sinon). Et on réserve une
adresse en mémoire : AIT (par exemple l’adresse 0) pour contenir
le programme qui devra s’exécuter lors de l’arrivée d’un événement
extérieur.
Le cycle d’instructions se complète alors ainsi : Figure 19 page 45 : "Cycle
d’instructions avec interruptions".
répéter
si INT alors
PP ← PP + 1
[PP] ← CO
CO ← AIT
INT ← faux
RI ← [CO]
CO ← CO + 1
Exécution de l’instruction située dans le registre d’instructions
4.6 Exceptions
Il s’agit d’une extension de l’utilisation du mécanisme d’interrup-
tions. En effet, lors de l’exécution de certaines instructions, des situa-
tions particulières peuvent se produire telles que : dépassement de ca-
67. [Link]
68. [Link]
45
pacité lors d’une addition, division par 0, etc . . . Bien entendu, le code
condition reflétera ces situations. Mais pour en tenir compte, le pro-
gramme devra tester ce code de façon systématique après l’exécution
de ces instructions. Or, en général ces situations sont exceptionnelles.
On utilise alors le mécanisme d’interruptions comme s’il s’agissait d’un
événement externe pour les signaler. On parle alors d’interruptions in-
ternes ou exceptions 69 . Certains langages de programmation de haut
niveau permettent le traitement de ces exceptions par le biais de rou-
tines spécifiques.
Enfin, ces exceptions sont utilisées dans les systèmes d’exploitation
pour la gestion de certaines ressources spécifiques telles que la mémoire
virtuelle, la commutation de processus par exemple.
46
5 Architectures évoluées
5.1 Le processeur
L’architecture de l’unité de commande présentée dans les para-
graphes précédents est basée sur l’existence d’un seul processeur et sur
un déroulement séquentiel des instructions.
Les évolutions s’orientent dans de nombreuses directions :
— la microprogrammation des instructions 70
— le jeu réduit d’instructions (architecture RISC 71 )
— un ensemble d’UAL, chacune avec un jeu spécialisé d’instructions
— processeur virgule flottante (FPU 72 )
— processeur graphique (GPU 73 )
— processeur de signal numérique (DSP 74 )
— etc . . .
— un parallélisme dans l’exécution d’un ensemble d’instructions
grâce à des chaînes de calcul (pipeline 75 ou infoduc)
— un ensemble d’UAL fonctionnant en parallèle (architecture Multi-
cœur 76 )
— et enfin des architectures de processeurs ou mémoires fonction-
nant en parallèle
— SIMD 77
— MISD 78
— MIMD 79
— Multiprocesseurs 80
5.1.1 Microprogrammation
Au fur et à mesure de l’évolution de l’unité de commande, les ins-
tructions deviennent de plus en plus complexes. La réalisation de ces
70. [Link]
71. [Link]
72. [Link]
73. [Link]
74. [Link]
75. [Link]
76. [Link]
77. [Link]
78. [Link]
79. [Link]
80. [Link]
47
instructions par des circuits électroniques rend donc de plus en plus
complexe la conception des puces qui les supportent.
Or ces instructions peuvent être décrites par des programmes.
La microprogrammation consiste alors à réaliser ces instructions
comme des programmes, en stockant leurs codes dans des mémoires
permanentes non modifiables (ROM).
L’exécution de chaque instruction se résume donc à l’appel du mi-
croprogramme qui la réalise.
48
Une phase du cycle d’instruction est alors exécuté comme suit (l’ex-
pression a//b indiquant que les opérations a et b sont exécutées en
parallèle) :
Ph4 de I1 // Ph3 de I2 // Ph2 de I3 // Ph1 de I4
suivie du décalage de l’infoduc et de l’introduction de l’instruction
I5 , l’instruction I1 ayant alors terminé son exécution
Ce qui revient à dire que globalement pendant un cycle d’instruc-
tion, 4 instructions ont été exécutées en parallèle.
Mais il y a un hic ! Il se peut qu’une des instructions en queue
d’infoduc ait besoin du résultat d’une instruction placée devant qui
n’a pas terminé son cycle ! Ou encore qu’une instruction de rupture de
séquence vienne perturber la donne.
Ce dispositif doit donc se compléter d’un test des codes opérations
placées dans l’infoduc afin de déterminer si ces instructions peuvent
être exécutées en parallèle avec le même résultat que si elles avaient
été exécutées en séquence.
Ce test peut se dérouler en parallèle avec les phases décrites précé-
demment et n’introduit donc pas de délai supplémentaire. Enfin, si la
suite des instructions provient de la compilation d’un programme écrit
dans un langage de haut niveau, le compilateur peut tenir compte de
l’architecture sous jacente pour adapter le code généré à la chaîne de
calcul.
49
et, en y réfléchissant un peu, la seconde étape peut aussi être for-
tement parallélisée !
De cette idée naissent les architectures suivantes :
50
Figure 21: L’architecture MISD
51
Figure 22: L’architecture MIMD
5.2.1 L’antémémoire
Appelée aussi mémoire cache, c’est un intermédiaire entre les re-
gistres de l’unité de commande et la mémoire centrale (décrite au pa-
ragraphe précédent).
Le temps de conservation des informations est extrêmement court
(déroulement d’une suite d’instructions) et elle nécessite une source de
tension.
Son rôle est d’accélérer les transferts. Elle est généralement située
dans le composant « processeur ».
Elle contient la suite des prochaines instructions à exécuter.
Sa taille est de l’ordre du million d’octets (1Mio).
Il existe souvent plusieurs niveaux d’antémémoires, allant du plus
proche de l’unité de contrôle au plus éloigné vers la mémoire centrale.
Elle est également d’une grande utilité dans les architectures pa-
rallèles.
52
programme et elle nécessite aussi une source de tension. On la trouve
dans les micro-ordinateurs sous forme de barrettes de capacités va-
riables (autour de 1 Gio actuellement).
53
à des rayonnements UV libérant les électrons piégés. Elle peut donc
être réutilisée.
Elles ont pour rôle de stocker les logiciels utilisés, notamment les
systèmes d’exploitation, et les données pouvant avoir une longue durée
de vie, en tous cas nettement supérieure à celle de l’exécution d’un
programme.
Dans le cas de supports amovibles elles sont aussi utilisées pour le
partage d’informations.
Historiquement, ces mémoires ont été réalisées sur des supports en
carton (cartes perforées), en papier (ruban perforé), puis magnétiques
(bandes, tambours, disquettes).
Actuellement dans le domaine des micro-ordinateurs, elles se dé-
clinent en :
— Supports magnétiques : Disques durs
— Supports optiques : Disques compacts (CD, DVD)
— Supports électroniques : Clefs USB, Mémoires Flash
Bien que les techniques de réalisation soient différentes, l’organisa-
tion des informations se fait toujours selon les mêmes principes.
54
est le secteur (également suite d’octets).
Table d’allocation
55
Figure 24: Table d’allocation
A noter que la suppression d’un fichier est une opération qui retire
cet élément de la table, chaîne les clusters qu’il utilisait avec les clusters
libres, mais n’efface pas son contenu !
Principe
Dans une architecture simple, l’adresse d’une instruction est consi-
dérée comme un indice dans un grand tableau constitué de la suite de
toutes les cellules de la mémoire vive.
Dans une architecture avec mémoire virtuelle l’adresse d’une ins-
truction est composée de 2 champs considérés comme les indices d’un
tableau à 2 dimensions.
Deux réalisations sont possibles :
56
La mémoire paginée (Figure 25)
Mais tout ceci n’est qu’une vue de l’esprit. Cette mémoire est vir-
tuelle !
57
Sa taille (nombre total de cellules) peut être bien supérieure à celle
de la mémoire vive, mais jamais supérieure à celle de la mémoire de
masse.
Chaque entrée de cette table est indicée par le numéro de page (ou
de segment).
Une information indique si la page (ou le segment) est ou non
présent en mémoire vive.
S’il l’est, la table contient l’adresse en mémoire vive de la première
cellule de la page (ou du segment).
Dans tous les cas l’adresse en mémoire de masse d’un fichier conte-
nant une image de la page (ou du segment) figure dans la table. Enfin,
dans le cas d’une mémoire virtuelle segmentée, la longueur du segment
est présente.
58
6 Conclusion
Si en apparence on ne voit rien de commun entre un microproces-
seur qui enchaîne les cycles d’une machine à laver, un micro-ordinateur
de bureau et un super-ordinateur chargé de prévoir la météo pour la
semaine à venir, en fait la structure de base est identique.
C’est cette structure qu’on a voulu décrire dans ce chapitre, le
parti pris étant d’en comprendre les principes et non de décrire avec
précision les composants de tel ou tel ordinateur familier.
59
ANNEXES
7 L’arithmétique et la logique d’ORFEU
On appelle vecteur 81 la séquence de n 82 bits contenue dans une
cellule de mémoire.
7.1 L’arithmétique
7.1.1 Division euclidienne, modulo et congruence
Division euclidienne
Initialement, la division euclidienne est définie ainsi :
a, b, q, r ∈ N et b > 0
a est le dividende
b est le diviseur
q est le quotient noté q = a ÷ b
r est le reste noté r = a mod b
a, q ∈ Z ; b, r ∈ N et b > 0
Dans ce cas, on obtient par exemple :
17 ÷ 4 = 4
17 mod 4 = 1
−17 ÷ 4 = −5
−17 mod 4 = 3
81. Un vecteur sera désigné par une lettre majuscule romaine en caractères gras.
82. Pour ORFEU n = 16.
60
Modulo
Il s’agit tout simplement du reste de la division euclidienne :
a mod b = a − ((a ÷ b) · b)
Congruence
Il s’agit d’une relation d’équivalence définie par :
Au vecteur de n bits
n−2
X
n−1
X = −xn−1 2 + xi 2i
i=0
[−2n−1 : 2n−1 [
En conséquence :
61
— si x0 = 0 X est impair ; si x0 = 1 X est impair
— si xn−1 = 0 X est positif ; si xn−1 = 1 X est négatif ce qui fait
parfois dire que xn−1 est le bit de signe
X ∈ [−2n−1 : 2n−1 [
Remarque
Au vecteur de n bits, pour m < n
car
n−2
X
n−1
−2 + 2i = −2m
i=m
Or
(X + Y ) ∈ [−2n : 2n − 1[
si X + Y ∈ [−2n−1 : 2n−1 [ alors
Z =X +Y
si X + Y ∈ [2n−1 : 2n − 1[ alors
Z = X + Y − 2n
62
si X + Y ∈ [−2n : −2n−1 [ alors
Z = X + Y + 2n
Dans ces deux derniers cas on dit qu’il y a dépassement de capa-
cité 83 .
Cette situation se produit quand Z est de signe contraire à X + Y
donc
xn−1 = yn−1 6= zn−1
Sauf pour
X = −2n−1
car le calcul de X’ conduit à
X 0 = −2n−1
ce qui provoque un dépassement de capacité.
83. Cette situation n’est pas signalée dans ORFEU.
84. L’opposé d’un nombre est son inverse pour l’addition.
63
7.2 La logique
7.2.1 Opérations booléennes élémentaires
Les booléens sont représentés par des éléments binaires (bits) :
— la valeur FAUX est représentée par le bit 0
— la valeur VRAI est représentée par le bit 1
L’expression
Z = ETL (X, Y)
est définie par :
Z = OUL (X, Y)
Z = OUX (X, Y)
64
7.3 Arithmétique et Logique
7.3.1 Inverses arithmétiques et logiques
Inverse logique
On définit le complémentaire d’un booléen 85 par
¬a = a ⊕ 1
¬X = X ⊕ 1
où
1 = < 1, 1, ..., 1, 1 >
Inverse arithmétique
Soit
X = < xn−1 , xn−2 , ..., x1 , x0 >
X = ν(X) le nombre X assoclé à X
n−2
X
X = −xn−1 2n−1 + xi 2i
i=0
Y = ¬X l’inverse logique de X
−X = Y + 1
Conclusion
On vérifie donc que l’inverse arithmétique d’un nombre X défini
par le vecteur X est obtenu en ajoutant 1 au nombre défini par le
vecteur inverse logique du vecteur X.
−X = ν(¬X) + 1
85. appelé aussi inverse
65
7.3.2 Décalages arithmétiques : instruction DAR
Les décalages sont des opérations logiques interprétées comme des
opérations arithmétiques.
On note X d le décalage du vecteur X de
— d bits à gauche si d > 0
— |d| bits à droite si d < 0
Bien évidemment aucun décalage n’a lieu si d = 0
Décalage à gauche
Si la valeur d de l’opérande est positive, des bits 0 sont insérés aux
positions x0 à xd−1 , les bits de positions xn−1 à xn−d sont perdus et
les d autres bits sont décalés à gauche de d positions.
devient
et représente l’entier
n−2−d
X
n−1
Xd = −xn−1−d 2 + xi 2i+d
i=0
Il s’ensuit que
n−2
X
d n−1+d
Xd = X0 2 + xn−1 2 − xi 2i+d − xn−1−d 2n
i=n−d
donc
Xd ≡ X0 2d mod 2n
Xd = X0 2d
66
Décalage à droite
Si la valeur d de l’opérande est négative, la valeur du bit xn−1 est
recopié dans les bits de positions xn−1 à xn−|d| , les bits de positions
x|d|−1 à x0 sont perdus et les d autres bits sont décalés à droite de |d|
positions.
devient
et représente l’entier
n−2
X n−2+d
X
n−1 i
Xd = −xn−1 2 + xn−1 2 + xi+|d| 2i
i=n−1+d i=0
n−2
X
Xd = −xn−1 2n−1+d + xi 2i+d
i=|d|
Il s’ensuit que
n−2
X
Xd 2|d| = −xn−1 2n−1 + xi 2i
i=|d|
n−2 |d|−1
X X
Xd 2|d| = −xn−1 2n−1 + xi 2i − xi 2i
i=0 i=0
|d|−1
X
Xd 2|d| = X0 − xi 2i
i=0
donc
|d|−1
X
|d|
X0 = Xd 2 + xi 2i
i=0
or
|d|−1
X
0≤ xi 2i < 2|d|
i=0
Xd est donc le quotient de la division euclidienne du nombre entier
relatif X0 par 2|d|
Xd = X0 ÷ 2|d| = X0 2d
67
Conclusion
On vérifie bien que l’opération de décalage arithmétique de X avec
d comme valeur de l’opérande donne comme résultat
ν(X d) ≡ X · 2d mod 2n
ν(X d) = X · 2d
8 Exemples de programmes
8.1 Expression arithmétique
# Expression arithmétique simple
SIN DEBUT
A 27
B 42
C 30
D 0
DEBUT CHA A
ADD B
SUB C
STO D # [D] ← [A] + [B] - [C]
NOP 0
SIN DEBUT
UN 1
X 3
Y 1024
Z 128
DEBUT CHA X
ETL UN
SSZ FIN # si [X] pair sauter à FIN
CHA Z
68
ADD Y
STO Z # [Z] ← [Z] + [Y]
FIN NOP 0
SIN DEBUT
A 27
B 42
MAX 0
DEBUT CHA A
SUB B
SSN BMAX
CHA A
SIN MAXI
BMAX CHA B
MAXI STO MAX # [MAX] ← max ([A], [B])
NOP 0
8.4 Itération
# Somme des 100 premiers entiers
SIN DEBUT
N 100
UN 1
I 0
SOMME 0
DEBUT CHA I # début d’itération
SUB N
SSZ FIN # si [I] = [N] sortie d’itération
CHA I
ADD UN
STO I
CHA SOMME
ADD I
STO SOMME # [SOMME] ← [SOMME] + [I]
SIN DEBUT # fin d’itération
FIN NOP 0
69
8.5 Algorithme d’Ahmès
# Produit de deux entiers naturels
SIN DEBUT
X 50
Y 64
Z 0
UN 1
MUN −1
DEBUT CHA X
SSZ FIN # Tant-Que [X] !=0
ETL UN
SSZ SUITE # si [X] pair sauter à SUITE
CHA Z
ADD Y
STO Z # [Z] <– [Z] + [Y]
SUITE CHA X
DAR MUN
STO X # [X] <– [X] / 2
CHA Y
DAR UN
STO Y # [Y] <– [Y] * 2
SIN DEBUT # fin du Tant-Que
FIN NOP 0
SIN DEBUT
I 1
UN 1
N 8
MAX 0
T 1 # [T+0]
−3
5
−7
0
−2
4
70
−6 # [T+7]
DEBUT CHA T
STO MAX # [MAX] ← [T]
CHA I
ITER SUB N # début d’itération
SSZ FIN # si [I] = [N] sortie d’itération
CHA DEBUT
ADD I
STO INS # calcul d’instruction
INS NOP 0 # ACC ← [T+I]
SUB MAX
SSN SUITE
ADD MAX
STO MAX # [MAX] ← max([MAX],[T+I])
SUITE CHA I
ADD UN
STO I
SIN ITER # fin d’itération
FIN NOP 0
SIN DEBUT
A 27 # paramètres effectifs
B 42
MAX 0
DEBUT CHA A # transmission
STO X # des paramètres
CHA B
STO Y
CHA IR # transmission de l’
STO FSP # instruction de retour IR
SIN DSP # appel du sous programme
IR SIN RET
RET STO MAX # [MAX] ← max ([A], [B])
NOP 0
# Sous programme
X 0 # paramètres formels
71
Y 0
DSP CHA X # début de sous programme
SUB Y
SSN YMAX
CHA X
SIN FSP
YMAX CHA Y
FSP NOP 0 # retour de la fonction
SIN DEBUT
UN 1
PERI 0 # Périmètre
RECT NOP OBJET # Pointeur
OBJET 24 # Hauteur
36 # Largeur
DEBUT CHA CHAH
OUL RECT
STO CHAH
CHAH CHA 0 # ACC ← [[RECT]]
STO PERI
CHA CHAL
OUL RECT
ADD UN
STO CHAL
CHAL CHA 0 # ACC ← [[RECT] + 1]
ADD PERI
DAR UN
STO PERI # [PERI] ← 2 × [[RECT]] × [[RECT] + 1]
NOP 0
8.9 Pile
# Gestion de pile
SIN DEBUT
UN 1
A 27
72
B 45
C 0
D 0
DEBUT CHA A
STO X
CHA IR1 # transmission de l’
STO FINEMP # instruction de retour IR1
SIN EMPILER # appel du sous programme EMPILER
IR1 SIN RET1
RET1 CHA B
STO X
CHA IR2 # transmission de l’
STO FINEMP # instruction de retour IR2
SIN EMPILER # appel du sous programme EMPILER
IR2 SIN RET2
RET2 CHA IR3 # transmission de l’
STO FINDEP # instruction de retour IR3
SIN DEPILER # appel du sous programme DEPILER
IR3 SIN RET3
RET3 STO C
CHA IR4 # transmission de l’
STO FINDEP # instruction de retour IR4
SIN DEPILER # appel du sous programme DEPILER
IR4 SIN RET4
RET4 STO D
NOP 0
# empiler
X 0
EMPILER CHA EMP # calcul de l’instruction EMP
OUL PTP
STO EMP
CHA X
EMP STO 0 # empilement de X
CHA PTP
73
ADD UN # incrémentation du pointeur
STO PTP
FINEMP NOP 0
# depiler
SIN DEBUT
N 5
CARRE 0
UN 1
ICHA CHA 0 # instruction CHA
ISTO STO 0 # instruction STO
PTP NOP PILE # pointeur de pile
PILE 0
0
0
0
0
0
0
0
0
0
0
0
0
0
DEBUT CHA PTP
OUL ISTO
STO EMPIR
74
CHA IR
EMPIR STO 0 # empilement de [IR]
CHA PTP # (instruction de retour)
ADD UN
STO PTP
OUL ISTO
STO EMPN
CHA N
EMPN STO 0 # empilement de [N]
CHA PTP
ADD UN
STO PTP
SIN DSP # appel du sous programme
IR SIN RET
RET STO CARRE
NOP 0 # fin du programme
# sous-programme
75
STO PTP
SIN DSP # appel récursif
IRSP SIN RETSP
RETSP STO S # retour de sous programme
CHA PTP
OUL ICHA
SUB UN
STO RCHI
RCHI CHA 0 # chargement de [I]
DAR UN
SUB UN
ADD S
FINSP STO S # [S] ← [S]+ 2 × [I] - 1
CHA PTP
SUB UN
SUB UN
STO PTP
OUL ICHA
STO DEPIR
DEPIR CHA 0 # dépilment de l’instruction
STO FSP # de retour
CHA S
FSP NOP 0 # fin de sous programme
9 La grammaire de LAMOR
9.1 La Forme de Backus-Naur (BNF)
Il s’agit d’une grammaire permettant de définir de façon formelle
la syntaxe d’un langage de programmation 86 .
Les éléments terminaux (ceux du langage LAMOR) figurent ici en
lettres majuscules.
Les éléments non terminaux (unités syntaxiques du langage LA-
MOR) figurent entre chevrons.
Les règles de la grammaire sont définies ci-dessous.
Elles conduisent à une analyse descendante de LAMOR.
L’axiome est : <programme LAMOR>
Règles :
86. [Link]
76
<programme LAMOR> : := <ligne>*
<ligne> : := [# <commentaire> | <ligne de programme>] eol
<commentaire> : := <utf 8>*
<ligne de programme> : := [<étiquette>] <sép>+ <cellule> [<fin>]
<cellule> : := <entier relatif> | <code opération> <sép>+ <opé-
rande>
<opérande> : := <identificateur> | <entier naturel>
<fin> : := <sép>+ <commentaire>
<entier relatif> : := [-] <entier naturel>
<entier naturel> : := <chiffre>+
<étiquette> : := <nom>
<identificateur> : := <nom>
<nom> : := <lettre> <lettre ou chiffre>*
<lettre ou chiffre> : := <lettre> | <chiffre>
<utf 8> : := un caractère utf 8 imprimable
<sép> : := espace | tabulation
<chiffre> : := 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<lettre> : := A | B | C ... X | Y | Z
<code opération> : := NOP | CHA | STO | ADD | SUB | ETL |
OUL | OUX | SIN | SSN | SSZ | DAR
Abréviations :
— [us] désigne un ensemble d’unités syntaxiques optionnelles ;
— us∗ désigne une unité syntaxique absente ou répétée indéfini-
ment ;
— us+ désigne une unité syntaxique répétée indéfiniment présente
au moins une fois.
Précisions :
— eol désigne le ou les caractères de fin de ligne ;
— espace et tabulation représentent respectivement les caractères de
code décimal utf 8 : 32 et 9 ;
— un caractère utf 8 signifie n’importe quel caractère imprimable
codé en utf 8 ;
— un entier naturel x figurant comme opérande doit satisfaire : 0 ≤
x < 4096 ;
— un entier relatif x figurant comme cellule doit satisfaire : −32768 ≤
x < 32768.
77
Remarques :
— les entiers sont exprimés en base 10 ;
— les espaces et tabulations sont des caractères significatifs utilisés
comme séparateurs entre unités syntaxiques ;
— une étiquette doit commencer en début de ligne.
Lignes valides :
— Lignes non assemblées (non traduites par l’assembleur) :
— les lignes vides ;
— les lignes ou commençant par #.
— Lignes assemblées :
— ce sont les lignes appelées <ligne de programme> ;
— chacune d’elles est traduite dans une cellule d’Orfeu ;
— elles revêtent exclusivement une des deux formes :
— [<étiquette>] <sep>+ <donnée > [<fin>]
— [<étiquette>] <sep>+ <code opération> <sep>+ <opé-
rande> [<fin>]
9.2 L’automate
LAMOR est un langage rationnel 87 .
Il peut donc aussi être décrit par un Automate Fini 88 (cf. Figure 27
L’automate page 79).
Sur cette figure, l’état 0 (DEBUT/FIN) est l’état initial et le seul
état final.
Il conduit à une analyse ascendante de LAMOR.
10 ORFEU et la calculabilité
On peut constater par les quelques exemples de l’annexe que l’archi-
tecture d’ORFEU permet de réaliser toutes les structures de contrôle
et toutes les opérations arithmétiques des algorithmes itératifs et ré-
cursifs.
87. [Link]
88. [Link]
78
lettre ou chiffre sep
ETIQUETTE CELLULE OPERATEUR
sep code opération
1 2 3
sep
lettre -
5 ENTIER NEGATIF
chiffre sep
DEBUT/FIN ENTIER NATUREL chiffre OPERANDE
eol chiffre
0 6 4
eol
eol sep
eol chiffre
# sep lettre
COMMENTAIRE IDENTIFICATEUR
sep
8 7
79
— décrémente C1
— incrémente C2
— décrémente C2
— si C1=0 alors saut vers l’instruction i1 sinon saut vers
l’instruction i2
— si C2=0 alors saut vers l’instruction i1 sinon saut vers
l’instruction i2
où i1 et i2 sont des étiquettes (ou numéro de lignes) du
programme. »
Or on peut aisément simuler une machine à compteurs par ORFEU,
en imaginant une taille non bornée de la mémoire.
Moyennant cette extension imaginaire ORFEU est donc lui aussi
un modèle de calcul.
instruction SIN X
Elle est réalisable grâce à la séquence :
CHA ZERO
SSZ X
instruction SSN X
Elle est réalisable grâce à la séquence :
ETL MINI
80
OUX M1
SSZ X
instruction NOP X
Cette instruction n’est pas indispensable à la programmation des
algorithmes, à l’exception de NOP 0 qui signifie l’arrêt de la machine.
Elle peut être remplacée par l’instruction SIN 0 qui ne pourra alors
n’être utilisée que pour cette fonction.
CHA X
OUX M1
INC
instruction ADD X
En s’inspirant de cet algorithme qui réalise S ← S + X mod 16 :
81
OUX M1
INC
STO Z [Z] ← -[X]
SUITE CHA Z
SSZ FIN si [Z] = 0 aller à fin
INC
STO Z [Z] ← [Z] + 1
CHA S
INC
STO S [S] ← [S] + 1
SIN SUITE
FIN CHA S ACC ← [S]
instruction SUB Y
On sait que soustraire un nombre est équivalent à y ajouter son
opposé : X - Y = X + (-Y)
L’instruction SUB Y est réalisable grâce à la séquence :
82
a b a↑b a↓b
0 0 1 1
0 1 1 0
1 0 1 0
1 1 0 0
— (A↑B)↑(A↑B)
— (A↓A)↓(B↓B)
— A∨B:
— (A↑A)↑(B↑B)
— (A↓B)↓(A↓B)
— A⊕B:
— ((A↑B)↑A)↑((A↑B)↑B)
— ( (A ↓ A) ↓ (B ↓ B) ) ↓ (A ↓ B)
83
Q←Q-1
R←R+2 {S = 2 · Q + R ∧ R < 2}
S←Q
10.2.5 Conclusion
Le jeu d’instructions d’ORFEU pourrait donc théoriquement être
réduit à seulement 5 :
— SSZ X
— CHA X
— STO X
— INC
— NON-ET ou NON-OU
84