CSI3525: Concepts des Langages de Programmation Notes # 13: Introduction au SmallTalk
2 Un exemple Un example en SmallTalk pour additioner les elements d’un tableau. Afin de bien comprendre le code, son equivalent est donne en Pascal (voir les notes additionelles)
3 Generalites I SmallTalk est le langage de programmation orientee objet le plus pur. Toutes les entites du langage sont des objets. Meme, par exemple, l’entier 2. Les objets ont une memoire locale, la possibilite d’effectuer des operations, la possibilite de communiquer avec d’autres objets en echangeant des messages, et la possibilite d’heriter d’autres objets. A l’encontre de C++ et Java, SmallTalk n’est pas un langage hybride: il ne ressemble pas a un langage imperatif.
4 Generalites II SmallTalk est un langage orthogonal: il a 5 concepts de base: objet, message, classe, instance et methode. SmallTalk n’est pas qu’un langage: c’est aussi un environement, avec un editeur de programme, un compilateur, les elements habituels d’un systeme d’exploitation et une machine virtuelle. Le tout dans un meme systeme. L’interface avec ce systeme est un interface graphique. L’environement de SmallTalk est ecrit entierement en SmallTalk et est modifiable par l’usager.
5 Objets Un objet a une memoire privee et un ensemble d’operations publiques. Examples d’objets: nombres, chaines de caracteres, dictionnaires, rectangles, fichiers, editeurs de textes, etc… [Tous des composantes du systeme SmallTalk]. Par example, un rectangle est un objet avec deux donnees privees: les points aux coins opposes. Example d’operations du rectangle: on peut demander a un rectangle de trouver la location de son centre, ou de se deplacer.
6 Messages Un message demande a un objet d’effectuer une operation: Le message dit quelle operation Le receveur dit comment l’effectuer. L’ensemble des motifs de messages d’un objet constitue son interface avec le reste du systeme. Il est utile de definir un ensemble d’operations exhaustifs avec chaque objet qui serait re-utilisable dans d’autres programmes. Ainsi, on peut construire un librairie d’objets et d’operations associees a ces objets.
7 Classes Une classe est un ensemble d’objets d’un certain type. Chaque objet represente une instance de cette classe. Chaque objet doit etre une instance de classe. En fait, chaque classe est elle-meme une instance de classe, qu’on appelle une superclasse.
8 Quelques Remarques sur les Objets, Messages et Classes Les messages sont publics. Les variables d’instances d’un objet sont sa memoire privee. Elles represente l’etat (state) d’une instance. La valeur d’une variable d’instance est aussi un objet qui ne peut etre accede par un autre objet que par une operation. Par example, un rectangle ne peut pas voir les coordinees de ses Points (qui sont representes par des variables d’instances). Il doit demander a un point de retourner ses coordinees.
9 Methodes Les methodes decrivent comment effectuer des operations. Par example, afin de trouver son centre, un rectangle pourrait: 1.Demander a ses Points de produire leurs coordonnees. 2.Initier les calculs du centre (en demandant aux entiers de les effectuer) 3.Demander a la classe des Points de produire un nouveau Point a partir des coordinees justes calculees Les methodes sont en correspondence directe avec les messages. Les methodes “built-in” ne peuvent pas etre changees.
10 Expressions Constantes Literales: nombres: 1951, caracteres: $a, $Z, chaines: ‘ami’, symboles: #bill, tableaux de literals: #( ) ou #($a $e $i $o $u $y) Variables: les variables n’ont pas de types. Elles representent des objets et permettent d’acceder a ces objets. Affectations: quantity <- 17 centre <- aPoint x:xCoord y: yCoord Pseudo-Variables: Elles referent aux objets. Elles ne peuvent pas etre le resultat d’une affectation. Certaines ne changent jamais: nil, true, false; alors que d’autres referrent a l’objet lui-meme (dans ses propres methodes) et a sa superclasse: self, super.
11 Messages Les messages peuvent etre des messages unitaires, binaires ou a mots-cles. Un message decrit une operation en specifiant: le receveur, le(s) selecteur(s), le(s) argument(s). La precedence des messages est: unitaire > binaire > mots-cles et de gauche a droite dans chaque groupe. Le receveur renvoie toujours un objet qui peut etre affecte a une variable.
12 Controle I: Blocs Un bloc est une sequence d’actions diferee (non evaluee). Voici sa syntaxe: [ action1. Action2. … actionN ] Un bloc est un objet (comme toutes les entites de SmallTalk) et peut donc etre affecte a une variable. Il n’est execute que sur demande, en envoyant le message “value”. Les blocs sont toujours executes dans le contexte de leur definition, meme lorsqu’ils sont envoyes comme parametres a un autre objet. Dans ce sens ils sont proche des parametres pass-by-name de l’Algol 60.
13 Controle II: Conditions Execution conditionnelle: N odd ifTrue: [parity <- 1] ifFalse: [parity <- 0] ou parity <- N odd ifTrue: [1] ifFalse: [0] ou parity <- N odd ifFalse: [0] ifTrue: [1] Operation conditionelle a une branche: cond ifTrue: bloc ce qui est equivalent a: cond ifTrue: bloc ifFalse: []
14 Controle III: Iterations Repetition Comptee: 4 timesRepeat: [indx <- indx +1] Boucle Conditionnelle: [indx <= high] whileTrue: [array1 at: indx put 0. indx <- indx +1] Arguments en blocs (iterateurs): sum <- 0. #( ) do: [:prime | sum <- sum + (prime * prime)] #( ) collect: [:prime | prime * prime]
15 Descriptions de Classes La description du protocole liste tous les messages. La description de l’implementation liste toutes les methodes. Les deux declarations peuvent toujours etre editees en se servant du browser du systeme. Voir example de class FinancialHistory
16 Variables Les variables n’ont pas de type. Elles n’ont qu’un nom. Il y a plusieurs genres de variables: Les variables d’instances: sont les donnees privees d’un objet. Ce peuvent etres aussi des collections (i.e., des variables d’instance indexees). Les variables temporaires: apparaissent dans les methodes. Les variables de classe: sont partagees par tous les objets d’une classe Les variables globales: sont partagees par tous les objets Les variables regroupees (pool variables): sont partagees par les elements d’ un sous-ensemble de toutes les variables.
17 Sous-Classes Les classes de SmallTalk sont organisees dans une hierarchie stricte. Il y a de l’heritage d’une superclass a une sous- classe ainsi que de la derogation (overriding): Le nom d’une sous-classe doit etre nouveau Des variables peuvent etre ajoutees Des methodes peuvent etre ajoutees Des methodes peuvent deroger des methodes definient dans la superclasse.
18 Recherche de la methode appelee La hierarchie des classes est remontee jusqu’a ce que la methode correspondante soit trouvee ou que la classe objet soit atteinte. Si une methode correspondante n’est pas trouvee, le systeme retourne une erreur. Si une methode contient un message addresse a “self”, la recherche commence dans la classe de l’instance quelque soit la location de la methode. Si une methode contient un message addresse a “super”, la recherche commence dans ma superclasse de la class contenant la methode.