Академический Документы
Профессиональный Документы
Культура Документы
Principes de base,
techniques de programmation
Michel Beaudouin-Lafon
Armand Colin 1992
Table des matires
Chapitre 1 - INTRODUCTION ..............................................1
1.1 Le champ des langages...............................................1
1.2 Historique...................................................................8
1.3 Plan du livre .............................................................12
Bibliographie.....................................................................141
Index.................................................................................145
Avant-propos
Ce livre a pour objectif de prsenter les langages objets et la
programmation par objets d'une manire gnrale et nanmoins
prcise. Le nombre de langages objets existant aujourd'hui et
leur diversit interdisent une tude exhaustive dans un ouvrage
de cette taille. C'est pourquoi l'on s'est attach identifier un
nombre rduit de concepts de base, partags par de nombreux
langages, et illustrer ces concepts par des exemples concrets. Il
ne s'agit donc pas d'apprendre programmer avec un langage
objets (d'autres ouvrages, spcialiss, s'y emploient), mais de
matriser les principes de ces langages et les techniques de la
programmation par objets.
INTRODUCTION
Les langages objets sont apparus depuis quelques annes
comme un nouveau mode de programmation. Pourtant la
programmation par objets date du milieu des annes 60 avec
Simula, un langage cr par Ole Dahl et Kristen Nygaard en
Norvge et destin programmer des simulations de processus
physiques. Bien que de nombreux travaux de recherche aient
eu lieu depuis cette poque, lessor des langages objets est
beaucoup plus rcent. Ce livre essaie de montrer que les
langages objets ne sont pas une mode passagre, et que la
programmation par objets est une approche gnrale de la
programmation qui offre de nombreux avantages.
1.2 HISTORIQUE
La figure 1 prsente la gnalogie des principaux langages
objets. On y distingue deux ples autour des langages Simula et
Smalltalk.
La famille Simula
Algol Lisp
1960
Simula
Plasma
La famille Smalltalk
PRINCIPES DE BASE
Un langage objets utilise les notions de classe et dinstance,
que lon peut comparer aux notions de type et de variable dun
langage tel que Pascal. La classe dcrit les caractristiques
communes toutes ses instances, sous une forme similaire un
type enregistrement ( record Pascal). Une classe dfinit donc
un ensemble de champs. De plus, une classe dcrit un ensemble
de mthodes, qui sont les oprations ralisables sur les instances
de cette classe. Ainsi une classe est une entit autonome. Au lieu
dappliquer des procdures ou fonctions globales des
variables, on invoque les mthodes des instances. Cette
invocation est souvent appele envoi de message. De fait, on
peut considrer que lon envoie un message une instance pour
quelle effectue une opration, cest--dire pour quelle
dtermine la mthode invoquer.
Lien d'hritage
Classe de Base Lien d'instanciation
Classe
Champs Objet
Mthodes
Envoi de message
Pile
pile
sommet pile
sommet O
Empiler
Dpiler
Sommet
2.3 LHRITAGE
La notion dhritage est propre aux langages objets. Elle
permet la dfinition de nouvelles classes partir de classes
existantes. Supposons que lon veuille programmer le jeu des
Tours de Hanoi. On dispose de trois tours ; sur la premire sont
empils des disques de taille dcroissante. On veut dplacer ces
disques sur lune des deux autres tours en respectant les deux
rgles suivantes :
on ne peut dplacer quun disque la fois ;
on ne peut poser un disque sur un disque plus petit.
Pile
pile
sommet
Tour
Empiler
Dpiler
Sommet
Empiler
Larbre dhritage
B C
b c
2.5 LE POLYMORPHISME
La notion de polymorphisme recouvre la capacit pour un
langage de dcrire le comportement dune procdure de faon
indpendante de la nature de ses paramtres. Ainsi la procdure
qui change les valeurs de deux variables est polymorphe si lon
peut lcrire de faon indpendante du type de ses paramtres.
De faon similaire la procdure Empiler est polymorphe si elle
ne dpend pas du type de la valeur empiler.
Mtaclasse
mtaclasses
Base
Drive
classes
objets
Figure 6 - La notion de mtaclasse
LANGAGES OBJETS
TYPS
Ce chapitre prsente les langages objets typs, dont Simula est
lanctre. Ce dernier tant peu utilis aujourdhui, ce sont les
langages plus rcents C++, Eiffel et Modula3 qui nous serviront
de base. La premire version de C++ a t dfinie en 1983 par
Bjarne Stroustrup aux Bell Laboratories, le mme centre de
recherches o sont ns Unix et le langage C. Eiffel est un
langage cr partir de 1985 par Bertrand Meyer de Interactive
Software Engineering, Inc. Modula3 est une nouvelle version de
Modula dveloppe depuis 1988 au Systems Research Center de
DEC sous limpulsion de Luca Cardelli et Greg Nelson.
p1.Empiler (10);
p1.Empiler (15);
p1.Dpiler ();
s := p1.Sommet (); -- s vaut 10
La pseudo-variable moi
1 Vider
Pile
pile 2 Vider ( ) {
sommet tant que sommet > 0 faire
Dpiler ( );
3 }
4 Dpiler ( ) {
}
Sommet = classe {
champs
-- reprsentation des arcs adjacents
mthodes
procdure Ajouter (a : Arc);
}
Arc = classe {
champs
dpart, arrive : Sommet;
mthodes
procdure Relier (s1, s2 : Sommet);
}
42 Les langages objets
Entier = classe {
champs
valeur : entier;
mthodes
procdure Valeur (v : entier);
}
procdure Entier.Valeur (v : entier) {
valeur := v;
}
et si lon change le type entier par la classe Entier dans la classe
Pile, on ne peut plus crire
p1.Empiler (10);
car 10 est une valeur du type prdfini entier, et non un objet de
la classe Entier. Sans mcanisme particulier du langage, il faut
crire :
v : Entier;
v.Valeur (10);
p1.Empiler (v);
3.2 HRITAGE
Nous allons maintenant prsenter comment est mis en uvre
lun des concepts de base des langages objets : lhritage.
Nous allons pour cela prsenter les deux principales utilisations
de lhritage, la spcialisation et lenrichissement.
Pile
Empiler Tour
t.Dpiler;
t.Empiler (20);
t.Empiler (5); -- impossible dempiler
Fentre = classe {
mthodes
procdure Effacer ();
}
Rectangle = classe {
mthodes
procdure Centre (posX, posY : entier);
procdure Taille (largeur, hauteur : entier);
procdure Dessiner (f : Fentre);
}
procdure TourG.Dpiler () {
Tour.Dpiler ();
Dessiner ();
}
Pile
Tour Fentre
Tour GM
procdure TourGM.Dessiner () {
rect : Rectangle;
Effacer ();
pour i := 1 sommet faire {
rect.Centre (x, y - i);
rect.Taille (pile [i], 1);
rect.Dessiner (moi);
}
}
Tour
Empiler (v) {}
Statique
Initialiser (n) { 3'
pour i := n 1
Empiler (i)
}
2
Dynamique
Initialiser (4)
1
3
TourG
tg
Empiler (v) {}
Pile
Tour
une autre Pile
Empiler Code de Tour.Empiler
Depiler
Tables virtuelles
une Tour
{ -- exemple dutilisation
t : Tour (10); -- constructeur Tour (entier)
} -- appel du destructeur de t
Gnricit
3.7 CONCLUSION
La richesse des langages objets typs est encore loin dtre
puise. Les langages actuels souffrent encore du lourd hritage
des langages structurs. De nombreux travaux de recherche
concernent la smantique des systmes de types mis en uvre
dans ces langages, et dcouvrent la complexit des problmes
mis en jeu ds lors que lon veut combiner hritage multiple,
gnricit, surcharge, etc. Les langages actuels ont dj fait la
preuve de leurs qualits : scurit pour le programmeur, facilit
de maintenance, rutilisation des classes, efficacit du code
excutable. Ils sont de plus en plus facilement adopts dans les
entreprises pour le dveloppement de logiciels complexes :
systmes dexploitation, environnements de programmation,
interfaces graphiques, simulation, etc.
Chapitre 4
SMALLTALK
ET SES DRIVS
Nous allons prsenter dans ce chapitre le langage Smalltalk et
les langages qui en sont drivs. Ils prsentent la caractristique
commune dtre des langages non typs et interprts ou semi-
compils.
receveur msg1
receveur msg2 argument
receveur cl1: arg1 cl2: arg2 cln: argn
incr [ n n + 1 ].
incr valeur. -- ajoute 1 n
ajouter [ :x | n n + x ]. -- paramtre = x
ajouter valeur: 10. -- ajouter 10 n
Nouveau
Pile Pile
classe Pile
superclasse Objet
champs pile sommet
mthodes
Initialiser
pile Tableau Nouveau.
sommet 0.
Empiler: unObjet
sommet sommet + 1.
pile en: sommet mettre: unObjet.
Dpiler
sommet sommet - 1.
Sommet
pile en: sommet.
4.3 HRITAGE
Laxiome 3 indique que toute classe est sous-classe dune
autre classe. Cet axiome dtermine larbre dhritage qui lie les
classes entre elles. Nous avons vu quune classe prdfinie,
Objet, faisait exception cet axiome. Objet est la racine de
larbre dhritage, cest--dire que, directement ou
indirectement, toute classe est une sous-classe de Objet.
Objet
NeComprendsPas 6
(Coucou)
3
(NeComprendsPas)
Pile (Coucou)
Dpiler 5
2
b
NeComprendsPas: Coucou
4
Dpiler a
Coucou 1
Self et Super
Empiler
Pile
1
Empiler: v [ ]
Hpile
2 Empiler: v [ 3
super Empiler: v
]
classe Vrai
superclasse Boolen
champs
mthodes
siVrai: blocVrai siFaux: blocFaux
blocVrai valeur.
classe Faux
superclasse Boolen
champs
mthodes
siVrai: blocVrai siFaux: blocFaux
blocFaux valeur.
Vrai Faux
2 3 5 6
vrai faux
1 4
vrai non ou: faux faux
classe Boolen
superclasse Objet
champs
mthodes
siVrai: unBloc
self siVrai: unBloc siFaux: [ ].
siFaux: unBloc
self siVrai: [ ] siFaux: unBloc.
xor: unBool
(self ou: unBool)
et: ((self et: unBool) non).
Vrai Faux
2 3 5 6
vrai faux
1 4
vrai non ou: faux faux
classe Bloc
mthodes
tantQueVrai: corps
(self valeur) siVrai: [ corps valeur.
self tantQueVrai: corps ].
classe Intervalle
superclasse Objet
champs inf sup
mthodes
Inf: i Sup: s
inf i. sup s.
rpter: corps
|i|
i inf.
[ i < sup ] tantQueVrai:
[ corps valeur: i.
i i + 1 ].
4.5 MTACLASSES
Nous avons vu ds la prsentation des axiomes de base de
Smalltalk que toute classe est un objet, et appartient donc une
classe, appele mtaclasse. Cette caractristique est la base de
nombreuses possibilits intressantes dans Smalltalk.
Classe Classe
Nouveau
2 Pile Pile
1 Nouveau
MtaClasse Objet
Classe
ClasseTour
Pile
ClassePile
Tour
ClassePile
Pile
Nouveau
Initialiser
3 6
ClasseTour
Tour 5
Nouveau 2
Nouveau 1
4
Initialiser
classe Pile
mthodes
Initialiser: taille
pile Tableau Nouveau: taille.
sommet 0.
classe ClassePile
mthodes
Nouveau: taille
super Nouveau Initialiser: taille.
Variables de classe
Pour illustrer cela, nous allons crer une classe dobjets dont
les instances ont un numro unique. La mtaclasse a un champ
qui est incrment chaque instanciation :
classe Dmo
superclasse Objet
champs numro
mthodes
Initialiser: n
numro n.
Numro
numro.
classe ClasseDmo
champs nb
mthodes
Nouveau
nb nb + 1.
(super Nouveau) Initialiser: nb.
(def-mthode
(Empiler Pile) (objet) -- mthode, classe, arguments
(setq sommet (+ sommet 1))
(envoi mettre pile sommet objet))
Classe Objet
ClassePile Pile
unePile
Tour
uneTour
4.7 CONCLUSION
Smalltalk est sans conteste le langage qui est lorigine du
succs du modle des objets. Trs rapidement, le langage a t
valid par la ralisation dapplications importantes, en
particulier lenvironnement de programmation Smalltalk. De
leur ct, les extensions de Lisp par les objets ont permis
dexprimenter et de mieux comprendre les mcanismes des
langages objets.
PROTOTYPES
ET ACTEURS
Ce chapitre prsente deux variations importantes des ides de
base des langages objets. Les langages de prototypes font
disparatre la diffrence entre classes et instances en introduisant
la notion unique dobjet prototype. Ils remplacent la notion
dhritage par celle de dlgation. Les langages dacteurs
gnralisent la notion denvoi de message pour ladapter la
programmation parallle : lenvoi de message nest plus une
invocation de mthode, mais une requte envoye un objet.
Prototypes et clonage
Pile P1 P2
La dlgation
protoPile {
Empiler: unObjet [ sommet: (sommet + 1).
pile en: sommet mettre: unObjet ].
Dpiler [ sommet: (sommet - 1) ].
Sommet [ pile en: sommet ].
}
protoPile Pile
Empiler pile
Dpiler sommet 0
Sommet
P1 P2
pile 10 pile 10 20
sommet 1 sommet 2
Pile {
parent protoPile.
pile Tableau cloner.
sommet 0.
}
protoTour {
parent protoPile.
Empiler: unObjet [
unObjet < Sommet
siVrai: [ parent Empiler: unObjet ]
siFaux: [ Empiler: objet trop grand crire ]
].
}
Tour (Pile cloner) parent: protoTour.
protoPile Pile
Empiler pile
Dpiler sommet
Sommet
protoTour Tour t
t Tour cloner.
t Empiler: 10.
t Empiler: 20. -- Empiler: objet trop grand
Comportements exceptionnels
t {
parent protoPile.
pile Tableau cloner.
sommet 0.
Empiler: unObjet [
unObjet < Sommet
siVrai: [ parent Empiler: unObjet ]
siFaux: [ Empiler: objet trop grand crire ]
].
}
t Empiler: 10.
t Empiler: 20. -- Empiler: objet trop grand
Champs calculs
Cartsien { Polaire {
parent protoPoint. parent protoPoint.
x 0. rho 0.
y 0. thta 0.
} }
Polaire {
parent protoPoint.
rho 0.
thta 0.
106 Les langages objets
Hritage dynamique
Conclusion
Evaluateur
Lecteur Imprimeur
fichier fichier
rception de message
acteur vie de l'acteur
tat
envoi de message
cration d'acteur
acteur mult
tat val rec
filtre
envoie: v [ rec envoie: (v * val)].
fact: 3 res
factorielle
envoie:
1
mult3
1, mult2
envoie: 1
mult2
2, mult1
envoie: 2
mult1
3, res1
envoie: 6
res
fact: 3 r1 fact: 4 r2
factorielle
6 24
Envoi de messages
Objets et acteurs
acteur Tour
tat pile sommet
filtre
Empiler: x [ pile en: sommet mettre: x .
sommet sommet + 1 ]
Dpiler [ sommet sommet - 1 ]
Sommet [ pile en: sommet ]
Lacteur Tour est ici une pile : nous navons pas insr le test
qui compare la taille de lobjet empil avec le sommet courant.
Ceci nest pas important dans cet exemple, car la rsolution par
programme des Tours de Hanoi assure que les rgles du jeu sont
respectes. Sommet est un message synchrone qui retourne
lobjet en sommet de pile. Nous avons suppos que lacteur qui
reprsente la pile sait rpondre aux messages daccs en: et
en:mettre:. Lempilement utilise un message synchrone.
acteur Hanoi
tat gauche droite centre nd
filtre
Initialiser
[ (1 nd) rpter [ :i | gauche Empiler: (nd - i) ] ]
dplacer: dp vers: arr
[ arr Empiler: (dp Sommet ). dp Dpiler ]
Jouer
[ jh crer JoueHanoi (self).
jh dplacer: nd de: gauche vers: droite
par: centre tag: 1 jh ]
Jouer
tours
G, C, D, 2
dplacer: 2
de: G vers: D par: C dplacer:
Hanoi G vers: C
tag: 1 jh
dplacer:
dplacer: 1 G vers: D
de: C vers: D par: G
tag: 3 c dplacer:
C vers: D
dplacer: 1
de: G vers: C par: D
tag: 2 c
jh
tours
tag: 2 tag: 3
JoueHanoi liste: {GC} liste: {CD}
tag: 1 liste:
{GC}{GD}{CD}
c
tours, 1,
{GD}, 0
Jointure
envoyer envoyer
Conclusion
PROGRAMMER
AVEC DES OBJETS
Ce chapitre prsente quelques techniques usuelles de program-
mation par objets et une bauche de mthodologie. Il se termine
par lexemple complet des Tours de Hanoi, qui complte les
classes Pile et Tour qui nous ont servi tout au long de ce livre.
Bien que ce chapitre sapplique aux langages objets typs
aussi bien quaux langages non typs, lexemple sera dvelopp
dans le langage que nous avons utilis au chapitre 3. Un certain
nombre de points seront donc spcifiques des langages typs.
Les classes composes sont des classes dont les instances sont
des assemblages de composants, ceux-ci tant accessibles de
lextrieur. Accessible signifie que lon peut avoir connaissance
des composants, mme si la classe contrle ou limite leur accs.
Par exemple, laccs aux composants peut tre en lecture seule,
ou bien par lintermdiaire de noms symboliques (indice,
chane de caractres). La classe des Tours de Hanoi est un
exemple de classe compose ; dans lexemple que nous
donnons plus loin dans ce chapitre, nous verrons que laccs
aux tours se fait de manire symbolique, par un type numr.
Les classes abstraites sont des classes qui ne sont pas prvues
pour tre instancies, mais seulement pour servir de racine une
hirarchie dhritage. En gnral, les classes abstraites nont pas
de champs. Leurs mthodes doivent tre redfinies dans les
classes drives, ou doivent appeler de telles mthodes. Une
classe abstraite sert dfinir un protocole gnral qui ne prjuge
pas de limplmentation des classes drives. Un bon gage
dextensibilit dun ensemble de classes est dinsrer des classes
abstraites en des points stratgiques de larbre dhritage.
Collection = classe {
mthodes
procdure Ajouter (Objet);
procdure Retirer (Objet);
fonction Chercher (Objet) : boolen;
fonction Suivant (Objet) : Objet;
}
Hritage ou imbrication ?
Hritage multiple
Les domaines visibles par des classes privilgies sont les plus
dlicats dfinir, car il faut viter la prolifration des classes
privilgies dune classe donne. Dans un systme bien conu,
les classes fonctionnent par groupes, et chaque classe a pour
classes privilgies les autres classes du groupe. Cela circonscrit
les dpendances entre classes et facilite la rutilisation.
La double distribution
OGraphique = classe {
mthodes
procdure AfficherFentre (aff : Fentre);
procdure AfficherImpr (aff : Imprimante);
}
Rectangle = classe OGraphique {
mthodes
procdure AfficherFentre (aff : Fentre) {
-- dessiner un rectangle dans une fentre
}
procdure AfficherImpr (aff : Imprimante) {
-- dessiner un rectangle sur une imprimante
}
}
Cercle = classe OGraphique {
mthodes
procdure AfficherFentre (aff : Fentre) {
-- dessiner un cercle dans une fentre
}
procdure AfficherImpr (aff : Imprimante) {
-- dessiner un cercle sur une imprimante
}
}
Programmer avec des objets 135
OGraphique Afficheur
AfficheFentre Dessiner
AfficheImpr
PileAbstraite = classe {
mthodes prives
procdure Ajouter (o : Objet); -- redfinir
procdure Retirer (); -- redfinir
fonction EstVide () : boolen; -- redfinir
fonction Dernier : Objet; -- redfinir
procdure PileVide (); -- redfinir
mthodes -- mthodes publiques
procdure Empiler (o : Objet) {
Ajouter (o);
}
procdure Dpiler () {
si non EstVide () alors Retirer ();
}
fonction Sommet : Objet {
si non EstVide ()
alors retourner Dernier ()
sinon { PileVide (); retourner NUL; }
}
}
Parce quil est trs simple, cet exemple est un peu caricatural.
Il montre nanmoins que, en interdisant la redfinition des
mthodes publiques, on ne peut crer une sous-classe qui ne
respecte pas la smantique dune pile. La mthode PileVide
permet de redfinir la faon de signaler ou de traiter lerreur
qui consiste accder au sommet dune pile vide.
138 Les langages objets
Classes dpendantes
U = classe { V = classe U {
procdure g (); procdure h ();
} }
A = classe { B = classe A {
procdure f (p : U) { procdure f (p : V) {
p.g (); p.h ();
} }
} }
a : A; b : B; u: U;
a = b; -- polymorphisme dinclusion
a.f (u); -- la liaison dynamique appelle B.f
Le type TourPos sert identifier les trois tours. Hanoi est une
classe compose offrant un accs contrl ses composants. Les
corps des mthodes sont les suivants :
procdure Hanoi.Construire () {
tours [gauche] := allouer (Tour);
tours [centre] := allouer (Tour);
tours [droite] := allouer (Tour);
}
procdure HanoiG.Construire () {
f := allouer (Fentre);
ConstruireTour (gauche,10, 100);
ConstruireTour (centre, 50, 100);
ConstruireTour (droite, 90, 100);
}
Hanoi = classe {
mthodes prives
procdure Bouger (d : entier; de, vers : TourPos);
mthodes
procdure Dplacer (de, vers : TourPos);
}
} sinon
erreur.crire ("Dplacer : coup impossible");
}
6.5 CONCLUSION
Ce chapitre nous a montr les possibilits mais aussi les limites
des langages objets. Par rapport aux autres langages, les
langages objets favorisent la modularit et la rutilisation, sans
Programmer avec des objets 145
Rfrences gnrales
Actes Confrences ECOOP, European Conference on Object-
Oriented Programming. Lecture Notes in Computer Science,
Springer Verlag. vol. 276 (1987), vol. 322 (1988), vol. 512
(1991).
Actes Confrences OOPSLA, Object-Oriented Programming,
Systems, Languages, and Applications. Special Issue SIGPLAN
Notices, ACM. vol. 21, n11 (1986), vol. 22, n12 (1987),
vol. 23, n11 (1988), vol. 24, n10 (1989), vol. 25, n10 (1991).
G. Agha. Actors : a Model of Concurrent Computation in
Distributed Systems. MIT Press, Cambridge (Mass.), 1986.
B.J. Cox. Object-Oriented Programming: an Evolutionary
Approach. Addison-Wesley, Reading (Mass.), 1986.
J. Ferber. Conception et Programmation par Objets. Collection
Techniques de Pointe, Herms, Paris, 1990.
G. Masini, A. Napoli, D. Colnet, D. Lonard, et K. Tombre. Les
Langages Objets. InterEditions, Paris, 1989.
148 Les langages objets
non typ 5, 28, 61, 92, 103, Modula3 4, 9, 31, 50, 53, 55,
116, 128, 129 59
parallle 3, 104, 116 modularit 6, 7, 116, 140
semi-compil 6, 10, 61 module 6, 15, 16
squentiel 3 moi 36
typ 5, 8, 26, 60, 92, 96,
128, 129, 131, 134 O
Le_Lisp 2, 10, 88 Object Pascal 9
liaison 28 Objective-C 11
dynamique 27, 48, 50, 81, objet 1, 13, 21, 33, 64, 68, 69,
92, 103, 116 83, 91, 94, 111
statique 27, 48 ObjVLisp 10, 88, 90
lien OGraphique 129, 134
dhritage 14, 64, 93, 96 OGraphique3D 134
dinstanciation 14, 64, 65, P
93, 96 parent 96, 102
Lisp 2, 5, 9, 10, 15, 30, 65, 87,
Pascal 2, 4, 7, 13, 15, 25, 59, 78
116 Pile 15, 16, 19, 33, 39, 67, 71,
liste dexportation 55, 126 79, 83, 84, 94, 102
M PileAbstraite 133, 139
mandataire 104 Plasma 104
membre 53 Polaire 101
message 64, 104, 129 Polygone 123
mots cls 62 polymorphisme 24, 28
binaire 62, 72 ad hoc 24, 26, 34, 80
express 110 dhritage 26, 48, 125, 129
unaire 62 dinclusion 25, 26
mta-circularit 10, 30, 84 paramtrique 4, 25, 58
mtaclasse 10, 28, 64, 81, 83, priv 17, 54
90, 127, 135 programmation
mthode 13, 16, 17, 34, 94, 125 fonctionnelle 2, 18, 117
amie 54 imprative 2, 18, 117
daccs 125 logique 2
de calcul 126 modulaire 7
de classe 29, 84, 127 par objets 3, 7, 18, 116, 117
de construction 126 Prolog 3
de contrle 127 protg 54
prive 118 protocole 117, 122, 125, 132
publique 117 protoPile 96, 98
redfinie 20 protoPoint 101
virtuelle 8, 49, 120 protoTour 98
ML 2, 15 prototypage 81, 92, 103, 128
154 Les langages objets