Bonjour à tous. Dans cette séquence, nous allons
illustrer Pharo en le comparant avec un autre langage de
programmation objet qui est Java.
Alors, en Pharo, on ne manipule que des objets.
On effectue des choses uniquement grâce aux messages et à
l'assignation de valeurs dans des variables.
Les slides suivantes vont vous montrer quelques
équivalences entre Java et Pharo pour bien comprendre les
différences et les ressemblances.
Donc, dans la partie du haut, on voit en Java la création
d'une nouvelle collection qui contient des chaînes de
caractères et l'affectation de cette nouvelle collection
dans une variable appelée Strings.
En Pharo, c'est la même chose, la classe qui gère les
collections s'appelle OrderedCollection plutôt qu'ArrayList,
mais le comportement de cette collection est le même.
Alors plusieurs choses sont à noter: premièrement,
new en Pharo, c'est l'envoi d'un message à une classe.
Donc, c'est l'envoi du message new à la classe
OrderedCollection qui va créer une nouvelle instance de cette collection.
En Java, le new est placé devant cette construction
syntaxique particulière à l'instanciation d'objets
en Java. Alors que pour Pharo, c'est juste un envoi de
message complètement standard. Il n'y a pas de typage
statique en Pharo.
Et donc, beaucoup de choses qui apparaissent dans la
ligne Java n'apparaissent pas dans la ligne Pharo.
On n'a pas le fait que la collection contienne des chaînes de caractères.
Et on n'a pas non plus le fait que Strings est une collection.
Une autre équivalence, cette fois pour la création d'un
processus fils. Donc, on a un bout de code qu'on voudrait
voir exécuter dans un autre processus.
En Java, on est obligé de créer une nouvelle instance de
la classe Thread en lui donnant un Runnable en paramètres.
Donc, on fait un new Runnable et à l'intérieur comme
Runnable est une classe abstraite, il faut définir une
méthode qui lui manque. Donc la méthode s'appelle run et
son contenu, c'est le code qu'on veut vouloir exécuter
dans un processus fils. Donc ici, c'est this.
doSomething. Donc ce code-là, la méthode doSomething
appartient à la même classe que celle où ce code se trouve.
En Pharo, on voit que la syntaxe est beaucoup plus simple.
Donc, l'équivalent de toute cette partie-là en fait, c'est
cette partie-là, voilà. Et à la fin, le start
qui est ici va permettre de lancer le processus fils.
Et c'est ce qu'on va pouvoir faire grâce au mot fork.
Donc c'est un message qui est envoyé au block.
Depuis Java 8, qui est la toute dernière version de Java,
la syntaxe s'est bien améliorée en Java.
Et donc on voit que le code est beaucoup plus clair en Java maintenant.
Et donc l'équivalent de ce block-là, c'est la
fermeture lexicale qui se trouve ici.
Et le reste est identique au slide précédent.
Donc pour rappel, en Pharo, il y a trois types de
messages: les messages unaires, donc des messages qui ne
prennent pas d'arguments qui s'appliquent sur un receveur.
C'est le cas de la méthode factorielle qu'on a déjà pu voir.
C'est aussi le cas de la méthode cr qui permet d'afficher
une ligne vide dans la console.
Il y a aussi les messages binaires, donc eux, ils s'appliquent
à un receveur. Et ils prennent une valeur en argument.
Donc, c'est le cas par exemple des opérateurs
mathématiques + qui fait la somme entre 3 et 4.
Et là, t->, ça permet de créer une paire donc avec une
clé et une valeur: donc 5 -> 10, ça crée la paire 5 10.
Et le troisième type de messages, ce sont les messages à mots-clés.
Donc eux, ils peuvent prendre un, deux, trois ou plus de paramètres.
Ce sont des mots qui sont séparés par des deux points.
Donc là, le message à mot-clé, c'est show.
Il s'envoie sur l'objet Transcript et il prend un
paramètre qui est la chaîne de caractères affichée dans la console.
Et dans le deuxième exemple, le message, c'est between: and:.
C'est un message séparé en deux mots clés.
Il apprend deux arguments et il s'applique sur un receveur.
Donc, le message between: and: s'applique sur l'objet 2
et prend les arguments 0 et 5.
Donc, pour comparer par rapport à Java, surtout par
rapport au troisième type de message, les messages à mots
clés, c'est ceux-là qui ont une grosse différence par rapport à Java.
Donc, en Java, on a un receveur, un point,
le nom du message qu'on envoie à l'objet et les arguments
séparés par des virgules entre parenthèses.
En Pharo, on exprime la même chose en séparant
les différents mots clés du nom de la méthode et en
mettant les arguments au milieu. Donc, si je prends un
exemple concret, dans cet exemple on envoie le message
send à un facteur dans le but d'envoyer un courrier à un
destinataire. Donc, ça, c'est la syntaxe Java et on va la
décomposer petit à petit, pour arriver jusqu'à la syntaxe Pharo.
Une première étape, on extrait les parties qui sont
syntaxiques de Java.
Donc, le point, les parenthèses, la virgule et le point-virgule.
On les sort. Donc on a postman send mail récipient.
Si on transforme ça en phrase pour simplifier la lecture,
on a postman sent mail to recipient, donc c'est plus facile à lire.
Et pour avoir une syntaxe correcte Pharo, on ajoute les deux points.
Donc ici, il y a un message: le message send to appliqué
au facteur et prenant deux arguments: le courrier et le
destinataire.
Les conditionnels comme if, else et les
boucles loop, do, for, etc.
, tout ça, ce sont des mots clés en Java.
En Pharo, on n'a pas ces mots-clés.
Ce ne sont pas des mots particuliers qui sont définis au
niveau du langage et du compilateur.
Ce sont juste des méthodes et des messages qu'on va
envoyer à certains types d'objets. Donc en Pharo par
exemple pour faire un If, on envoie le message ifTrue
ifFalse, donc c'est un message qu'on envoie à un booléen
et qui prend deux blocks en paramètres, un block qui est
exécuté si le booléen est vrai et un block est exécuté si
le booléen est faux. De la même façon, les boucles sont
juste des messages qu'on envoie à certains types d'objets.
Donc, dans le premier exemple, j'ai l'objet 4, c'est en
nombre, je peux lui envoyer le message timesRepeat avec
un block en paramètres. Et la méthode sous-jacente va
exécuter le block, le nombre de fois
indiqué par le receveur.
Donc, là, timesRepeat quelque chose va exécuter ce
quelque chose quatre fois. De la même façon, le message
to: do: est envoyé à un nombre et prend un nombre et un
block en paramètres et là, entre la valeur i qui est le
paramètre du block va prendre toutes les valeurs entre 0 et 100.
De la même façon, le message de to: by: do:,
prend en plus un pas.
Et donc i va prendre les valeurs de 0 à 100, mais
seulement les multiples de 3, donc 0, 3, 6, 9, etc.
Enfin le message envoyé à une collection est l'équivalent
d'une boucle for each en Java et donc va exécuter le
block pour chaque élément de la collection.
La variable each qui est ici va d'abord prendre la
première valeur qui se trouve dans la collection, donc le
premier élément de la collection.
Le block va être exécuté avec cette valeur each.
Puis each va prendre le deuxième élément de la collection.
Le block va être exécuté avec cette valeur de each jusqu'à
la fin de la collection.
En résumé, il y a trois types de messages: les messages
unaires, les messages binaires et les messages à mots-clés.
L'ordre de précédent, c'est d'abord on exécute tout ce
qui est entre parenthèses, ensuite les messages unaires,
ensuite les messages binaires, ensuite les messages à mots-clés.
Les conditions et les boucles sont juste des messages qui
sont envoyés à un certain type d'objets contrairement à d'autres
langages comme Java, nous l'avons vu, ou des mots clés
particuliers du langage avec des instructions
particulières au niveau du compilateur. En Pharo, ce sont
des messages qui sont envoyés à des objets particuliers.