You are on page 1of 30

Vincent Granet

Algorithmique
et programmation
en Java
Cours et exercices corrigs

4e dition

Illustration de couverture :
Abstract background - Spheres Dreaming Andy Fotolia.com

Dunod, 2000, 2004, 2010, 2014


5 rue Laromiguire, 75005 Paris
www.dunod.com
ISBN 978-2-10-071287-8

Maud

Table des matires

AVANT-PROPOS

XV

CHAPITRE 1 INTRODUCTION
1.1 Environnement matriel
1.2 Environnement logiciel
1.3 Les langages de programmation
1.4 Construction des programmes
1.5 Dmonstration de validit

1
1
4
5
11
13

CHAPITRE 2 ACTIONS LMENTAIRES


2.1 Lecture dune donne
2.2 Excution dune routine prdfinie

15
15
16

2.3 criture dun rsultat


2.4 Affectation dun nom un objet
2.5 Dclaration dun nom
2.5.1 Dclaration de constantes
2.5.2 Dclaration de variables
2.6 Rgles de dduction
2.6.1 Laffectation
2.6.2 Lappel de procdure
2.7 Le programme sinus crit en Java
2.8 Exercices

17
17
18
18
19
19
19
20
20
22

CHAPITRE 3 TYPES LMENTAIRES


3.1 Le type entier
3.2 Le type rel

23
24
25

VIII

Algorithmique et programmation en Java

3.3 Le type boolen


3.4 Le type caractre
3.5 Constructeurs de types simples
3.5.1 Les types numrs
3.5.2 Les types intervalles
3.6 Exercices

28
29
31
31
32
32

CHAPITRE 4 EXPRESSIONS
4.1 valuation
4.1.1 Composition du mme oprateur plusieurs fois
4.1.2 Composition de plusieurs oprateurs diffrents
4.1.3 Parenthsage des parties dune expression
4.2 Type dune expression
4.3 Conversions de type
4.4 Un exemple
4.5 Exercices

35
36
36
36
37
37
38
38
41

CHAPITRE 5 NONCS STRUCTURS


5.1 nonc compos

43
43

5.2 noncs conditionnels


5.2.1 nonc choix
5.2.2 nonc si
5.3 Rsolution dune quation du second degr
5.4 Exercices

44
44
46
47
50

CHAPITRE 6 PROCDURES ET FONCTIONS


6.1 Intrt
6.2 Dclaration dune routine
6.3 Appel dune routine
6.4 Transmission des paramtres
6.4.1 Transmission par valeur
6.4.2 Transmission par rsultat
6.5 Retour dune routine
6.6 Localisation
6.7 Rgles de dduction
6.8 Exemples
6.9 Exercices

53
53
54
55
56
57
57
57
58
60
61
65

CHAPITRE 7 PROGRAMMATION PAR OBJETS


7.1 Objets et classes
7.1.1 Cration des objets
7.1.2 Destruction des objets
7.1.3 Accs aux attributs

67
67
68
69
69

Table des matires

IX

7.1.4 Attributs de classe partags


7.1.5 Les classes en Java
7.2 Les mthodes
7.2.1 Accs aux mthodes
7.2.2 Constructeurs
7.2.3 Constructeurs en Java
7.2.4 Les mthodes en Java
7.3 Assertions sur les classes
7.4 Exemples

70
70
71
72
72
73
73
75
76

7.4.1 quation du second degr


7.4.2 Date du lendemain
7.5 Exercices

76
79
82

CHAPITRE 8 NONCS ITRATIFS


8.1 Forme gnrale
8.2 Lnonc tantque
8.3 Lnonc rpter
8.4 Finitude
8.5 Exemples
8.5.1 Factorielle
8.5.2 Minimum et maximum
8.5.3 Division entire
8.5.4 Plus grand commun diviseur
8.5.5 Multiplication
8.5.6 Puissance
8.6 Exercices

85
85
86
87
88
88
88
89
89
90
91
91
92

CHAPITRE 9 LES TABLEAUX


9.1 Dclaration dun tableau
9.2 Dnotation dun composant de tableau
9.3 Modification slective
9.4 Oprations sur les tableaux
9.5 Les tableaux en Java
9.6 Un exemple
9.7 Les chanes de caractres
9.8 Exercices

95
95
96
97
97
97
99
101
102

CHAPITRE 10 LNONC ITRATIF POUR


10.1 Forme gnrale
10.2 Forme restreinte
10.3 Les noncs pour de Java
10.4 Exemples
10.4.1 Le schma de H ORNER

105
105
106
106
108
108

Algorithmique et programmation en Java

10.4.2 Un tri interne simple


10.4.3 Confrontation de modle
10.5 Complexit des algorithmes
10.6 Exercices

109
110
114
116

CHAPITRE 11 LES TABLEAUX PLUSIEURS DIMENSIONS


11.1 Dclaration
11.2 Dnotation dun composant de tableau
11.3 Modification slective
11.4 Oprations
11.5 Tableaux plusieurs dimensions en Java
11.6 Exemples
11.6.1 Initialisation dune matrice
11.6.2 Matrice symtrique
11.6.3 Produit de matrices
11.6.4 Carr magique
11.7 Exercices

119
119
120
120
121
121
122
122
122
123
124
126

CHAPITRE 12 HRITAGE
12.1 Classes hritires
12.2 Redfinition de mthodes
12.3 Recherche dun attribut ou dune mthode
12.4 Polymorphisme et liaison dynamique
12.5 Classes abstraites
12.6 Hritage simple et multiple
12.7 Hritage et assertions
12.7.1 Assertions sur les classes hritires
12.7.2 Assertions sur les mthodes
12.8 Relation dhritage ou de clientle
12.9 Lhritage en Java

131
131
134
135
136
137
138
139
139
139
139
140

CHAPITRE 13 FONCTIONS ANONYMES


13.1 Paramtres fonctions
13.1.1 Fonctions anonymes en Java
13.1.2 Foreach et map
13.1.3 Continuation
13.2 Fonctions anonymes en rsultat
13.2.1 Composition
13.2.2 Curryfication
13.3 Fermeture
13.3.1 Fermeture en Java
13.3.2 Lambda rcursives
13.4 Exercices

143
144
145
147
148
150
150
151
152
153
154
155

Table des matires

XI

CHAPITRE 14 LES EXCEPTIONS


14.1 mission dune exception
14.2 Traitement dune exception
14.3 Le mcanisme dexception de Java
14.3.1 Traitement dune exception

157
157
158
159
159

14.3.2 mission dune exception


14.4 Exercices

160
161

CHAPITRE 15 LES FICHIERS SQUENTIELS


15.1 Dclaration de type
15.2 Notation
15.3 Manipulation des fichiers

163
164
164
165

15.3.1 criture
15.3.2 Lecture
15.4 Les fichiers de Java
15.4.1 Fichiers doctets
15.4.2 Fichiers dobjets lmentaires
15.4.3 Fichiers dobjets structurs
15.5 Les fichiers de texte
15.6 Les fichiers de texte en Java
15.7 Exercices

165
166
167
167
169
173
173
174
178

CHAPITRE 16 RCURSIVIT
16.1 Rcursivit des actions
16.1.1 Dfinition
16.1.2 Finitude
16.1.3 criture rcursive des routines
16.1.4 La pile dvalution
16.1.5 Quand ne pas utiliser la rcursivit ?
16.1.6 Rcursivit directe et croise
16.2 Rcursivit des objets
16.3 Exercices

181
182
182
182
182
185
186
188
190
192

CHAPITRE 17 STRUCTURES DE DONNES


17.1 Dfinition dun type abstrait
17.2 Limplmentation dun type abstrait
17.3 Utilisation du type abstrait

195
196
198
200

CHAPITRE 18 STRUCTURES LINAIRES


18.1 Les listes
18.1.1 Dfinition abstraite
18.1.2 Limplmentation en Java

203
203
204
205

18.1.3 numration

216

XII

Algorithmique et programmation en Java

18.2 Les piles


18.2.1 Dfinition abstraite
18.2.2 Limplmentation en Java
18.3 Les files
18.3.1 Dfinition abstraite
18.3.2 Limplmentation en Java
18.4 Les dques
18.4.1 Dfinition abstraite
18.4.2 Limplmentation en Java
18.5 Exercices

219
220
221
223
224
225
226
226
227
228

CHAPITRE 19 GRAPHES
19.1 Terminologie
19.2 Dfinition abstraite dun graphe
19.3 Limplmentation en Java
19.3.1 Matrice dadjacence
19.3.2 Listes dadjacence
19.4 Parcours dun graphe
19.4.1 Parcours en profondeur
19.4.2 Parcours en largeur
19.4.3 Programmation en Java des parcours de graphe
19.5 Exercices

231
232
233
234
235
238
239
239
240
241
243

CHAPITRE 20 STRUCTURES ARBORESCENTES


20.1 Terminologie
20.2 Les arbres
20.2.1 Dfinition abstraite
20.2.2 Limplmentation en Java
20.2.3 Algorithmes de parcours dun arbre
20.3 Arbre binaire
20.3.1 Dfinition abstraite
20.3.2 Limplmentation en Java
20.3.3 Parcours dun arbre binaire
20.4 Reprsentation binaire des arbres gnraux
20.5 Exercices

245
246
247
248
249
251
252
254
255
257
259
260

CHAPITRE 21 TABLES
21.1 Dfinition abstraite
21.1.1 Ensembles
21.1.2 Description fonctionnelle
21.1.3 Description axiomatique
21.2 Reprsentation des lments en Java
21.3 Reprsentation par une liste

263
264
264
264
264
264
266

Table des matires

XIII

21.3.1 Liste non ordonne


21.3.2 Liste ordonne
21.3.3 Recherche dichotomique
21.4 Reprsentation par un arbre ordonn
21.4.1 Recherche dun lment
21.4.2 Ajout dun lment
21.4.3 Suppression dun lment
21.5 Les arbres AVL
21.5.1 Rotations
21.5.2 Mise en uvre
21.6 Arbres 2-3-4 et bicolores
21.6.1 Les arbres 2-3-4
21.6.2 Mise en uvre en Java
21.6.3 Les arbres bicolores
21.6.4 Mise en uvre en Java
21.7 Tables dadressage dispers
21.7.1 Le problme des collisions
21.7.2 Choix de la fonction dadressage
21.7.3 Rsolution des collisions
21.8 Exercices

266
268
270
272
273
273
274
276
277
280
284
284
288
289
294
299
300
301
302
306

CHAPITRE 22 FILES AVEC PRIORIT


22.1 Dfinition abstraite
22.2 Reprsentation avec une liste
22.3 Reprsentation avec un tas
22.3.1 Premier
22.3.2 Ajouter
22.3.3 Supprimer
22.3.4 Limplmentation en Java
22.4 Exercices

311
311
312
312
313
314
315
316
319

CHAPITRE 23 ALGORITHMES DE TRI


23.1 Introduction
23.2 Tris internes
23.2.1 Limplantation en Java
23.2.2 Mthodes par slection
23.2.3 Mthodes par insertion
23.2.4 Tri par changes
23.2.5 Comparaisons des mthodes
23.3 Tris externes
23.4 Exercices

321
321
322
322
323
328
333
337
339
342

XIV

Algorithmique et programmation en Java

CHAPITRE 24 ALGORITHMES SUR LES GRAPHES


24.1 Composantes connexes
24.2 Fermeture transitive
24.3 Plus court chemin
24.3.1 Algorithme de Dijkstra
24.3.2 Algorithme A*
24.3.3 Algorithme IDA*
24.4 Tri topologique
24.4.1 Limplmentation en Java
24.4.2 Existence de cycle dans un graphe
24.4.3 Tri topologique inverse
24.4.4 Limplmentation en Java
24.5 Exercices

345
345
347
349
349
354
356
357
359
360
360
361
361

CHAPITRE 25 ALGORITHMES DE RTRO-PARCOURS


25.1 criture rcursive
25.2 Le problme des huit reines

365
365
367

25.3 criture itrative


25.4 Problme des sous-suites
25.5 Jeux de stratgie
25.5.1 Stratgie MinMax
25.5.2 Coupure
25.5.3 Profondeur de larbre de jeu
25.6 Exercices

369
370
372
372
375
378
379

CHAPITRE 26 INTERFACES GRAPHIQUES


26.1 Systmes interactifs
26.2 Conception dune application interactive
26.3 Environnements graphiques
26.3.1 Systme de fentrage
26.3.2 Caractristiques des fentres
26.3.3 Botes outils
26.3.4 Gnrateurs
26.4 Interfaces graphiques en Java
26.4.1 Une simple fentre
26.4.2 Convertisseur Celcius-Fahrenheit
26.4.3 Un composant graphique pour visualiser des couleurs
26.4.4 Applets
26.5 Exercices

383
383
385
387
387
389
392
394
394
394
397
401
403
405

BIBLIOGRAPHIE

407

INDEX

411

Avant-propos

Longtemps attendue, la version 8 de JAVA est sortie en mars 2014, avec de nombreuses
nouveauts. Sans doute, la plus importante est lajout des fonctions anonymes (lambda expressions) et son incidence tant sur le langage que sur son API.
Pour cette quatrime dition dAlgorithmique et Programmation en Java, lensemble de
louvrage a t rvis pour tenir compte des fonctions anonymes. En particulier, il inclut un
nouveau chapitre qui prsente le paradigme fonctionnel et la faon dont il est mis en uvre
avec JAVA 8.
Linformatique est une science mais aussi une technologie et un ensemble doutils. Ces
trois composantes ne doivent pas tre confondues, et lenseignement de linformatique ne
doit pas tre rduit au seul apprentissage des logiciels. Ainsi, lactivit de programmation
ne doit pas se confondre avec ltude dun langage de programmation particulier. Mme
si limportance de ce dernier ne doit pas tre sous-estime, il demeure un simple outil de
mise en uvre de concepts algorithmiques et de programmation gnraux et fondamentaux.
Lobjectif de cet ouvrage est denseigner au lecteur des mthodes et des outils de construction
de programmes informatiques valides et fiables.
Ltude de lalgorithmique et de la programmation est un des piliers fondamentaux sur
lesquels repose lenseignement de linformatique. Ce livre sadresse principalement aux tudiants des cycles informatiques et lves ingnieurs informaticiens, mais aussi tous ceux
qui ne se destinent pas la carrire informatique mais qui seront certainement confronts
au dveloppement de programmes informatiques au cours de leur scolarit ou dans leur vie
professionnelle.
Les seize premiers chapitres prsentent les concepts de base de la programmation imprative en sappuyant sur une mthodologie objet. Le chapitre 13 est galement ddi
la programmation fonctionnelle. Ils mettent en particulier laccent sur la notion de preuve
des programmes grce la notion daffirmations (antcdent, consquent, invariant) dont la
vrification formelle garantit la validit de programmes. Ils introduisent aussi la notion de
complexit des algorithmes pour valuer leur performance.

XVI

Algorithmique et programmation en Java

Les onze derniers chapitres tudient en dtail les structures de donnes abstraites classiques (liste, graphe, arbre...) et de nombreux dalgorithmes fondamentaux (recherche, tri,
jeux et stratgie...) que tout tudiant en informatique doit connatre et matriser. Dautre part,
un chapitre est consacr aux interfaces graphiques et leur programmation avec S WING.
La prsentation des concepts de programmation cherche tre indpendante, autant que
faire se peut, dun langage de programmation particulier. Les algorithmes seront dcrits dans
une notation algorithmique pure. Pour des raisons pdagogiques, il a toutefois bien fallu
faire le choix dun langage pour programmer les structures de donnes et les algorithmes
prsents dans cet ouvrage. Ce choix sest port sur le langage objets JAVA [GJS96], non
pas par effet de mode, mais plutt pour les qualits de ce langage, malgr quelques dfauts.
Ses qualits sont en particulier sa relative simplicit pour la mise en uvre des algorithmes,
un large champ dapplication et sa grande disponibilit sur des environnements varis. Ce
dernier point est en effet important ; le lecteur doit pouvoir disposer facilement dun compilateur et dun interprte afin de rsoudre les exercices proposs la fin des chapitres. Enfin,
JAVA est de plus en plus utilis comme langage dapprentissage de la programmation dans les
universits. Pour les dfauts, on peut par exemple regretter labsence de lhritage multiple,
et la prsence de constructions archaques hrites du langage C. Ce livre nest toutefois pas
un ouvrage dapprentissage du langage JAVA. Mme si les lments du langage ncessaires
la mise en uvre des notions dalgorithmique et de programmation ont t introduits, ce livre
nenseignera pas au lecteur les finesses et les arcanes de JAVA, pas plus quil ne dcrira les
nombreuses classes de lAPI. Le lecteur intress pourra se reporter aux trs nombreux ouvrages qui dcrivent le langage en dtail, comme par exemple [GR11, Bro99, Ska00, Eck00].
Les corrigs de la plupart des exercices, ainsi que des applets qui proposent une vision
graphique de certains programmes prsents dans louvrage sont accessibles sur le site web
de lauteur ladresse :
www.polytech.unice.fr/~vg/fr/livres/algojava

Cet ouvrage doit beaucoup de nombreuses personnes. Tout dabord, aux auteurs des
algorithmes et des techniques de programmation quil prsente. Il nest pas possible de les
citer tous ici, mais les rfrences leurs principaux textes sont dans la bibliographie. Olivier
Lecarme et Jean-Claude Boussard, mes professeurs luniversit de Nice qui mont enseign
cette discipline au dbut des annes 1980. Je tiens tout particulirement remercier ce dernier
qui fut le tout premier lecteur attentif de cet ouvrage alors quil ntait encore quune bauche,
et qui ma encourag poursuivre sa rdaction. Carine Fdle qui a bien voulu lire et
corriger ce texte de nombreuses reprises, quelle en soit spcialement remercier. Enfin,
mes collgues et mes tudiants qui mont aid et soutenu dans cette tche ardue quest la
rdaction dun livre.
Enfin, je remercie toute lquipe Dunod, Carole Trochu, Jean-Luc Blanc, et Romain Hennion, pour leur aide prcieuse et leurs conseils aviss quils mont apports pour la publication
des quatre ditions de cet ouvrage.

Sophia Antipolis, avril 2014.

Chapitre 1

Introduction

Les informaticiens, ou les simples usagers de loutil informatique, utilisent des systmes
informatiques pour concevoir ou excuter des programmes dapplication. Nous considrerons quun environnement informatique est form dune part dun ordinateur et de ses quipements externes, que nous appellerons environnement matriel, et dautre part dun systme
dexploitation avec ses programmes dapplication, que nous appellerons environnement logiciel. Les programmes qui forment le logiciel rclament des mthodes pour les construire, des
langages pour les rdiger et des outils pour les excuter sur un ordinateur.
Dans ce chapitre, nous introduirons la terminologie et les notions de base des ordinateurs
et de la programmation. Nous prsenterons les notions denvironnement de dveloppement
et dexcution dun programme, nous expliquerons ce quest un langage de programmation
et nous introduirons les mthodes de construction des programmes.

1.1

ENVIRONNEMENT MATRIEL

Un automate est un ensemble fini de composants physiques pouvant prendre des tats
identifiables et reproductibles en nombre fini, auquel est associ un ensemble de changements
dtats non instantans quil est possible de commander et denchaner sans intervention humaine.
Un ordinateur est un automate dterministe composants lectroniques. Tous les ordinateurs, tout au moins les ordinateurs monoprocesseurs, sont construits, peu ou prou, sur le modle propos en 1944 par le mathmaticien amricain dorigine hongroise VON N EUMANN.
Un ordinateur est muni :
- Dune mmoire, dite centrale ou principale, qui contient deux sortes dinformations :
dune part linformation traitante, les instructions, et dautre part linformation trai-

Chapitre 1 Introduction

te, les donnes. Cette mmoire est forme dun ensemble de cellules, ou mots, ayant
chacune une adresse unique, et contenant des instructions ou des donnes. La reprsentation de linformation est faite grce une codification binaire, 0 ou 1. On appelle
longueur de mot, caractristique dun ordinateur, le nombre dlments binaires, appels bits, groups dans une simple cellule. Les longueurs de mots usuelles des ordinateurs actuels (ou passs) sont, par exemple, 8, 16, 24, 32, 48 ou 64 bits. Cette mmoire
possde une capacit finie, exprime en gigaoctets (Go) ; un octet est un ensemble de
8 bits, un kilo-octet (Ko) est gal 1 024 octets, un mgaoctet est gal 1 024 Ko,
un gigaoctet (Go) est gal 1 024 Mo, et enfin un traoctet (To) est gal 1 024 Go.
Actuellement, les tailles courantes des mmoires centrales des ordinateurs individuels
varient entre 4 Go 8 Go 1 .
- Dune unit centrale de traitement, forme dune unit de commande (UC) et dune
unit arithmtique et logique (UAL). Lunit de commande extrait de la mmoire centrale les instructions et les donnes sur lesquelles portent les instructions ; elle dclenche le traitement de ces donnes dans lunit arithmtique et logique, et ventuellement range le rsultat en mmoire centrale. Lunit arithmtique et logique effectue
sur les donnes quelle reoit les traitements commands par lunit de commande.
- De registres. Les registres sont des units de mmorisation, en petit nombre (certains
ordinateurs nen ont pas), qui permettent lunit centrale de traitement de ranger de
faon temporaire des donnes pendant les calculs. Laccs ces registres est trs rapide,
beaucoup plus rapide que laccs une cellule de la mmoire centrale. Le rapport entre
les temps daccs un registre et la mmoire centrale est de lordre de 100.
- Dunits dchanges relies des priphriques pour changer de linformation avec
le monde extrieur. Lunit de commande dirige les units dchange lorsquelle rencontre des instructions dentre-sortie.
Jusquau milieu des annes 2000, les constructeurs taient engags dans une course la
vitesse avec des microprocesseurs toujours plus rapides. Toutefois, les limites de la physique
actuelle ont t atteintes et depuis 2006 la tendance nouvelle est de placer plusieurs (le plus
possible) microprocesseurs sur une mme puce (le circuit-intgr). Ce sont par exemple les
processeurs 64 bits Core i7 dI NTEL ou AMD FX dAMD, qui possdent de 4 8 processeurs.
Les ordinateurs actuels possdent aussi plusieurs niveaux de mmoire. Ils introduisent,
entre le processeur et la mmoire centrale, des mmoires dites caches qui acclrent laccs
aux donnes. Les mmoires caches peuvent tre primaires, cest--dire situes directement
sur le processeur, ou secondaires, cest--dire situes sur la carte mre. Certains ordinateurs
introduisent mme un troisime niveau de cache. En gnral, le rapport entre le temps daccs
entre les deux premiers niveaux de mmoire cache est denviron 10 (le cache de niveau 1 est
le plus rapide et le plus petit). Le temps daccs entre la mmoire cache secondaire et la
mmoire centrale est lui aussi dun rapport denviron 10.
Les quipements externes, ou priphriques, sont un ensemble de composants permettant
de relier lordinateur au monde extrieur, et notamment ses utilisateurs humains. On peut
distinguer :
1. Notez quavec 32 bits, lespace adressage est de 4 Go mais quen gnral les systmes dexploitation ne
permettent dutiliser quun espace mmoire de taille infrieure. Les machines 64 bits actuelles, avec un systme
dexploitation adapt, permettent des tailles de mmoire centrale suprieures 4 Go.

1.1

Environnement matriel

unit centrale

registres

unit de commande

instructions

mmoire
unit arithmtique
et logique

donnes

centrale

rsultats

unit dchange

priphriques

F IGURE 1.1 Structure gnrale dun ordinateur.

- Les dispositifs qui servent pour la communication avec lhomme (clavier, cran, imprimantes, micros, haut-parleurs, scanners, etc.) et qui demandent une transcodification
approprie de linformation, par exemple sous forme de caractres alphanumriques.
- Les mmoires secondaires, qui permettent de conserver de linformation, impossible
garder dans la mmoire centrale de lordinateur faute de place, ou que lon dsire
conserver pour une priode plus ou moins longue aprs larrt de lordinateur.
Les mmoires secondaires sont les disques durs magntiques ou flash, les CD-ROM,
les DVD, les Blu-ray ou les cls USB. Par le pass, les bandes magntiques ou les
disquettes taient des supports trs utiliss. Actuellement les bandes magntiques ne
le sont quasiment plus, la fabrication des disquettes (supports de trs petite capacit
et peu fiables) a t arrte depuis plusieurs annes dj, et les ordinateurs vendus aujourdhui sont bien souvent dpourvus de lecteur/graveur de DVD ou Blu-ray.
Aujourdhui, la capacit des mmoires secondaires atteint des valeurs toujours plus
importantes. Alors que certains DVD ont une capacit de 17 Go, quun disque Blu-ray
atteint 50 Go, et que des cls USB de 64 Go sont courantes, un seul disque dur peut mmoriser jusqu plusieurs traoctets. Des systmes permettent de regrouper plusieurs
disques, vus comme un disque unique, offrant une capacit de plusieurs centaines de
traoctets. Toutefois, laccs aux informations sur les supports secondaires reste bien
plus lent que celui aux informations places en mmoire centrale. Pour les disques
durs, le rapport est denviron 10.
lavenir, avec le dveloppement du nuage (cloud computing), la tendance est plutt la limitation des mmoires locales, en faveur de celles, dlocalises et bien plus
vastes, proposes par les centres de donnes (datacenters) accessibles par le rseau
Internet.
- Les dispositifs qui permettent lchange dinformations sur un rseau. Pour relier lordinateur au rseau, il existe par exemple des connexions filaires comme celles de type
ethernet, ou des connexions sans fil comme celles de type WiFi.

Chapitre 1 Introduction

Le lecteur intress par larchitecture et lorganisation des ordinateurs pourra lire avec
profit le livre dA. TANENBAUM [Tan12] sur le sujet.

1.2

ENVIRONNEMENT LOGICIEL

Lordinateur que fabrique le constructeur est une machine incomplte laquelle il faut
ajouter, pour la rendre utilisable, une quantit importante de programmes varis, qui constituent le logiciel.
En gnral, un ordinateur est livr avec un systme dexploitation. Un systme dexploitation est un programme, ou plutt un ensemble de programmes, qui assurent la gestion des
ressources, matrielles et logicielles, employes par le ou les utilisateurs. Un systme dexploitation a pour tche la gestion et la conservation de linformation (gestion des processus
et de la mmoire centrale, systme de gestion de fichiers) ; il a pour rle de crer lenvironnement ncessaire lexcution dun travail, et est charg de rpartir les ressources entre
les usagers. Il propose aussi de nombreux protocoles de connexion pour relier lordinateur
un rseau. Entre lutilisateur et lordinateur, le systme dexploitation propose une interface
textuelle au moyen dun interprte de commandes et une interface graphique au moyen dun
gestionnaire de fentres.
Les systmes dexploitation des premiers ordinateurs ne permettaient lexcution que
dune seule tche la fois, selon un mode de fonctionnement appel traitement par lots
qui assurait lenchanement de lexcution des programmes. partir des annes 1960, les
systmes dexploitation ont cherch exploiter au mieux les ressources des ordinateurs en
permettant le temps partag, pour offrir un accs simultan plusieurs utilisateurs.
Jusquau dbut des annes 1980, les systmes dexploitation taient dits propritaires.
Les constructeurs fournissaient avec leurs machines un systme dexploitation spcifique,
et le nombre de systmes dexploitation diffrents tait important. Aujourdhui, ce nombre a
considrablement rduit, et seuls quelques-uns sont rellement utiliss dans le monde. Citons,
par exemple, W INDOWS, M AC O S ou L INUX pour les ordinateurs individuels, et U NIX pour
les ordinateurs multi-utilisateurs.
Aujourdhui, avec laugmentation de la puissance des ordinateurs personnels et lavnement des rseaux mondiaux, les systmes dexploitation offrent, en plus des fonctions dj
cites, une quantit extraordinaire de services et doutils aux utilisateurs. Ces systmes dexploitation modernes mettent la disposition des utilisateurs tout un ensemble dapplications
(traitement de texte, tableurs, outils multimdias, navigateurs pour le web, jeux, ...) qui leur
offrent un environnement de travail pr-construit, confortable et facile dutilisation.
Le traitement de linformation est lexcution par lordinateur dune srie finie de commandes prpares lavance, le programme, qui vise calculer et rendre des rsultats, gnralement, en fonction de donnes entres au dbut ou en cours dexcution par lintermdiaire dinterfaces textuelles ou graphiques. Les commandes qui forment le programme sont
dcrites au moyen dun langage. Si ces commandes se suivent strictement dans le temps,
et ne sexcutent jamais simultanment, lexcution est dite squentielle, sinon elle est dite
parallle.

1.3

Les langages de programmation

Chaque ordinateur possde un langage qui lui est propre, appel langage machine. Le
langage machine est un ensemble de commandes lmentaires reprsentes en code binaire
quil est possible de faire excuter par lunit centrale de traitement dun ordinateur donn.
Le seul langage que comprend lordinateur est son langage machine.
Tout logiciel est crit laide dun ou plusieurs langages de programmation. Un langage
de programmation est un ensemble dnoncs dterministes, quil est possible, pour un tre
humain, de rdiger selon les rgles dune grammaire donne, et destins reprsenter les
objets et les commandes pouvant entrer dans la constitution dun programme. Ni le langage
machine, trop loign des modes dexpressions humains, ni les langues naturelles crites ou
parles, trop ambigus, ne sont des langages de programmation.
La production de logiciel est une activit difficile et complexe, et les diteurs font payer,
parfois trs cher, leur logiciel dont le code source nest, en gnral, pas distribu. Toutefois, tous les logiciels ne sont pas payants. La communaut internationale des informaticiens
produit depuis longtemps du logiciel gratuit (ce qui ne veut pas dire quil est de mauvaise
qualit, bien au contraire) mis la disposition de tous. Il existe aux tats-Unis 2 , une fondation, la FSF (Free Software Foundation), linitiative de R. S TALLMAN, qui a pour but la
promotion de la construction du logiciel libre, ainsi que celle de sa distribution. Libre ne veut
pas dire ncessairement gratuit 3 , bien que cela soit souvent le cas, mais indique que le texte
source du logiciel est disponible. Dailleurs, la FSF propose une licence, GNU GPL, afin de
garantir que les logiciels sous cette licence soient libres dtre redistribus et modifis par
tous leurs utilisateurs.
Le systme dexploitation L INUX est disponible librement depuis de nombreuses annes,
et aujourdhui certains diteurs suivent ce courant en distribuant, comme Apple par exemple,
gratuitement la dernire version de leur systme dexploitation Mavericks (toutefois sans le
code source).

1.3

LES LANGAGES DE PROGRAMMATION

Nous venons de voir que chaque ordinateur possde un langage qui lui est propre : le
langage machine, qui est en gnral totalement incompatible avec celui dun ordinateur dun
autre modle. Ainsi, un programme crit dans le langage dun ordinateur donn ne pourra
tre rutilis sur un autre ordinateur.
Le langage dassemblage est un codage alphanumrique du langage machine. Il est plus
lisible que ce dernier et surtout permet un adressage relatif de la mmoire. Toutefois, comme
le langage machine, le langage dassemblage est lui aussi dpendant dun ordinateur donn
(voire dune famille dordinateurs) et ne facilite pas le transport des programmes vers des
machines dont larchitecture est diffrente. Lexcution dun programme crit en langage
dassemblage ncessite sa traduction pralable en langage machine par un programme spcial, lassembleur.
2. FSF France a pour but la promotion du logiciel libre en France (http://fsffrance.org).
3. La confusion provient du fait quen anglais le mot free possde les deux sens.

Chapitre 1 Introduction

Le texte qui suit 4 , crit en langage dassemblage dun Core i5-3320M dIntel, correspond
lappel, de la fonction C printf("Bonjour\n") qui crit Bonjour sur la sortie standard (e.g.
lcran) depuis la fonction main.
LC0:
.string "Bonjour"
.text
.globl main
.type
main, @function
main:
.LFB0:
.cfi_startproc
pushq
%rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq
%rsp, %rbp
.cfi_def_cfa_register 6
movl
$.LC0, %edi
call
puts
movl
$0, %eax
popq
%rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc

Le langage dassemblage, comme le langage machine, est dun niveau trs lmentaire
(une suite linaire de commandes et sans structure) et, comme le montre lexemple prcdent, gure lisible et comprhensible. Son utilisation par un tre humain est alors difficile,
fastidieuse et sujette erreurs.
Ces dfauts, entre autres, ont conduit la conception des langages de programmation dits
de haut niveau. Un langage de programmation de haut niveau offrira au programmeur des
moyens dexpression structurs proches des problmes rsoudre et qui amlioreront la fiabilit des programmes. Pendant de nombreuses annes, les ardents dfenseurs de la programmation en langage dassemblage avanaient le critre de son efficacit. Les optimiseurs de
code ont balay cet argument depuis longtemps, et les dfauts de ces langages sont tels que
leurs thurifraires sont de plus en plus rares.
Si on ajoute un ordinateur un langage de programmation, tout se passe comme si lon disposait dun nouvel ordinateur (une machine abstraite), dont le langage est maintenant adapt
ltre humain, aux problmes quil veut rsoudre et la faon quil a de comprendre et
de raisonner. De plus, cet ordinateur fictif pourra recouvrir des ordinateurs diffrents, si le
langage de programmation peut tre install sur chacun deux. Ce dernier point est trs important, puisquil signifie quun programme crit dans un langage de haut niveau pourra tre
exploit (thoriquement) sans modification sur des ordinateurs diffrents.
La dfinition dun langage de programmation recouvre trois aspects fondamentaux. Le
premier, appel lexical, dfinit les symboles (ou caractres) qui servent la rdaction des
4. Produit par le compilateur gcc.

1.3

Les langages de programmation

programmes et les rgles de formation des mots du langage. Par exemple, un entier dcimal
sera dfini comme une suite de chiffres compris entre 0 et 9. Le second, appel syntaxique,
est lensemble des rgles grammaticales qui organisent les mots en phrases. Par exemple,
la phrase 234 / 54 , forme de deux entiers et dun oprateur de division, suit la rgle
grammaticale qui dcrit une expression. Le dernier aspect, appel smantique, tudie la signification des phrases. Il dfinit les rgles qui donnent un sens aux phrases. Notez quune
phrase peut tre syntaxiquement valide, mais incorrecte du point de vue de sa smantique
(e.g. 234/0, une division par zro est invalide). Lensemble des rgles lexicales, syntaxiques
et smantiques dfinit un langage de programmation, et on dira quun programme appartient
un langage de programmation donn sil vrifie cet ensemble de rgles. La vrification de la
conformit lexicale, syntaxique et smantique dun programme est assure automatiquement
par des analyseurs qui sappuient, en gnral, sur des notations formelles qui dcrivent sans
ambigut lensemble des rgles.
Comment excuter un programme rdig dans un langage de programmation de haut niveau sur un ordinateur qui, nous le savons, ne sait traiter que des programmes crits dans son
langage machine ? Voici deux grandes familles de mthodes qui permettent de rsoudre ce
problme :
- La premire mthode consiste traduire le programme, appel source, crit dans le
langage de haut niveau, en un programme smantiquement quivalent crit dans le
langage machine de lordinateur (voir la figure 1.2). Cette traduction est faite au moyen
dun logiciel spcialis appel compilateur. Un compilateur possde au moins quatre
phases : trois phases danalyse (lexicale, syntaxique et smantique), et une phase de
production de code machine. Bien sr, le compilateur ne produit le code machine
que si le programme source respecte les rgles du langage, sinon il devra signaler les
erreurs au moyen de messages prcis. En gnral, le compilateur produit du code pour
un seul type de machine, celui sur lequel il est install. Notez que certains compilateurs, dits multicibles, produisent du code pour diffrentes familles dordinateurs.
programme
source

compilateur

donnes

langage
machine

rsultats

F IGURE 1.2 Traduction en langage machine.

- Nous avons vu quun langage de programmation dfinit un ordinateur fictif. La seconde


mthode consiste simuler le fonctionnement de cet ordinateur fictif sur lordinateur
rel par interprtation des instructions du langage de programmation de haut niveau.
Le logiciel qui effectue cette interprtation sappelle un interprte. Linterprtation
directe des instructions du langage est en gnral difficilement ralisable. Une premire phase de traduction du langage de haut niveau vers un langage intermdiaire
de plus bas niveau est dabord effectue. Remarquez que cette phase de traduction

Chapitre 1 Introduction

comporte les mmes phases danalyse quun compilateur. Linterprtation est alors
faite sur le langage intermdiaire. Cest la technique dimplantation du langage JAVA
(voir la figure 1.3), mais aussi de beaucoup dautres langages. Un programme source
JAVA est dabord traduit en un programme objet crit dans un langage intermdiaire,
appel JAVA pseudo-code (ou byte-code). Le programme objet est ensuite excut par
la machine virtuelle JAVA, JVM (Java Virtual Machine).

programme
source Java

compilateur

langage
intermdiaire

interprte
JVM

rsultats

donnes

F IGURE 1.3 Traduction et interprtation dun programme J AVA.

Ces deux mthodes, compilation et interprtation, ne sont pas incompatibles, et bien souvent pour un mme langage les deux techniques sont mises en uvre. Lintrt de linterprtation est dassurer au langage, ainsi quaux programmes, une grande portabilit. Ils dpendent
faiblement de leur environnement dimplantation et peu ou pas de modifications sont ncessaires leur excution dans un environnement diffrent. Son inconvnient majeur est que le
temps dexcution des programmes interprts est notablement plus important que celui des
programmes compils.
Bref historique
La conception des langages de programmation a souvent t influence par un domaine
dapplication particulier, un type dordinateur disponible, ou les deux la fois. Depuis prs
de soixante ans, plusieurs centaines de langages de programmation ont t conus. Certains
nexistent plus, dautres ont eu un usage limit, et seule une minorit sont vraiment trs utiliss 5 . Le but de ce paragraphe est de donner quelques repres importants dans lhistoire des
langages de programmation classiques . Il nest pas question de dresser ici un historique
exhaustif. Le lecteur pourra se reporter avec intrt aux ouvrages [Sam69, Wex81, Hor83]
qui retracent les vingt-cinq premires annes de cette histoire, [ACM93] pour les quinze
annes qui suivirent, et [M+ 89] qui prsente un panorama complet des langages objets.
5. Voir les classements donns par lang-index.sourceforge.net ou www.tiobe.com.

1.3

Les langages de programmation

F ORTRAN (Formula Translator) [Int57, ANS78] fut le premier traducteur en langage machine dune notation algbrique pour crire des formules mathmatiques. Il fut conu IBM
partir de 1954 par J. BACKUS en collaboration avec dautres chercheurs. Jusqu cette date,
les programmes taient crits en langage machine ou dassemblage, et limportance de F OR TRAN a t de faire la dmonstration, face au scepticisme de certains, de lefficacit de la
traduction automatique dune notation volue pour la rdaction de programmes de calcul
numrique scientifique. lorigine, F ORTRAN nest pas un langage et ses auteurs nen imaginaient pas la conception. En revanche, ils ont invent des techniques doptimisation de code
particulirement efficaces.
L ISP (List Processor) a t dvelopp partir de la fin de lanne 1958 par J. M C C ARTHY
au MIT (Massachusetts Institute of Technology) pour le traitement de donnes symboliques
(i.e. non numriques) dans le domaine de lintelligence artificielle. Il fut utilis pour rsoudre
des problmes dintgration et de diffrenciation symboliques, de preuve de thormes, ou
encore de gomtrie et a servi au dveloppement de modles thoriques de linformatique.
La notation utilise, appele S-expression, est plus proche dun langage dassemblage dune
machine abstraite spcialise dans la manipulation de liste (le type de donne fondamental ;
un programme L ISP est lui-mme une liste) que dun vritable langage de programmation.
Cette notation prfixe de type fonctionnel utilise les expressions conditionnelles et les fonctions rcursives bases sur la notation (lambda) de A. C HURCH. Une notation, appele
M-expression, sinspirant de F ORTRAN et traduire en S-expression, avait t conue la fin
des annes 1950 par J. M C C ARTHY, mais na jamais t implmente. Hormis L ISP 2, un
langage inspir de A LGOL 60 (voir paragraphes suivants) dvelopp et implment au milieu
des annes 1960, les nombreuses versions et variantes ultrieures de L ISP seront bases sur la
notation S-expression. L ISP et ses successeurs font partie des langages dits fonctionnels (cf.
le chapitre 13). Il est noter aussi que L ISP est le premier mettre en uvre un systme de
rcupration automatique de mmoire (garbage-collector).
La gestion est un autre domaine important de linformatique. Au cours des annes 1950
furent dvelopps plusieurs langages de programmation spcialiss dans ce domaine. partir
de 1959, un groupe de travail comprenant des universitaires, mais surtout des industriels
amricains, sous lgide du Dpartement de la Dfense des tats-Unis (DOD), rflchit
la conception dun langage commun pour les applications de gestion. Le langage C OBOL
(Common Business Oriented Language) [Cob60] est le fruit de cette rflexion. Il a pos les
premires bases de la structuration des donnes.
On peut dire que les annes 1950 correspondent lapproche exprimentale de ltude des
concepts des langages de programmation. Il est notable que F ORTRAN, L ISP et C OBOL, sous
des formes qui ont bien volu, sont encore largement utiliss aujourdhui. Les annes 1960
correspondent lapproche mathmatique de ces concepts, et le dveloppement de ce quon
appelle la thorie des langages. En particulier, beaucoup de notations formelles sont apparues
pour dcrire la smantique des langages de programmation.
De tous les langages, A LGOL 60 (Algorithmic Language) [Nau60] est celui qui a eu le plus
dinfluence sur les autres. Cest le premier langage dfini par un comit international (prsid
par J. BACKUS et presque uniquement compos duniversitaires), le premier sparer les
aspects lexicaux et syntaxiques, donner une dfinition syntaxique formelle, la Forme de

Chapitre 1 Introduction

10

BACKUS -NAUR 6 , et le premier soumettre la dfinition lensemble de la communaut


pour en permettre la rvision avant de figer quoi que ce soit. De nombreux concepts, que lon
retrouvera dans la plupart des langages de programmation qui suivront, ont t dfinis pour la
premire fois dans A LGOL 60 (la structure de bloc, le concept de dclaration, le passage des
paramtres, les procdures rcursives, les tableaux dynamiques, les noncs conditionnels
et itratifs, le modle de pile dexcution, etc.). Pour toutes ces raisons, et malgr quelques
lacunes mises en vidence par D. K NUTH [Knu67], A LGOL 60 est le langage qui fit le plus
progresser linformatique.
Dans ces annes 1960, des tentatives de dfinition de langages universels, cest--dire
pouvant sappliquer tous les domaines, ont vu le jour. Les langages PL/I (Programming
Language One) [ANS76] et A LGOL 68 reprennent toutes les bonnes caractristiques de
leurs ans conus dans les annes 1950. PL/I cherche combiner en un seul langage C O BOL , L ISP , F ORTRAN (entre autres langages), alors quA LGOL 68 est le successeur officiel
dA LGOL 60. Ces langages, de par la trop grande complexit de leur dfinition, et par consquence de leur utilisation, nont pas connu le succs attendu.
Lui aussi fortement inspir par A LGOL 60, PASCAL [NAJN75, AFN82] est conu par
N. W IRTH en 1969. Dune grande simplicit conceptuelle, ce langage algorithmique a servi
(et peut-tre encore aujourdhui) pendant de nombreuses annes lenseignement de la programmation dans les universits.
Le langage C [KR88, ANS89] a t dvelopp en 1972 par D. R ITCHIE pour la rcriture
du systme dexploitation U NIX. Conu lorigine comme langage dcriture de systme,
ce langage est utilis pour la programmation de toutes sortes dapplications. Malgr de nombreux dfauts, C est encore trs utilis aujourdhui, sans doute pour des raisons defficacit
du code produit et une certaine portabilit des programmes. Ce langage a t normalis en
1989 par lANSI 7 , puis en 1999 et 2011 par lISO 8 (normes C99 et C11).
Les annes 1970 correspondent lapproche gnie logiciel . Devant le cot et la complexit toujours croissants des logiciels, il devient essentiel de dvelopper de nouveaux langages puissants, ainsi quune mthodologie pour guider la construction, matriser la complexit, et assurer la fiabilit des programmes. A LPHARD [W+ 76] et C LU [L+ 77], deux
langages exprimentaux, M ODULA-2 [Wir85], ou encore A DA [ANS83] sont des exemples
parmi dautres de langages imposant une mthodologie dans la conception des programmes.
Une des originalits du langage A DA est certainement son mode de dfinition. Il est le produit
dun appel doffres international lanc en 1974 par le DOD pour unifier la programmation de
ses systmes embarqus. Suivirent de nombreuses annes dtude de conception pour dboucher sur une norme (ANSI, 1983), pose comme pralable lexploitation du langage.
Les langages des annes 1980-1990, dans le domaine du gnie logiciel, mettent en avant le
concept de la programmation objet. Cette notion nest pas nouvelle puisquelle date de la fin
des annes 1960 avec S IMULA [DN66], certainement le premier langage objets. S MALL TALK [GR89], C++ [Str86] (issu de C), E IFFEL [Mey92], ou JAVA [GJS96, GR11], ou encore
plus rcemment C# [SG08] sont, parmi les trs nombreux langages objets, les plus connus.
6. lorigine appele Forme Normale de BACKUS.
7. American National Standards Institute, linstitut de normalisation des tats-Unis.
8. International Organization for Standardization, organisme de normalisation reprsentant 164 pays dans le
monde.

1.4

Construction des programmes

11

JAVA connat aujourdhui un grand engouement, en particulier grce au web et Internet.


Ces quinze dernires annes bien dautres langages ont t conus autour de cette technologie. Citons, par exemple, les langages de script (langages de commandes conus pour tre
interprts) JAVA S CRIPT [Fla10] destin la programmation ct client, et PHP [Mac10]
dfini pour la programmation ct serveur HTTP.
Dans le domaine de lintelligence artificielle, nous avons dj cit L ISP. Un autre langage,
le langage dclaratif P ROLOG (Programmation en Logique) [CKvC83], conu ds 1972 par
lquipe marseillaise de A. C OLMERAUER, a connu une grande notorit dans les annes
1980. P ROLOG est issu de travaux sur le dialogue homme-machine en langage naturel et sur
les dmonstrateurs automatiques de thormes. Un programme P ROLOG ne sappuie plus sur
un algorithme, mais sur la dclaration dun ensemble de rgles partir desquelles les rsultats
pourront tre dduits par unification et rtro-parcours (backtracking) laide dun valuateur
spcialis.
Poursuivons cet historique par le langage I CON [GHK79]. Il est le dernier dune famille
de langages de manipulation de chanes de caractres (S NOBOL 1 4 et SL5) conus par
R. G RISWOLD ds 1960 pour le traitement de donnes symboliques. Ces langages intgrent
le mcanisme de confrontation de modles (pattern matching), la notion de succs et dchec
de lvaluation dune expression, mais lide la plus originale introduite par I CON est celle du
mcanisme de gnrateur et dvaluation dirige par le but. Un gnrateur est une expression
qui peut fournir zro ou plusieurs rsultats, et lvaluation dirige par le but permet dexploiter les squences de rsultats produites par les gnrateurs. Ces langages ont connu un vif
succs et il existe aujourdhui encore une grande activit autour du langage I CON.
Si lide de langages universels des annes 1960 a t aujourdhui abandonne, plusieurs
langages dits multiparadigme ont vu le jour ces dernires annes. Parmi eux, citons, pour terminer ce bref historique, les langages P YTHON [Lut09], RUBY [FM08] et S CALA [OSV08].
Les deux premiers langages sont typage dynamique (vrification de la cohrence des types
de donnes lexcution) et incluent les paradigmes fonctionnel et objet. De plus, P YTHON
intgre la notion de gnrateur similaire celle dI CON, et RUBY permet la manipulation des
processus lgers (threads) pour la programmation concurrente. S CALA, quant lui, intgre
les paradigmes objet et fonctionnel avec un typage statique fort. La mise en uvre du langage
permet la production de bytecode pour la machine virtuelle JVM, ce qui lui offre une grande
compatibilit avec le langage JAVA.

1.4

CONSTRUCTION DES PROGRAMMES

Lactivit de programmation est difficile et complexe. Le but de tout programme est de calculer et retourner des rsultats valides et fiables. Quelle que soit la taille des programmes, de
quelques dizaines de lignes plusieurs centaines de milliers, la conception des programmes
exige des mthodes rigoureuses, si les objectifs de justesse et de fiabilit veulent tre atteints.
Dune faon trs gnrale, on peut dire quun programme effectue des actions sur des
objets. Jusque dans les annes 1960, la structuration des programmes ntait pas un souci
majeur. Cest partir des annes 1970, face des cots de dveloppement des logiciels
croissants, que lintrt pour la structuration des programmes sest accru. cette poque,

12

Chapitre 1 Introduction

les mthodes de construction des programmes commenaient par structurer les actions. La
structuration des objets venait ultrieurement. Depuis la fin des annes 1980, le processus
est invers. Essentiellement pour des raisons de prennit (relative) des objets par rapport
celle des actions : les programmes sont structurs dabord autour des objets. Les choix de
structuration des actions sont fixs par la suite.
Lorsque le choix des actions prcde celui des objets, le problme rsoudre est dcompos, en termes dactions, en sous-problmes plus simples, eux-mmes dcomposs
en dautres sous-problmes encore plus simples, jusqu obtenir des lments directement
programmables. Avec cette mthode de construction, souvent appele programmation descendante par raffinements successifs, la reprsentation particulire des objets, sur lesquels
portent les actions, est retarde le plus possible. Lanalyse du problme traiter se fait dans
le sens descendant dune arborescence, dont chaque nud correspond un sous-problme
bien dtermin du programme construire. Au niveau de la racine de larbre, on trouve
le problme pos dans sa forme initiale. Au niveau des feuilles, correspondent des actions
pouvant snoncer directement et sans ambigut dans le langage de programmation choisi.
Sur une mme branche, le passage du nud pre ses fils correspond un accroissement
du niveau de dtail avec lequel est dcrite la partie correspondante. Notez que sur le plan
horizontal, les diffrents sous-problmes doivent avoir chacun une cohrence propre et donc
minimiser leur nombre de relations.
En revanche, lorsque le choix des objets prcde celui des actions, la structure du programme est fonde sur les objets et sur leurs interactions. Le problme rsoudre est vu
comme une modlisation (oprationnelle) dun aspect du monde rel constitu dobjets. Cette
vision est particulirement vidente avec les logiciels graphiques et plus encore, de simulation. Les objets sont des composants qui contiennent des attributs (donnes) et des mthodes
(actions) qui dcrivent le comportement de lobjet. La communication entre objets se fait par
envoi de messages, qui donne laccs un attribut ou qui lance une mthode.
Les critres de fiabilit et de validit ne sont pas les seuls caractriser la qualit dun
programme. Il est frquent quun programme soit modifi pour apporter de nouvelles fonctionnalits ou pour voluer dans des environnements diffrents, ou soit dpec pour fournir
des pices dtaches dautres programmes. Ainsi de nouveaux critres de qualit, tels
que lextensibilit, la compatibilit ou la rutilisabilit, viennent sajouter aux prcdents.
Nous verrons que lapproche objet, bien plus que la mthode traditionnelle de dcomposition
fonctionnelle, permet de mieux respecter ces critres de qualit.
Les actions mises en jeu dans les deux mthodologies prcdentes reposent sur la notion
dalgorithme 9 . Lalgorithme dcrit, de faon non ambigu, lordonnancement des actions
effectuer dans le temps pour spcifier une fonctionnalit traiter de faon automatique. Il est
dnot laide dune notation formelle, qui peut tre indpendante du langage utilis pour le
programmer.
La conception dalgorithme est une tche difficile qui ncessite une grande rflexion. Notez que le travail requis pour lexprimer dans une notation particulire, cest--dire la pro9. Le mot algorithme ne vient pas, comme certains le pensent, du mot logarithme, mais doit son origine
un mathmaticien persan du IXe sicle, dont le nom abrg tait A L -K HOWRIZM (de la ville de Khowrizm).
Cette ville situe dans lzbekistan, sappelle aujourdhui Khiva. Notez toutefois que cette notion est bien plus
ancienne. Les Babyloniens de lAntiquit, les gyptiens ou les Grecs avaient dj formul des rgles pour rsoudre
des quations. Euclide (vers 300 av. J.-C.) conut un algorithme permettant de trouver le pgcd de deux nombres.

1.5

Dmonstration de validit

13

grammation de lalgorithme dans un langage particulier, est rduit par comparaison celui
de sa conception. La rflexion sur papier, stylo en main, sera le pralable toute programmation sur ordinateur.
Pour un mme problme, il existe bien souvent plusieurs algorithmes qui conduisent sa
solution. Le choix du meilleur algorithme est alors gnralement guid par des critres
defficacit. La complexit dun algorithme est une mesure thorique de ses performances en
fonction dlments caractristiques de lalgorithme. Le mot thorique signifie en particulier
que la mesure est indpendante de lenvironnement matriel et logiciel. Nous verrons la
section 10.5 page 114 comment tablir cette mesure.
Le travail principal dans la conception dun programme rsidera dans le choix des objets qui le structureront, la validation de leurs interactions et le choix et la vrification des
algorithmes sous-jacents.

1.5

DMONSTRATION DE VALIDIT

Notre but est de construire des programmes valides, cest--dire conformes ce que lon
attend deux. Comment vrifier la validit dun programme ? Une fois le programme crit,
on peut, par exemple, tester son excution. Si la phase de test, cest--dire la vrification
exprimentale par lexcution du programme sur des donnes particulires, est ncessaire,
elle ne permet en aucun cas de dmontrer la justesse 100% du programme. En effet, il
faudrait faire un test exhaustif sur lensemble des valeurs possibles des donnes. Ainsi, pour
une simple addition de deux entiers cods sur 32 bits, soit 232 valeurs possibles par entier,
il faudrait tester 2322 oprations. Pour une microseconde par opration, il faudrait 9 109
annes ! N. W IRTH rsume cette ide dans [Wir75] par la formule suivante :
Lexprimentation des programmes peut servir montrer la prsence derreurs, mais
jamais prouver leur absence.
La preuve 10 de la validit dun programme ne pourra donc se faire que formellement de
faon analytique, tout le long de la construction du programme et, videmment, pas une fois
que celui-ci est termin.
La technique que nous utiliserons est base sur des assertions qui dcriront les proprits
des lments (objets, actions) du programme. Par exemple, une assertion indiquera quen tel
point du programme telle valeur entire est ngative.
Nous parlerons plus tard des assertions portant sur les objets. Celles pour dcrire les proprits des actions, cest--dire leur smantique, suivront laxiomatique de C.A.R. H OARE
[Hoa69]. Lassertion qui prcde une action sappelle lantcdent ou pr-condition et celle
qui la suit le consquent ou post-condition.
Pour chaque action du programme, il sera possible, grce des rgles de dduction, de dduire de faon systmatique le consquent partir de lantcdent. Notez quil est galement
possible de dduire lantcdent partir du consquent. Ainsi pour une tche particulire,
forme par un enchanement dactions, nous pourrons dmontrer son exactitude, cest--dire
10. La preuve de programme est un domaine de recherche thorique ancien, mais toujours ouvert et trs actif.

Chapitre 1 Introduction

14

le passage de lantcdent initial jusquau consquent final, par application des rgles de
dduction sur toutes les actions qui le composent.
Il est important de comprendre que les affirmations ne doivent pas tre dfinies a posteriori, cest--dire une fois le programme crit, mais bien au contraire a priori puisquil sagit
de construire laction en fonction de leffet prvu.
Une action A avec son antcdent et son consquent sera dnote :
{antcdent}
A
{consquent}

Les assertions doivent tre le plus formelles possible, si lon dsire prouver la validit du
programme. Elles sapparentent dailleurs la notion mathmatique de prdicat. Toutefois,
il sera ncessaire de trouver un compromis entre leur complexit et celle du programme. En
dautres termes, sil est plus difficile de construire ces assertions que le programme lui-mme,
on peut se demander quel est leur intrt ?
Certains langages de programmation, en fait un nombre rduit 11 , intgrent des mcanismes de vrification de la validit des assertions spcifies par les programmeurs. Dans
ces langages, les assertions font donc parties intgrantes du programme. Elles sont contrles au fur et mesure de lexcution du programme, ce qui permet de dtecter une situation
derreur. En JAVA, une assertion est reprsente par une expression boolenne introduite par
lnonc assert. Le caractre boolen de lassertion est toutefois assez rducteur car bien
souvent les programmes doivent utiliser des assertions avec les quantificateurs de la logique
du premier ordre que cet nonc ne pourra exprimer. Des extensions au langage laide
dannotations spciales, comme [LC06], ont t rcemment proposes pour obtenir une spcification formelle des programmes JAVA.
Dans les autres langages, les assertions, mme si elles ne sont pas traites automatiquement par le systme, devront tre exprimes sous forme de commentaires. Ces commentaires
serviront lauteur du programme, ou aux lecteurs, se convaincre de la validit du programme.

11. Citons certains langages exprimentaux conus dans les annes 1970, tels que A LPHARD [M. 81], ou plus
rcemment E IFFEL.

Chapitre 2

Actions lmentaires

Un programme est un processus de calcul qui peut tre modlis de diffrentes faons.
Dans le modle de programmation imprative que nous prsentons dans cet ouvrage, un programme est une suite de commandes qui effectuent des actions sur des donnes appeles
objets, et il peut tre dcrit par une fonction f dont lensemble de dpart D est un ensemble
de donnes, et lensemble darrive R est un ensemble de rsultats :
f :DR
ce schma, on peut faire correspondre trois premires actions lmentaires, ou noncs simples, que sont la lecture dune donne, lexcution dune routine prdfinie sur cette
donne et lcriture dun rsultat.

2.1

LECTURE DUNE DONNE

La lecture dune donne consiste faire entrer un objet en mmoire centrale partir dun
quipement externe. Selon le cas, cette action peut prciser lquipement sur lequel lobjet
doit tre lu, et o il se situe sur cet quipement. La faon dexprimer lordre de lecture varie
bien videmment dun langage un autre. Pour linstant, nous nous occuperons uniquement
de lire des donnes au clavier, cest--dire sur lentre standard et nous appellerons lire laction de lecture.
Une fois lu, lobjet plac en mmoire doit porter un nom, permettant de le distinguer sans
ambigut des objets dj prsents. Ce nom sera cit chaque fois quon utilisera lobjet en
question dans la suite du programme. Cest laction de lecture qui prcise le nom de lobjet

Chapitre 2 Actions lmentaires

16

lu. La lecture dun objet sur lentre standard placer en mmoire centrale sous le nom x
scrit de la faon suivante :
{il existe une donne lire sur lentre standard}
lire(x)
{une donne a t lue sur lentre standard,
place en mmoire centrale et le nom x permet de la dsigner}

Notez que plusieurs commandes de lecture peuvent tre excutes les unes la suite des
autres. Si le mme nom est utilis chaque fois, il dsignera la dernire donne lue.

2.2

EXCUTION DUNE ROUTINE PRDFINIE

Lobjet qui vient dtre lu et plac en mmoire peut tre la donne dun calcul, et en
particulier la donne dune routine, procdure ou fonction, prdfinie. On dit alors que lobjet
est un paramtre effectif donne de la routine.
Une routine prdfinie est une suite dinstructions, bien souvent conserves dans des bibliothques, qui sont directement accessibles par le programme. Traditionnellement, les langages de programmation proposent des fonctions mathmatiques et des procdures dentressorties.
Lexcution dune procdure ou dune fonction est une action lmentaire qui correspond
ce quon nomme un appel de procdure ou de fonction. Par exemple, la notation sin(x)
est un appel de fonction qui calcule le sinus de x, o x dsigne le nom de lobjet en mmoire.
Une fois lappel dune procdure ou dune fonction effectu, comment rcuprer le rsultat
du calcul ?
Sil sagit dune fonction f , la notation f(x) sert la fois commander lappel et
nommer le rsultat. Cest la notion de fonction des mathmaticiens. Ainsi, sin(x) est la
fois lappel de la fonction et le rsultat.
{le nom x dsigne une valeur en mmoire}
sin(x)
{lappel de sin(x) a calcul le sinus de x}

Bien videmment, il est possible de fournir plusieurs paramtres donne lors de lappel
dune fonction. Par exemple, la notation f(x,y,z) correspond lappel dune fonction f
avec trois donnes nommes respectivement x, y et z.
Il peut tre galement utile de donner un nom au rsultat. Avec une procdure, il sera
possible de prciser ce nom au moment de lappel, sous la forme dun second paramtre,
appel paramtre effectif rsultat .
{le nom x dsigne une valeur en mmoire}
P(x,y)
{lappel de la procdure P sur la donne x
a calcul un rsultat dsign par y}

Comme une fonction, une procdure peut possder plusieurs paramtres donne . De
plus, si elle produit plusieurs rsultats, ils sont dsigns par plusieurs paramtres rsultat .

You might also like