Par Jason Steffler jagwar@magma.ca
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, aux fans de Linux qui n'y sont pas familiers, une introduction à Smalltalk 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 (Orientée Objet) 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 aussi bien être lu indépendamment qu'en codant.
Beaucoup d'exemples cités sont valables pour toutes les implantations de Smalltalk. Bien que ces diverses mises en oeuvre partagent les mêmes caractéristiques de base, il existe des variations entre elles, plus particulièrement quand du code d'interface utilisateur entre en jeu. Il y a un bon nombre d'implantations 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, et 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 apporte 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 :
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 ; la licence de VisualWorks à cette époque s'étant révélée trop coûteuse pour eux 3.
Smalltalk existe depuis un bon 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 est arrivé à un haut niveau de maturité. La puissance de Smalltalk prend ses racines dans sa grande bibliothèque 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 théoriquement pur. Les gens qui ne font pas l'effort de franchir 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 logiciels de gestion de matériel.
Mais finissons-en avec les informations culturelles, passons aux exemples réels.
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 sur le bouton J'accepte (N. d. t. : I Accept sur le site), le téléchargement des 20,954 kilo-octets du fichier vw.exe commence immédiatement. Ce n'est pas le mécanisme de téléchargement le plus sympathique au monde, en particulier le fait que les versions Windoze et Linux soient toutes deux dans une archive auto-extractible sous Windoze, mais ça marche. Téléchargez le fichier 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écifier une variable d'environnement VISUALWORKS avec le chemin d'accès).
Pour le démarrer, il est possible de 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 :
chmod 555 visualnc
Ensuite, pour démarrer l'image, il faut la passer en argument à la machine virtuelle :
cd /dos/vwnc3/image
visualnc visualnc.im
Un écran de rappel de licence apparaît à chaque fois qu'on lance VWNC, cliquez
J'accepte (I Accept) 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ème dont elle a besoin. Pour cela, cliquez sur
File>Set VisualWorks Home dans la fenêtre Transcript. Dans le dialogue qui
s'affiche, saisissez le nom du répertoire parent : /dos/vwnc3/.
Les fenêtres Transcript et Workspace ressemblent à :
Fig. 1 - fenêtre VWNC Transcript
Fig. 2 - fenêtre VWNC Workspace par défaut
L'espace de travail du début contient quelques informations qui valent la peine d'être lues, mais cette lecture n'est pas nécessaire 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 (N. d. t. : encore faut-il avoir activer cette possibilité dans la configuration de son serveur X).
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 est prise et sauvegardée sous la forme d'une image (N. d. t. : une image Smalltalk bien sûr, pas de celles que l'on regarde !). Il n'est pas nécessaire de recharger un fichier texte dans un éditeur de texte et de retrouver l'endroit où vous vous étiez arrêté. Le revers de la médaille c'est que si vous avez une liaison de base de données corrompue ou que vous avez écrasé des objets qui ne devaient pas l'être, c'est sauvegardé dans l'image. Donc, il est nécessaire de connaître l'état de votre environnement au moment de la sauvegarde. Ceci étant dit, vous pouvez enregistrer 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 sauvegardera la localisation du fichier système que vous venez de spécifier). Déplacez les fenêtres comme vous le voulez, puis sauvegardez votre image, sélectionnez File>Save 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 File>Exit VisualWorks...>Exit. Ensuite, pour redémarrer, prenez garde à passer 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 :
Fig. 3 - 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.
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
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. |
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. « Ben 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
Date today | Demande à la classe Date quel jour nous sommes. |
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 d'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 3e exemple de cette section, qui évoque le changement d'état d'esprit nécessaire pour aborder l'OO :
Exemple 3 : Illustration du paradigme du changement
Comme je l'ai déjà mentionné, Smalltalk est compilé en pseudo-codes, 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 que l'on affiche quelquechose :
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 puis :
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 l'on utilise make) et refaire les liens, à chaque fois que l'on veut prendre en compte une modification.
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 écrite en Smalltalk puis exportée en C par programme). 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 File>Settings. Dans le dialogue qui apparaît, choisissez le Look Selection de Macintosh, puis validez.
Fig. 11 - 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 pour des parties d'applications en C. Puis quelqu'un me montre comment on peut porter son application de SunOS à Solaris et à MacOS en un clic !
Fig. 12 - Fenêtre Transcript avec l'apparence Mac
Gardez à l'esprit 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.
C'est en cela que je considère Smalltalk réellement puissant : sa réflexivité. 98% de Smalltalk est écrit en Smalltalk, ce qui rend l'environnement 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
inspectView
self view model inspect.
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).
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 que 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 manuelle des pointeurs).
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 :
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 :
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 de 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ème. |
Workspace | Un bloc-notes où les développeurs peuvent faire des essais avec du code. |
Marché vertical | 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. |
Author:<newline> Eric Clayberg<newline> <clayberg@instantiations.com><newline> <newline> Patrick Logan <patrick@c837917-a.potlnd1.or.home.com><newline> wrote in message<newline> news:hTN84.453$HT1.6388@news.rdc1.wa.home.com...<newline> ><newline> > I wish the original Oak team had chosen to adopt Smalltalk<newline> > rather than invent Java<newline> <newline> They tried to, but ParcPlace wanted too much on a per-copy royalty basis...sigh<newline> <newline> > J'espérais que l'équipe originale de Oak ait choisie de garder Smalltalk<newline> > plutôt que d'inventer Java.<newline> <newline>Ils ont essayé, mais ParcPlace voulait trop de royalties pour chaque copie...sniff.
Copyright 2000, Jason Steffler. Paru dans le numéro 51 de la Linux Gazette de Mars 2000.
Traduction française de Carine Bournez.