“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 283 — #293
i
i
i
i
i
i
i
i
6.3 Les classes comme abstractions incrémentales
283
à accomplir certaines optimisations. Certains langages courants, comme C++ et Java,
font cette distinction. D’autres, comme Ruby et Python, ne la font pas. Quelques
opérations (comme les déclarations) ne peuvent être exécutées que pendant la compilation, et toutes les autres opérations ne peuvent être exécutées que pendant l’exécution.
Le compilateur peut ainsi exécuter toutes les déclarations en une fois, sans aucune
interférence du reste du programme. Cela lui permet de faire des optimisations plus
poussées pour la génération du code machine. Mais cela réduit largement la souplesse
du langage. Par exemple, la généricité et l’instanciation ne sont plus disponibles au
programmeur comme des outils généraux.
de classe compilée
(en bytecode)
compilation
dans le code source
Valeur de classe
exécution
Déclaration
Déclaration de classe
Figure 6.5 Une déclaration de classe est une instruction exécutable.
À cause de la nature dynamique du système Mozart, le compilateur a un tout
petit rôle. Comme le compilateur n’exécute pas véritablement les déclarations (il les
convertit simplement en code exécutable), il n’a pas besoin de connaître beaucoup
de la sémantique du langage. Le compilateur Mozart a quelques connaissances mais
seulement pour permettre une détection plus tôt de certaines erreurs et un code compilé
plus efficace. On pourrait ajouter plus de connaissances au compilateur, par exemple
pour détecter des erreurs dans les hiérarchies de classe.
6.3.3 Les liens statiques et dynamiques
Pendant l’exécution d’un objet, il faut souvent appeler une autre méthode dans le
même objet, c’est-à-dire faire une sorte d’invocation récursive de l’objet. Cela semble
simple, mais devient un peu plus compliqué quand l’héritage entre en jeu. L’héritage
est utilisé pour définir une nouvelle classe qui étend une classe existante. Deux classes
sont impliquées dans cette définition : la nouvelle classe et la classe existante. Les
deux peuvent avoir des méthodes avec le même nom, et la nouvelle classe voudrait
appeler l’une ou l’autre. Cela veut dire que nous avons besoin de deux manières pour
faire un appel récursif. Elles s’appellent le lien statique et le lien dynamique. Nous les
introduisons avec un exemple.
Un exemple
Regardez la classe Account définie dans la figure 6.6. Cette classe modélise un
compte en banque simple avec un solde. Nous pouvons transférer de l’argent dans
le compte avec transfer, obtenir le solde actuel avec getBal et faire une série
© Dunod – La photocopie non autorisée est un délit
i
i
i
i
i
i
i
i
6.3 Les classes comme abstractions incrémentales
283
à accomplir certaines optimisations. Certains langages courants, comme C++ et Java,
font cette distinction. D’autres, comme Ruby et Python, ne la font pas. Quelques
opérations (comme les déclarations) ne peuvent être exécutées que pendant la compilation, et toutes les autres opérations ne peuvent être exécutées que pendant l’exécution.
Le compilateur peut ainsi exécuter toutes les déclarations en une fois, sans aucune
interférence du reste du programme. Cela lui permet de faire des optimisations plus
poussées pour la génération du code machine. Mais cela réduit largement la souplesse
du langage. Par exemple, la généricité et l’instanciation ne sont plus disponibles au
programmeur comme des outils généraux.
de classe compilée
(en bytecode)
compilation
dans le code source
Valeur de classe
exécution
Déclaration
Déclaration de classe
Figure 6.5 Une déclaration de classe est une instruction exécutable.
À cause de la nature dynamique du système Mozart, le compilateur a un tout
petit rôle. Comme le compilateur n’exécute pas véritablement les déclarations (il les
convertit simplement en code exécutable), il n’a pas besoin de connaître beaucoup
de la sémantique du langage. Le compilateur Mozart a quelques connaissances mais
seulement pour permettre une détection plus tôt de certaines erreurs et un code compilé
plus efficace. On pourrait ajouter plus de connaissances au compilateur, par exemple
pour détecter des erreurs dans les hiérarchies de classe.
6.3.3 Les liens statiques et dynamiques
Pendant l’exécution d’un objet, il faut souvent appeler une autre méthode dans le
même objet, c’est-à-dire faire une sorte d’invocation récursive de l’objet. Cela semble
simple, mais devient un peu plus compliqué quand l’héritage entre en jeu. L’héritage
est utilisé pour définir une nouvelle classe qui étend une classe existante. Deux classes
sont impliquées dans cette définition : la nouvelle classe et la classe existante. Les
deux peuvent avoir des méthodes avec le même nom, et la nouvelle classe voudrait
appeler l’une ou l’autre. Cela veut dire que nous avons besoin de deux manières pour
faire un appel récursif. Elles s’appellent le lien statique et le lien dynamique. Nous les
introduisons avec un exemple.
Un exemple
Regardez la classe Account définie dans la figure 6.6. Cette classe modélise un
compte en banque simple avec un solde. Nous pouvons transférer de l’argent dans
le compte avec transfer, obtenir le solde actuel avec getBal et faire une série
© Dunod – La photocopie non autorisée est un délit
