Coder en Smalltalk avec le Pingouin

Gazette Linux n°51 — Mars 2000

Carine Bournez

Adaptation française 

Frédéric Marchal

Correction du DocBook 

Article paru dans le n°51 de la Gazette Linux de mars 2000.

Cet article est publié selon les termes de la Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.


Table des matières

Un peu de culture
Installation
Quelques caractéristiques notables de Smalltalk
Sauvegarder votre travail
Tout est objet
Compilation incrémentale en pseudo-code
Machine Virtuelle et Portabilité
Réflexivité
Ramasse-Miettes
Résumé
Glossaire
Autres Références

Résumé

Depuis que VisualWorks Non Commercial (VWNC) a été distribué gratuitement pour Linux, l'intérêt de la communauté Linux pour Smalltalk va croissant. Le but de cet article est de fournir une introduction à Smalltalk aux fans de Linux qui n'y sont pas familiers, et de partager quelques connaissances sur les caractéristiques de ce langage qui charme tant de programmeurs. Il existe déjà nombre de tutoriels et de références. Cet article ne se veut pas un tutoriel ou une référence à la programmation OO ni à Smalltalk, mais seulement un petit aperçu pour aiguiser l'appétit. Cela ne suppose pas de connaissance préalable de l'OO, et l'article peut être lu indépendamment aussi bien qu'en codant simultanément.

Beaucoup d'exemples cités sont valables pour toutes les implémentations de Smalltalk. Bien que ces diverses implémentations partagent les mêmes caractéristiques de base, il existe des variations entre elles, particulièrement quand du code d'interface utilisateur entre en jeu. Il y a un bon nombre d'implémentations de Smalltalk pour Linux disponibles librement [1] : GNU Smalltalk, Smalltalk/X, Squeak, et VisualWorks Non Commercial [2]. En particulier, Squeak a fait de très jolies choses récemment, mais ici les exemples sont écrits avec VWNC, parce que j'y suis plus habitué. De plus, bien qu'il y ait une version plus récente disponible, je vais utiliser VWNC v3.0, ceci dans un but d'illustration : c'est en effet la version pour laquelle on trouve le plus d'outils/extensions disponibles librement.

Cet article couvre quelques informations de base sur Smalltalk, la récupération et l'installation de VWNC3, les caractéristiques de Smalltalk (avec des exemples), et des références. Pour résumer les caractéristiques en question, Smalltalk

  • est un environnement OO pur, encourageant la programmation OO

  • peut sauvegarder l'état exact de l'environnement de développement (IDE)

  • est un langage littéral

  • est compilé en pseudo-code incrémentalement

  • est un environnement portable, une fois écrit, ça tourne partout (machine virtuelle/IHM)

  • peut inspecter et manipuler des objets en temps réel

  • fournit un haut degré de réfléxivité (démarrage avec une application lancée, extensions)

  • possède un ramasse-miettes, pas de pointeurs explicites.

Un peu de culture

Petite anecdote Java/Smalltalk méconnue : l'équipe d'Oak du début voulait utiliser le Smalltalk VisualWorks dans son travail, mais a fini par inventer Java puisque la licence de VisualWorks à cette époque s'est révélée trop coûteuse pour eux [3]

Smalltalk existe depuis un petit moment. Il a été créé au centre de recherche de Xerox de Palo Alto (PARC) au début des années 70, dans le but de fournir un environnement pour les enfants qui commencent à apprendre à programmer. Donc, sa syntaxe est très simple et l'environnement très mature. La puissance de Smalltalk prend ses racines dans sa grande librairie de classes, qui peut être une arme à double tranchant. Il n'y a pas besoin de réinventer la roue pour faire le moindre travail, mais par contre, on peut passer beaucoup de temps au début de l'apprentissage à chercher la bonne roue à réutiliser[4].

Une autre épée à double tranchant : l'environnement purement OO, qui encourage donc les gens à passer au paradigme OO bien plus que tout autre langage basé sur des objets (OB)[5] (je reviendrai sur ce sujet). Les gens qui font le pas tendent à s'attacher énormément à Smalltalk et trouvent cet environnement de travail très amusant, productif[6], et d'une théorie pure. Les gens qui ne font pas le pas ont tendance à l'éviter, et restent vers des langages OB où il est plus facile de s'en sortir en faisant du code procédural déguisé en code OO . (Non, Dorothy, ce n'est pas parce que tu utilises un compilateur C++ que tu écris du code OO).

Bien que de nombreuses personnes décrivent Smalltalk comme utile seulement dans les grands marchés verticaux, il est extrêmement flexible puisqu'aussi utilisé dans de très petits marchés horizontaux. Il a été utilisé pour écrire des applications [7] pour les systèmes de gestion de grands réseaux, les systèmes cliniques d'hôpitaux, les palm pilots, les micro-contrôleurs, les systèmes embarqués.

Mais finissons-en avec les informations culturelles, passons aux exemples réels.

Installation

VWNC3 peut être obtenu sur un site de téléchargement gratuit. Vous devez donner vos nom, adresse, ville, état, code postal et e-mail pour continuer. Ensuite, lorsque vous cliquez le bouton J'accepte, le téléchargement de 20,954 koctets commence immédiatement, vw.exe. Pas le mécanisme de téléchargement le plus sympathique au monde, particulièrement les versions Windoze et Linux toutes deux dans une archive auto-extractible sous Windoze, mais ça marche. Téléchargez cela là où vous voulez que le répertoire parent se trouve, puis dézippez en tapant unzip vw.exe. Le fichier zip se décompressera dans Vwnc3. Pour ma part, j'ai un double boot, donc j'ai téléchargé dans mon répertoire /dos et l'ai dézippé là, pour pouvoir l'utiliser aussi depuis Windoze, ce qui me donne un répertoire de base /dos/vwnc3. (Sinon, vous pouvez spécifiez une variable d'environnement VISUALWORKS avec le chemin d'accès).

Pour le démarrer, je peux copier la machine virtuelle dans le répertoire image, ou faire un lien symbolique. Comme je l'ai mis dans ma partition dos, je vais faire une copie :

cp /dos/vwnc3/bin/linux86/visualnc /dos/vwnc3/image/visualnc

J'ai remarqué que la machine virtuelle n'était pas exécutable par défaut, donc corrigeons cela comme ça :

chmod 555 visualnc

Ensuite pour démarrer l'image, il faut indiquer à la machine virtuelle l'image à lancer :

cd /dos/vwnc3/image
visualnc visualnc.im

Un écran de rappel de licence apparaît à chaque fois qu'on lance VWNC, cliquez J'accepte pour continuer. La fenêtre qui apparaît en haut est appelée Transcript (Transcription), et la fenêtre d'en bas est le Workspace (Espace de Travail) . Ensuite, il faut indiquer à l'image où se trouvent les fichiers systèmes dont elle a besoin. Pour cela, cliquez sur FileSet VisualWorks Home dans la fenêtre Transcript. Dans le dialogue qui s'affiche, saisissez le répertoire parent : /dos/vwnc3/.

les fenêtres Transcript et Workspace ressemblent à :

Figure 1. fenêtre VWNC Transcript

fenêtre VWNC Transcript

Figure 2. fenêtre VWNC Workspace par défaut

fenêtre VWNC Workspace par défaut

L'espace de travail au lancement contient quelques informations qui valent une lecture, mais ce n'est pas nécessaire de les lire pour continuer à suivre cet article.

Note à propos des souris : Smalltalk suppose que vous ayiez une souris à 3 boutons. Si ce n'est pas le cas, vous pouvez simuler un troisième bouton sur une souris à deux boutons en cliquant les deux boutons en même temps.

Quelques caractéristiques notables de Smalltalk

Sauvegarder votre travail

Là encore se trouve une épée à double tranchant : ce qui est fantastique, c'est de pouvoir sauvegarder votre IDE, tout est sauvegardé exactement dans l'état où vous l'avez laissé. Les fenêtres ouvertes, à l'endroit où elles se trouvaient, ce qui était en surbrillance, les objets qui existaient, tout. Une photo de l'instant est prise et sauvée sous la forme d'une image. Il n'est pas nécessaire de recharger tel fichier texte dans un éditeur de texte et retrouver là où vous aviez arrêté. L'autre côté est que si vous avez une liaison de base de données corrompue ou que vous avez écrasé des objets qu'il ne fallait pas, c'est sauvegardé dans l'image. Donc, il n'y a pas à connaître l'état de votre environnement au moment de la sauvegarde. Ceci étant dit, vous pouvez sauver votre code séparément de l'image, et le recharger dans une image propre si vous rencontrez des problèmes (une bonne idée, en fait). Une manière simple de sauvegarder le code est d'utiliser un fichier de sortie.

Essayons une sauvegarde (qui par la même occasion sauvera la localisation du fichier système que vous venez de spécifier). Déplacez les fenêtres comme vous le voulez, puis sauvez votre image, sélectionnez FileSave As... Il est préférable de sauver l'image sous un nom différent de l'image vierge, pour pouvoir revenir à l'image propre et recharger le code en cas de problèmes. Je vais sauver l'image sous le nom TestImage. Après la sauvegarde, essayez de fermer l'image FileExit VisualWorks...Exit. Ensuite, pour redémarrer, prenez garde à donner la nouvelle image à la machine virtuelle. Notez que, lorsque vous sauvez votre image, la date et l'heure sont affichées sur la fenêtre Transcript, comme ci-dessous :

Figure 3. Fenêtre Transcript après la sauvegarde de TestImage

Fenêtre Transcript après la sauvegarde de TestImage

Je pourrais encore dire des tas d'autres choses sur la sauvegarde (Perm Save As, Filing out, Change log, Envy), mais pour ne pas trop rallonger, je vais couper court et changer de sujet.

Tout est objet

C'était mon mantra pendant les 6 premiers mois où j'ai appris Smalltalk. Comme la plupart des programmeurs à ce moment-là, j'avais une culture de programmation procédurale et il était très difficile de chambouler cet esprit. C'est là qu'entre en jeu l'infâme paradigme. La fenêtre Transcript est un objet, les menus de cette fenêtre sont des objets, les boutons sont des objets, la fenêtre Workspace est un objet, etc. Mais avant d'entrer dans le détail, commençons par le vénérable exemple « Hello World » :

Exemple 1. Hello World

  • Ouvrez un nouvel espace de travail (en cliquant ToolsWorkspace)

  • Dans la fenêtre Workspace, tapez : Transcript cr. Transcript show: 'Hello World.'

  • Bravo, vous venez d'écrire votre premier code Smalltalk. Voyons maintenant comme il marche bien :

  • Mettez cette ligne de code en surbrillance, cliquez avec le bouton du milieu et sélectionnez do it (ceci évalue le code Smalltalk que vous venez d'écrire)

  • Vous devriez voir le texte « Hello World » dans la fenêtre Transcript :

    Figure 4. L'exemple Hello World

    L'exemple Hello World

  • Analysons le code Smalltalk :

    Transcript cr.Ce code permet de manipuler l'objet Transcript et lui demande d'afficher un retour chariot sur lui-même.
    Transcript show: 'Hello World'Manipule l'objet Transcript et lui demande d'écrire « Hello World » sur lui-même.
  • Vous pouvez aussi afficher « Hello World » sur la ligne de commande, ouvrir une fenêtre et écrire « Hello World » dedans, ou encore concevoir une interface utilisateur et placer « Hello World » dessus. Mais là encore, nous n'allons pas nous attarder.

  • cr est un message envoyé à l'objet Transcript, tout comme show:. Ce sont seulement des messages auxquels Transcript sait comment répondre. Ils ne font pas partie de la syntaxe de Smalltalk.

  • Ce dernier point est important à retenir pour les programmeurs en non-OO, on envoie des messages aux objets pour leur demander de faire quelquechose.


Notez que vous venez d'exécutez votre premier code Smalltalk sans le compiler. Vous n'avez pas sauvegardé votre code, ni compilé, ni édité les liens avant de le lancer. « Bon alors, c'est un langage interprété », dites-vous. Eh bien non, pas vraiment. Pour être précis, c'est un langage compilé incrémentalement en pseudo-code. Je vais y revenir dans un moment. Pour l'instant, retenez juste que vous codez et exécutez du Smalltalk sans peine. Maintenant, passons à l'exemple suivant :

Exemple 2. Affichage de la date

  • Dans votre espace de travail, tapez : Date today

  • Mettez cette ligne de code en surbrillance, cliquez avec le bouton du milieu et sélectionnez do it (ceci évalue le code Smalltalk que vous venez d'écrire)

  • Vous devriez voir affichée la date courante, comme :

    Figure 5. Affichage de la date du jour

    Affichage de la date du jour

    Date todayDemande à la classe Date quel jour on est
  • Ok, voyons un peu plus en détails ce que Date today évalue. Mettez en surbrillance cette ligne de code (sans la date qui a été affichée), cliquez avec le bouton du milieu et sélectionnez inspect it. Vous devriez voir :

    Figure 6. Un Inspector sur une date

    Un Inspector sur une date

  • C'est ce qu'on appelle un inspecteur (Inspector), qui est d'ailleurs un objet Inspector. Les objets Inspector permettent de jeter un œil dans les objets. Si vous cliquez sur self dans l'Inspector, vous aurez une représentation textuelle de la date :

    Figure 7. Inspector affichant une représentation textuelle de la dater

    Inspector affichant une représentation textuelle de la dater

  • Ça vous dit quelquei chose ? C'est parce que dans la Fig. 5, lorsque vous avez affiché la Date today, vous avez réellement affiché une représentation textuelle de l'objet Date. Si vous cliquez sur l'un des deux autres attributs de cette date, vous verrez que day stocke le numéro du jour dans l'année (1→365, normalement), et year stocke l'année concernée.

  • Tous les objets ont une représentation en texte, même si ce n'est que le type de l'objet (bien que cela ne soit pas très utile).

  • L'inspecteur est un concept très puissant. Vous avez juste demandé à Date la date courante, et vous avez manipulé un objet date. Non seulement vous pouvezregarder cet objet, mais vous pouvez aussi travailler avec et le modifier. Par exemple, cliquez sur day, et saisissez n+1 à la place de la valeur. Dans la Fig. 7, le 6 février est le 37ème jour de l'année, donc je saisis 38. Puis cliquez avec le bouton du milieu et choisissez accept. Vous remarquerez qu'aucun changement ne semble avoir eu lieu, mais vous avez fait que l'objet représente maintenant la date du n+1 ème jour de l'année. Maintenant, si vous cliquez sur self de la date, vous verrez que la date affichée est celle du lendemain :

    Figure 8. Inspector affichant la date du lendemain

    Inspector affichant la date du lendemain


Finalement, non seulement on peut coder et exécuter immédiatement, mais en plus on peut attraper des objets et les manipuler directement avec effet instantané. Ces deux possibilités sont une partie de ce qui fait de Smalltalk un environnement productif. On peut coder&tester en temps réel. Si on ne comprend pas ce qui se passe, on peut attraper l'objet pour regarder son état et le manipuler vous voir comme il se comporte. Après une réalisation, s'il y a un bug lors des tests, on peut coder rapidement un correctif et le charger dans l'environnement de test — pas besoin de recompiler.

Autre chose à noter : la littéralité de Smalltalk. Pour avoir la date du jour, nous avons juste demandé à Date de donner today. Bien que Smalltalk soit un langage très littéral, il y a évidemment des limites quelquepart, par exemple on ne peut pas demander à Date pour avoir tomorrow. Ceci étant dit, la syntaxe générale de Smalltalk est très simple et facile à lire. Gardez ceci à l'esprit pendant la lecture des prochains exemples de code.

Continuons donc avec le 3ème exemple de cette section, qui évoque le changement d'état d'esprit nécessaire pour aborder l'OO :

Exemple 3. Illustration du changement de paradigme

  • Dans votre espace de travail, tapez : 1 + 2 * 3

  • Maintenant, avant d'évaluer ce code, pensez à ce que sera la réponse. Vous pensez probablement à 7. Bien, mettez le code en surbrillance et faites print it.

  • Vous remarquerez que la réponse est 9 :

    Figure 9. Résultat du passage de message

    Résultat du passage de message

  • C'est amusant, combien de programmeurs non-OO partent en courant en sanglotant quand je leur montre cela. « Quoi ! pas de priorité d'opérateurs, quel langage débile ! Je vais adhérer au C++, parce que je peux le comprendre ! » Sérieux, c'est arrivé plein de fois.

  • Cependant, la réalité dépend de vos oeillères ; quand j'ai écrit la réponse 7 tout à l'heure, j'avais le 9 en tête parce que je pensais en 00 et pas d'une manière procédurale.

  • La raison est (répétez après moi) : tout est objet. Dans cet exemple, les chiffres 1, 2 et 3 sont tous des objets. Les opérateurs : + et * sont justes des messages qui sont envoyés aux objets. Le raisonnement est donc que si + et * sont des messages, pourquoi auraient-ils une priorité par rapport aux autres messages ? Tous les messages du même type sont traités avec égalité par Smalltalk.

  • Pour le voir par vous-même, mettez 1 en surbrillance, cliquez le bouton du milieu et choisissez inspect. Vous obtiendrez un inspecteur sur SmallInteger, qui est le type d'objet qu'est 1.

    Figure 10. Inspection de l'objet 1

    Inspection de l'objet 1

  • Donc, le code est évalué de cette manière :

    • (le nombre 1) reçoit la demande de (+) avec (le nombre 2)

    • (le nombre 1) l'exécute, renvoie l'objet : (le nombre 3)

    • (le nombre 3) reçoit la demande de (*) avec (le nombre 3)

    • (le nombre 3) l'exécute et renvoie l'objet : (le nombre 9)

  • Pour évaluer le code comme on l'entendrait dans l'esprit procédural, on peut utiliser des parenthèses : 1+(2*3)

  • « OK, pourquoi ne peut-on pas mettre la date affichée, February 6, 2000, en surbrillance et l'inspecter pour voir l'objet date ? » Bonne question. La réponse est simple : certains types d'objets peuvent être créés (instanciés) juste en inspectant une répresentation textuelle de ces objets, d'autres types d'objets ne le peuvent pas. Les entiers (Integers) font partie de ceux que l'on peut instancier en inspectant une représentation textuelle.


Compilation incrémentale en pseudo-code

Comme je l'ai déjà mentionné, Smalltalk est compilé en pseudo-code, de manière incrémentale. Certaines personnes le décrivent comme un croisement entre langages compilés et langages interprétés. Voici ce qui se passe quand on fait ou affiche quelquechose :

  1. le compilateur Smalltalk traduit le code Smalltalk en pseudo-code

  2. le pseudo-code est passé à la machine virtuelle pour l'exécution

  3. le pseudo-code ext exécuté et le résultat est renvoyé.

Bon, ça semble plutôt interprêté, non ? Mais ce que nous avons fait jusqu'ici n'est pas de la programmation normale en Smalltalk. Rappelez-vous que les espaces de travail ne sont que des bacs à sable temporaires. Normalement, lorsque vous programmez, vous validez du code Smalltalk (sauvegarde dans l'image), et le code reste compilé en pseudo-code. Normalement, lorsque vous programmez, vous validez le code en méthodes pour une classe, et :

  1. le compilateur Smalltalk traduit le code Smalltalk en pseudo-code

  2. le pseudo-code est sauvé avec cette classe

  3. quand un message est envoyé à une classe, le pseudo-code approprié pour la méthode est envoyé à, la machine virtuelle pour exécution

  4. le pseudo-code est exécuté et le résultat est renvoyé.

Le résultat net est qu'à chaque fois que vous faites un changement dans vos classes, ce petit changement est sémantiquement vérifié, compilé, et prend effet immédiatement. C'est assez sympathique de faire un petit changement et de le voir immédiatement répercuté sur le comportement du programme.

Java est similaire, en ce qu'il est compilé en pseudo-code, mais différent en ce qu'il n'est pas incrémentalement compilé. Donc en programmation Java, il faut tout recompiler (ou en partie si on utilise make) et refaire les liens à chaque fois qu'on veut prendre en compte une modification.

Machine Virtuelle et Portabilité

La machine virtuelle est bien ce que cela veut dire — un ordinateur virtuel qui sait comment exécuter du pseudo-code Smalltalk. Elle est généralement implémentée en C (Squeak est une exception notable à cela, la machine virtuelle est elle-même implémentée en Smalltalk puis exportée en C par programmation). C'est la machine virtuelle qui permet une telle portabilité entre les différents types de machines. Smalltalk a suivi le paradigme « une fois écrit, ça marche partout » depuis des décennies ! Pour vous donner un aperçu de ceci, sélectionnez FileSettings. Dans le dialogue qui apparaît, choisissez le Look Selection de Macintosh, puis validez.

Figure 11. Sélection de l'apparence Mac

Sélection de l'apparence Mac

Maintenant vous remarquerez que votre système en entier fonctionne avec l'allure du Mac. La première fois que j'ai vu cela en 95, j'en ai été soufflé. Je venais de passer un an sur un pénible portage de OpenWindows à Motif sur des parties d'applications en C. Puis quelqu'un me montre comment porter son application du SunOS à Solaris à MacOS en un clic !

Figure 12. Fenêtre Transcript avec l'apparence Mac

Fenêtre Transcript avec l'apparence Mac

Rendez-vous compte que la fenêtre ci-dessus tourne sur une machine Linux ! J'utilise fréquemment cette fonctionnalité au bureau lorsqu'on développe pour WIndoze, parce que je préfère l'apparence de Motif.

Réflexivité

C'est en cela que je considère Smalltalk réellement puissant : sa réflexivité. 98% de Smalltalk est écrit en Smalltalk, ce qui l'environnement rend facile à personnaliser, étendre, ou perfectionner (Squeak est l'exception, puisqu'écrit en Smalltalk à 100%). Alors il est facile de voir comment Smalltalk est écrit et de l'adapter à vos besoins. En fait, c'est la base du développement en Smalltalk. Vous commencez avec une application qui tourne, vous ajoutez des extensions spécifiques à votre affaire, ôtez les parties qui ne vous servent pas, et livrez l'application. Voici un exemple simple montrant comment étendre Smalltalk :

Exemple 4. Ajout de menus inspecter à toutes les fenêtres

  • Vous vous rappelez quand j'ai dit que Transcript et Workspace sont des objets ? Vous devriez donc pouvoir les inspecter, ok ? Ok. Cependant, ce n'est pas si simple, dans l'environnement tel qu'il est par défaut, de prendre n'importe quelle fenêtre pour l'inspecter. Nous allons ajouter une extension simple pour permettre ceci.

  • Ouvrez un navigateur de classe BrowseAll Classes

  • Vous avez maintenant sous les yeux un navigateur de classes, ou navigateur système.

    Figure 13. Navigateur de classes vide

    Navigateur de classes vide

  • En observant les colonnes de gauche à droite, vous voyez : les catégories, les classes, les protocoles, les méthodes, et le code de méthodes. De plus, vous verrez deux radio-boutons : le premier fait naviguer du côté instance, l'autre du côté classe. (Nous allons faire une méthode d'instance et une méthode de classe).

  • Cliquez avec le bouton du milieu sur la colonne catégorie et sélectionnez Find Class..., puis entrez StandardSystemController dans le dialogue qui s'affiche

  • Après que le navigateur a mis la classe StandardSystemController en surbrillance, cliquez sur le protocole menu messages dans la colonne protocole, et sur la méthode back dans la colonne méthode. Vous devriez voir :

    Figure 14. Navigateur de classes avec une méthode sélectionnée

    Navigateur de classes avec une méthode sélectionnée

  • Résumons : Les catégories sont des groupes de classes. La catégorie Interface-Framework est sélectionnée. La classe StandardSystemController est aussi sélectionnée. Les protocoles sont des groupes de méthodes. Nous sommes donc actuellement dans le groupe menu messages. Les méthodes contiennent le code implémenté. Nous avons sélectionné la méthode back.

  • Nous allons ajouter une méthode dans le protocole menu messages. Pour ceci, mettez en surbrillance tout le contenu de la méthode courante et effacez-le. Ne vous inquiétez pas, la méthode n'a pas disparu et ne sera pas effacée pour autant. C'est juste une façon simple de créer une nouvelle méthode dans le protocole actuellement sélectionné.

  • Puis tapez le code :

    inspectView

    self view model inspect.

  • Puis, pour sauver la méthode, cliquez avec le bouton du milieu et choisissez accept

  • Vous verrez que la méthode que vous venez de créer apparaît maintenant dans le navigateur. Elle a déjà été compilée et est prête à être exécutée. Vous devriez voir :

    Figure 15. Méthode inspectView ajoutée

    Méthode inspectView ajoutée

  • Ensuite, nous devons ajouter une méthode du côté classe. Cliquez sur le radio-bouton class dans le navigateur de classe

  • puis cliquez sur le protocole class initialization et la méthode flushMenus

  • comme précédemment, effacez le texte pour la méthode (la méthode flushMenus ne sera pas détruite) et tapez :

    initializeForAdditions
      "initialize the menu."
      "self initializeForAdditions"

      ScheduledBlueButtonMenu :=
       Menu
        labels: relabel as...\refresh\move\resize\front\back\collapse\close\inspect'with CRs
        lines: #(1 7 8)
        values: #( #newLabel #display #move #resize #front #collapse #close #inspectView).

  • Après avoir saisi ceci, cliquez avec le bouton du milieu et choisissez accept pour la méthode. Vous devriez voir maintenant :

    Figure 16. Méthode initializeForAdditions ajoutée

    Méthode initializeForAdditions ajoutée

  • OK, maintenant ça devient joli. Cliquez du bouton droit sur la colonne méthode, vous devriez voir le menu de la fenêtre :

  • À ce moment-là, le code a été compilé en pseudo-code. Mais comme c'est du code d'initialisation, il n'a pas encore été exécuté. On peut l'exécuter directement depuis le navigateur ; placez le texte self initializeForAdditions en surbrillance, cliquez avec le bouton du milieu et do it

  • Puisque le code a été exécuté, vous devriez voir inspect ajouté en bas du menu de fenêtre :

    Figure 17. WindowMenu modifié

    WindowMenu modifié

  • Maintenant on peut inspecter n'importe quelle fenêtre pour laquelle ce menu est défini. Essayez d'inspecter ce navigateur de classe que nous étions en train d'utiliser. Cliquez avec le bouton droit et choisissez inspect. Vous verrez un inspecteur sur le navigateur de classe. Si vous sélectionnez l'attribut className, vous verrez que le nom de classe correspond à la classe sélectionnée à cet instant :

    Figure 18. Sélection de classe

    Sélection de classe


Note : nous avons juste fait une extension de l'image de base. C'est un changement de manière de coder qui devrait être suivi avec précautions.

Ramasse-Miettes

Quand je marche dans la vallée des délais désespérés, je ne crains aucune libération car Smalltalk est avec moi.

Ramasse-Miettes : alias Victor, Nettoyeur. Smalltalk possède un ramasse-miettes, ce qui veut dire que les objets qui ne sont plus référencés sont nettoyés pour libérer la mémoire. Je me souviens de m'être arraché les cheveux plus d'une fois en programmant en C++, à chercher des fuites de mémoire. Ceci parce qu'en C++ c'est au développeur de s'occuper de la mémoire. Si vous ne libérez pas la mémoire utilisée, votre application continuera sans fin à prendre de plus en plus de mémoire jusqu'à ce la machine n'en ait plus et plante.

En parlant de plantages de machine, vous remarquerez que nous n'avons jamais manipulé de pointeurs. C'est parce que Smalltalk n'a pas de pointeurs. (Bon, techniquement ce n'est pas correct. Chaque référence de variable est en fait un pointeur sur un objet, mais en Smalltalk le développeur est libéré du poids de la maintenance des pointeurs).

Résumé

J'espère avoir été capable de faire un tour concis et informatif de Smalltalk, abordable pour des programmeurs non OO. J'ai montré que Smalltalk :

  • est un environnement OO pur, encourageant la programmation OO

  • peut sauvegarder l'état exact de l'environnement de développement (IDE)

  • est un langage littéral

  • est compilé en pseudo-code incrémentalement

  • est un environnement portable, une fois écrit, ça tourne partout (machine virtuelle/IHM)

  • peut inspecter et manipuler des objets en temps réel

  • fournit un haut degré de réfléxivité (démarrage avec une application lancée, extensions)

  • possède un ramasse-miettes, pas de pointeurs explicites.

Il y a bien d'autres choses que j'aurais voulu aborder dans cet article, mais les contraintes de longueur ne me le permettent pas :

  • l'aide en ligne

  • le débogueur

  • les nombres (essayez d'imprimer factorielle 1000000 dans un espace de travail (si vous avez le temps de creuser — la taille de nombres est limitée uniquement par la quantité de mémoire), ou essayez d'inspecter 12/7)

  • les paquets — un mécanisme de partage de code

  • le navigateur de réimplémentations (Refactoring Browser) — Mon outil de programmation préféré

  • HotDraw — une structure de travail réutilisable pour le dessin

  • le test de structures — automatiser le test

  • le changement dynamique d'éléments de fenêtres pendant le fonctionnement

Glossaire

Catégorie

Un groupe de classes

Classe

Un type d'objet

Marché horizontal

Un marché qui a tendance à avoir un public large avec un faible impact dessus. Un logiciel prêt-à-cuire s'adresse à un marché horizontal. Par exemple, une suite bureautique — si ça plante, repartez sur votre dernière sauvegarde.

Inspecteur

Un type d'interface graphique pour un objet, permettant d'observer et manipuler les objets

Littéralité

Une définition simple de la littéralité est le degré de lisibilité/simplicité du langage. La programmation littérale est une programmation « pour-le-développeur-qui-passe-après-vous ».

Méthode

Un morceau de code Smalltalk pour un objet

Objet

Un groupe de données et d'opérations en relation. Son comportement est représenté par ses opérations sur ses données

Protocole

Un groupe de méthodes

Réflexivité

Manipulation d'un environnement dans lui-même. Dans Smalltalk, 98% étant écrit en Smalltalk, il est facile de personnaliser, étendre et adapter l'environnement. (Squeak est une exception, car écrit à 100% en Smalltalk)

Transcript

La fenêtre principale de l'IDE, d'où les autres fenêtres (navigateurs, workspaces, etc) sont lancées. Conserve aussi une liste active des messages systèmes

Workspace

Un bloc-notes où les développeurs peuvent faire des essais avec du code

Marché verticale

Un marché qui a tendance à avoir un public restreint avec un très fort impact dessus. Par exemple, un système de gestion de réseau pour une société de télécommunications — si ça plante, la société perd un million de dollars chaque minute

Autres Références

  1. A history of Smalltalk

  2. A brief history of Smalltalk

  3. GoodStart

  4. WikiWikis :

  5. Groupe de discussion : comp.lang.smalltalk

  6. Archives Smalltalk libres :

    1. Smalltalk(UIUC — le papy des archives Smalltalk)

    2. Squeak

    3. VSE(en Allemand)

  7. Tutoriels :

  8. Plein de liens sur Smalltalk

  9. La Smalltalk FAQ de Dave(il y a beaucoup de trucs ici et même si c'est un peu dépassé, c'est AMHA la meilleure. Dave, ce serait génial si jamais tu trouvais le temps de finir ça).

  10. eXtreme Programming (qui est à l'origine d'un projet Smalltalk)



[1] Chaque implémentation a ses propres restrictions de licence. À ma connaissance, seul GNU Smalltalk et Squeak ont une licence de type GNU copyleft.

[2] Ces deux dernières implémentations sont les plus récentes.

[3] Dans l'article : http://x37.deja.com/getdoc.xp?AN=564595555&CONTEXT=949863157.89849870&hitnum=0

Author:
Eric Clayberg
<clayberg@instantiations.com>

Patrick Logan <patrick@c837917-a.potlnd1.or.home.com>
wrote in message
news:hTN84.453$HT1.6388@news.rdc1.wa.home.com...
>
> I wish the original Oak team had chosen to adopt Smalltalk
> rather than invent Java

They tried to, but ParcPlace wanted too much on a per-copy royalty basis...sigh/

[4] Bah ! Les vrais programmeurs réinventent toujours la roue, ça fait pousser le poil aux pattes !... héhé, je suis tombé dans le panneau trop souvent toutes ces années. Le plus souvent, les roues réinventées ont tendance à être carrées. C'est trop moche que les écoles encouragent cette mentalité pendant l'apprentissage théorique. (fin de digression)

[5] C'est une terminologie vague qui diffère selon les gens avec qui on parle. Dans mon idée, un langage basé sur de sobjets (OB) est un langage non-OO qui a évolué vers l'orienté-objets (C++, OO-COBOL, etc). Certaines personnes les appellent langages OO bâtards.

[6] Quelques numéros sur la productivité de Software Productivity Research (Un échantillon du rapport moyen instructions/fonctions du source : Smalltalk : 21, C : 128, C++ : 53, Visual Basic 5 : 29)

[7] GoodStart — who's using Smalltalk — http://www.goodstart.com/whoswho.html

Adaptation française de la Gazette Linux

L'adaptation française de ce document a été réalisée dans le cadre du Projet de traduction de la Gazette Linux.

Vous pourrez lire d'autres articles traduits et en apprendre plus sur ce projet en visitant notre site : http://www.traduc.org/Gazette_Linux.

Si vous souhaitez apporter votre contribution, n'hésitez pas à nous rejoindre, nous serons heureux de vous accueillir.