Self, introduction
Serge Fleury
ELI (Equipe Linguistique et Informatique)
Ecole Normale Supérieure de Fontenay-St Cloud
31 avenue Lombart
F-92260 Fontenay aux Roses
e-mail : fleury@ens-fcl.fr
http://www.ens-fcl.fr/~fleury/
Self
Self est un langage qui permet l'héritage multiple et l'héritage dynamique. Il a été conçu en 1986 par David Ungar & Randall Smith [UNG 86]. La première implémentation a été réalisée à Stanford en 1987, la dernière version (Self-4.0 [SEL 95]) est disponible depuis juillet 1995. Ce langage est désormais développé par Sun Microsystems. Les propriétés fondamentales du langage Self et de l'interface utilisateur sont la concrétude, l'uniformité et la flexibilité. La concrétude se manifeste clairement par le fait qu'un utilisateur manipule directement les objets du monde self et peut en créer de nouveaux à partir d'objets existants en les dupliquant et en les ajustant. L'uniformité se traduit par le fait qu'en Self tout est objet et que tous les objets dialoguent entre eux par envoi de messages. Les attributs des objets peuvent porter des données ou des methodes. De plus la distinction entre l'implémentation d'un programme et son exécution n'existe pas en Self : on peut ajuster dynamiquement les objets. Et enfin, l'environnement graphique de Self est composé d'éléments de base (les
morphs) disponibles et réutilisables à volonté. La flexibilité découle directement des aspects de concrétude et d'uniformité de Self.
1. Objets et attributs Self
Un prototype ou un objet en Self est une entité composée d'attributs. Ces attributs peuvent porter des données, des méthodes ou pointer sur d'autres objets. La définition structurelle d'un objet peut être modifiée à tout moment. On dispose avec Self de primitives qui permettent d'ajouter ou de supprimer dynamiquement des attributs aux objets. Les mécanismes d'ajout(s) ou retrait(s) dynamique(s) d'attributs permettent de construire des représentations par affinements successifs : on peut à tout moment ajouter à un objet de nouveaux comportements ou modifier les comportements de cet objet. Les objets définis dialoguent entre eux via un mécanisme d'envoi de messages.
2. Héritage et Self : la délégation, une vision dynamique de l'héritage
L'héritage dans la PàP se réalise au travers de la notion de délégation. Pour mettre en place l'heritage avec Self :
• On commence par créer des objets qui vont porter les comportements partagés.
• On établit ensuite un lien entre ces objets et les prototypes qui délèguent les comportements factorisés en inscrivant dans ces prototypes le chemin de délégation défini. Pour inscrire un chemin de délégation dans un objet on ajoute un attribut
parent (nom de l'attribut suivi d'une étoile) qui pointe sur l'objet qui porte les comportements délégués.
3. Un environnement de programmation pour l'expérimentation
L'environnement de programmation de Self permet une définition et une modification incrémentales des objets et leur manipulation directe. Dans notre cadre linguistique de travail, l'interface graphique de Self permet de manipuler des objets "vivants" et "évolutifs" capables de rendre compte de certains aspects évolutifs des savoirs ainsi représentés. L'utilisateur peut agir directement sur les objets construits et les faire évoluer à sa guise. Self démarre avec : un prompt interactif dans une fenêtre
shell, une interface graphique interactive. L'environnement graphique est appelé le monde Self.
Figure 10. Interface shell et Trash-Can Self
On dispose par défaut dans cet environnement graphique d'un shell permet d'interroger les objets disponibles dans le monde Self et en particulier de les inclure dans l'interface graphique. On y trouve aussi une poubelle qui permet de nettoyer la fenêtre graphique en y déposant les objets que l'on ne souhaite plus y voir figurer. En utilisant la souris dans la fenêtre graphique, on peut accéder à certains outils qui permettent d'agir sur le monde Self. La touche droite de la souris active un menu des opérations sur le monde Self :
Les options disponibles permettent en particulier de :
Shell |
créer un objet shell |
Toggle Spy |
activer un object qui contrôle les activités du système |
Write Snapshot |
sauvegarder l'état présent du monde Self |
Quit |
quitter la session de travail |
De même, tous les objets de la fenêtre graphique sont réactifs à la souris. On peut ainsi accéder à certains outils qui permettent d'agir sur les objets.
Les options disponibles permettent en particulier de :
Add Slot |
ajouter un attribut à l'objet visé |
Comment |
ajouter des commentaires à l'objet visé |
Annotation ... |
éditer un objet porteur d'annotations sur l'objet visé |
Find Slot ... |
créer un objet pour trouver un attribut dans l'objet visé |
Structure Editor |
créer un éditeur pour l'objet visé |
Evaluator |
créer un (ou plusieurs) évaluateur(s) pour l'objet visé |
Les options disponibles permettent en particulier de :
Duplicate |
créer un copie de l'objet visé |
Resize |
retailler les dimensions de l'objet |
Move to Own Window |
créer un monde particulier (une nouvelle fenêtre) avec cet objet |
Dismiss |
faire disparaître l'objet de la fenêtre |
Object expander |
étendre ou restreindre la présentation des attributs de l'objet |
On donne ci-dessous une présentation d'un objet tel qu'il apparaît dans la fenêtre graphique. Cette présentation précise les rôles des différents éléments constitutifs de cet objet.
Figure 12. Objet Self expansé [DUV 95]
Pour expanser ou restreindre la présentation des attributs de l'objet, on agit sur les points d'entrée définis. Les évaluateurs constituent des zones d'édition qui permettent d'évaluer des expressions Self dans l'environnement particulier de l'objet. L'objet associé à un évaluateur est le récepteur direct des messages adressés dans cette zone.
Accept |
La validation de la zone Accept via le bouton de gauche de la souris permet d'activer l'exécution des messages définis dans l'évaluateur |
Cancel |
La validation de la zone Cancel via le bouton de gauche de la souris permet de désactiver l'évaluateur |
Il est donc possible de visualiser, manipuler ou modifier les attributs des objets de la fenêtre graphique. Pour cela, on peut tout d'abord activer les "
slots expanders" pour avoir accès au contenu des attributs. On peut ensuite agir sur ces contenus.
Le travail sur les gros corpus et les limites des machines qui portent Self
Les résultats produits par le dispositif GASPAR sont en fait limités actuellement par les contraintes matérielles imposées par ce langage expérimental sur les machines que nous utilisons. Il faut en effet beaucoup de mémoire et d'espace disque sur les machines qui portent le système Self pour mettre en œuvre cette représentation de la mouvance. Cette incapacité actuelle du système Self à assimiler la génération d'un grand nombre d'objets met surtout en avant les problèmes complexes liés à la mise en oeuvre de ce type de modèle de représentations évolutives. Cette mise en oeuvre de la mouvance dans les outils de représentation coûte chère en ressources pour les systèmes sous-jacents. La mise en œuvre de ce dispositif GASPAR peut être considérée comme une expérience pilote qui offre une image partielle, pour le moment, des traitements réalisés et des résultats à venir.