Pharo : quoi de neuf ?

Posté par  . Édité par Davy Defaud, stepharo, Xavier Claude, bobble bubble, palm123, Benoît Sibaud, BAud et orfenor. Modéré par Davy Defaud. Licence CC By‑SA.
Étiquettes :
33
8
déc.
2020
Technologie

Au début de Pharo, il a eu droit à une série de dépêches sur LinuxFr.org. Mais depuis 2016 et la dépêche sur Pharo 5.0, il faut bien reconnaître qu’il n’y a pas vraiment eu de nouvelles concernant Pharo sur LinuxFr.org. Ayant acheté le numéro de novembre‐décembre de Programmez, j’y ai lu un dossier intéressant sur Smalltalk qui présente Pharo comme une implémentation moderne et libre de Smalltalk. Cela m’a motivé à me renseigner un peu sur Pharo et, finalement, je me suis dit que certains seraient peut‑être intéressés de voir ce qu’est devenu Pharo depuis la dernière dépêche de 2016.

Sommaire

Pharo, c’est quoi

La pub

Selon la page d’accueil de son site Internet (traduction par mes soins) :

Pharo est un langage de programmation orientée objet pur et un environnement puissant, axé sur la simplicité et le retour d’information immédiat (pensez à un EDI et un système d’exploitation réunis en une même suite logicielle).

Sur la même page, on vous promet :

  • un langage simple et puissant : pas de constructeurs, pas de déclaration de types, pas d’interfaces, pas de types primitifs ; pourtant, un langage puissant et élégant avec une syntaxe complète qui tient sur une carte postale ! Pharo, ce sont des objets et des messages ; et c’est tout ;
  • un environnement vivant et immersif : un retour d’information immédiat à tout moment de votre développement — développement, test, débogage — ; même dans les environnements de production, vous ne serez plus jamais bloqué dans la compilation et le déploiement des étapes !
  • une expérience de débogage étonnante : l’environnement Pharo comprend un débogueur comme vous n’en avez jamais vu auparavant. Il vous permet de parcourir le code, de relancer l’exécution des méthodes, de créer des méthodes à la volée, et bien plus encore !
  • Pharo est à vous : Pharo est le fruit d’une incroyable communauté, avec plus de cent contributeurs pour la dernière révision de la plate‑forme et des centaines de personnes qui contribuent constamment à des cadriciels et des bibliothèques ;
  • entièrement open source : la pile complète de Pharo est publiée sous licence MIT.

Un peu d’histoire

La généalogie de Pharo remonte à Smalltalk et particulièrement la version Smalltalk-72 qui a été créée par Alan Kay pour relever le défi de spécifier un langage de programmation puissant en moins d’une page. Les fondamentaux sont là, mais la maturité viendra vraiment avec la version Smalltalk-80.

Ces développements se déroulent dans le cadre du Xerox PARC qui verra dans les années 70 passer une concentration hallucinante de génies de l’informatique qui poseront les bases de nombreux éléments de l’informatique moderne. Xerox s’est montré capable de monter un centre de recherche particulièrement fécond mais sera moins inspiré concernant la valorisation de ce travail.

Nous éludons une partie de l’histoire pour nous retrouver en 1995 chez Apple où Alan Kay et Dan Ingalls (un autre ancien du PARC de Xerox) créent Squeak, qui est une nouvelle implémentation de Smalltalk hautement portable et dont la machine virtuelle est elle‑même écrite en Smalltalk. Le focus de Squeak est assez orienté sur les applications ludiques et multimédia.

Squeak n’est pas la seule suite qui a été donnée à Smalltalk, on peut par exemple citer :

Pharo, quant à lui, est un divergence de Squeak qui était justifiée de la manière suivante dans la dépêche annonçant le lancement de Pharo :

Le projet Pharo est un projet de Smalltalk open source. L’objectif de Pharo est de pousser Squeak au niveau supérieur.
Pharo est en effet un fork de Squeak. Les forks apparaissent pour résoudre des problèmes difficiles à résoudre dans le projet père. En effet, Squeak est otage de plusieurs sous‑communautés (très amicales au demeurant), ce qui ne conduit à aucune évolution utile pour ces sous‑communautés, et cela résulte finalement en une myriade de forks (Etoys, OpenCroquet, Sophie, Squeak, Qwaq…), chacun spécifique à une communauté/projet, mais insuffisamment généraliste pour une portée plus large.

Dans un commentaire de l’annonce de la version 1.2, ceci était exprimé de la manière suivante :

Pharo est un fork de Squeak, suite à une divergence d’intérêts entre des développeurs qui voulaient continuer à développer une plate‑forme multimédia un peu fourre‑tout (Squeak) et ceux qui voulaient que se développe un Smalltalk avec de meilleures pratiques logicielles (tests unitaires, découplage des modèles et de l’interface utilisateur, intégration continue des modifications…). Pharo vise une cible plus professionnelle avec notamment le développement Web avec Seaside.

Pharo = Smalltalk ?

Alors qu’au départ, Pharo a souvent été présenté comme une implémentation de Smalltalk, la réalité est un peu plus complexe que cela. Pharo est désormais plus présenté comme un langage (fortement) inspiré par Smalltalk comme l’exprimait Damien Cassou dans les commentaires de la dépêche annonçant Pharo 3.0 :

Effectivement, on peut voir Pharo comme une implémentation du standard Smalltalk avec son environnement de développement et ses bibliothèques de code. Cependant, nous avons décidé d’arrêter de dire ça car le standard Smalltalk n’évolue plus alors qu’on améliore Pharo en permanence.
Ça signifie qu’on s’autorise à ne pas être compatible avec le standard. Par exemple, Pharo possède la notion de trait (un mécanisme d’héritage multiple de méthodes) alors que le standard ne le prévoit pas. De même, dans la prochaine version de Pharo, on n’utilisera plus de chaînes de caractères pour déclarer les variables d’instances car on utilisera à la place les Slots (un mécanisme beaucoup plus poussé qui permet d’avoir différents types de variables d’instances avec des comportements différents). Là encore, on s’éloigne du standard Smalltalk. Enfin, le standard définit une API qu’on s’autorise à remplacer petit à petit par une autre plus moderne.
Pour toutes ces raisons, on parle maintenant de « Smalltalk-inspired » et plus d’implémentation de Smalltalk.

La syntaxe de Pharo

La syntaxe de Pharo est très proche de celle de Smalltalk et continue à tenir sur une carte postale. Quand on dit que la syntaxe de Pharo tient sur une carte postale, il faut l’entendre comme le fait que l’on peut illustrer toutes les caractéristiques de cette syntaxe sur un code qui tient sur une carte postale.

La syntaxe de Pharo sur une carte postale, par Xkriva11 — Own work, CC BY‑SA 4.0, https://commons.wikimedia.org/w/index.php?curid=69598356

Pour avoir une explication un tout petit peu plus détaillée, on pourra se référer à cette Cheat Sheet qui tient sur deux pages.

Une des caractéristiques les plus marquantes de Pharo est son caractère très pur de langage orienté objet. Pratiquement tout est objet. Entre autres, il y a très peu de mots réservés. Notamment, on retrouve très peu d’instructions de contrôle intégrées au langage telles que if … then … (else …). Ce genre de contrôle sera implémenté en utilisant des objets et en leur adressant des messages. Dans le cas d’un if … then …, on aura :

Condition
      ifTrue: quelque chose
      ifFalse: autre chose

ifTrue:ifFalse: est une méthode de la classe abstraite Boolean avec une implémentation différente dans les sous-classes concrètes True et False. Voici l'implémentation de la méthode dans la classe True:

True>>ifTrue: trueBlock ifFalse: falseBlock
  ^ trueBlock value

La première ligne est la signature de la méthode ifTrue:ifFalse: qui prend 2 arguments (trueBlock et falseBlock). La deuxième ligne est l'implémentation qui retourne la valeur du premier argument. Dans la classe False, l'implémentation est la même sauf que c'est la valeur du deuxième argument qui est retournée. Grâce à ça, le langage n'a pas besoin de if/then/else.

Dans le code de l'article, un seul message ifTrue:ifFalse: est envoyé à l'objet Condition pour que la méthode du même nom soit exécutée.

Projets utilisant Pharo

Un langage avec des caractéristiques plaisantes, c’est sympa. Mais c’est encore plus intéressant quand l’on peut voir ce que cela donne dans des cas concrets. Ici, une sélection très loin d’être exhaustive de projets réalisés avec Pharo. Les plus curieux trouveront une liste plus longue sur le site de Pharo. Liste qui malheureusement n’est pas totalement à jour dans la mesure où elle renseigne aussi des projets qui ne semblent plus être actifs aujourd’hui.

Dr. Geo

Sans doute le projet le plus connu des moules de LinuxFr.org, vu que ce projet y a eu droit à une série de dépêches.

Illustration Dr. Geo

Dr. Geo est un logiciel de géométrie interactive euclidienne du plan, pour une utilisation à l’école secondaire et primaire. Il permet d’organiser des activités pédagogiques dans l’enseignement de la géométrie, voire d’autres domaines liés des mathématiques. Il propose également une approche de la géométrie dynamique par la programmation, soit par l’utilisation de script(s) intégré(s) à une figure, soit par une description purement programmatique d’une construction géométrique.

Honey Ginger

Honey Ginger est un simulateur hydrodynamique à particules lisses (smoothed‐particle hydrodynamics simulator) avec une visualisation et une interactivité riches. Je ne sais pas à quoi cela peut réellement servir et comment on peut l’intégrer à d’autres choses pour arriver à quelque chose d’utile, mais je trouve les effets dans la vidéo de démo assez amusants.

Illustration de Honey Ginger

Monde bancaire

Je trouve intéressant d’observer que Pharo est aussi utilisé dans des mondes « sérieux » et pas seulement chez des geeks, des académiques ou des graphistes. Ainsi, Pharo a été utilisé dans des GAB déployés dans les rues de Moscou de 2008 à 2015. Cet usage ayant fini semble‐t‐il suite à la fermeture de la banque pour d’autres raisons (information que je n’ai pas vérifiée). On retrouve des vidéos de ces GAB par ici. Autre banque à avoir eu recours à Pharo : CSOB. CSOB est une des trois plus grandes banques en République tchèque et est une filiale à 100 % de la banque belge KBC. Sinon, en Argentine, des banques utilisent Pharo pour la gestion des stocks.

Phratch

Bien que je craigne que le projet soit abandonné depuis lors, j’ai envie de mentionner ce projet de réimplémentation de Scratch en Pharo. Premièrement, parce que je suis un peu inquiet de l’évolution de Scratch qui me semble avec la version 3 aller vers une dépendance à Internet, alors que les versions précédentes pouvaient fonctionner sur un ordinateur en totale autonomie. Deuxièmement, parce que c’est quelque peu particulier de voir un projet être implémenté en Pharo alors que le projet initial était écrit en Smalltalk (les versions suivantes sont passées en ActionScript puis en JavaScript). Comme un retour aux sources. Pour ceux qui aiment ce genre de programme et qui sont prêts à se passer dans le nom de la référence explicite à Scratch, il y a aussi NovaStelo qui revisite le genre.

Quoi de neuf ?

Iceberg

Le gestionnaire de versions historique de Pharo était Monticello. Depuis Pharo 6.0, il a été remplacé par Iceberg qui fait le pont avec Git.

L’esprit de Monticello était très similaire à Git en tant que système de gestion de versions distribué. Le système Monticello était taillé sur mesure pour les systèmes Smalltalk. Une bibliothèque cliente et un serveur ou forge Monticello sont nécessaires pour pouvoir l’utiliser.

Les raisons qui ont poussé Pharo à aller au‑delà de Monticello pour favoriser une compatibilité avec Git sont :

  1. le recours à Git permet à la communauté Pharo d’employer des forges standard déjà maintenues permettant de ne pas devoir y consacrer des ressources qui peuvent être plus utilement employées ailleurs dans le cadre de Pharo ;
  2. Git est devenu de facto le standard comme gestionnaire de versions, imposer d’en utiliser un autre tel que Monticello crée une barrière à l’entrée supplémentaire dans la découverte de Pharo ; faire usage de Git permet ainsi de réduire le coût d’entrée pour un informaticien découvrant Pharo ;
  3. certaines forges telles que GitHub ou GitLab offrent une belle visibilité pour les projets qu’elles hébergent ; ainsi, l’intégration avec Git permet aussi aux développeurs en Pharo de bénéficier de cette visibilité.

Iceberg permet naturellement les opérations classiques d’un dépôt Git (création, clonage, gestion des branches, commits, fusion de branches…). La particularité d’Iceberg c’est qu’il essaie d’articuler le monde des fichiers source (partie Git) avec la représentation objet omniprésente dans le monde Smalltalk. Par exemple, les algorithmes de diff ne mettent pas seulement en lumière une à une les lignes de codes impactées (approche Git) mais mettront en évidence les méthodes modifiées ainsi que leurs classes.

bootstrapping

Depuis Pharo 7.0, Pharo peut être « bootstrappé » à partir d’une version antérieure de Pharo. Dans ce contexte, « boostrapper » signifie compiler un langage en utilisant un compilateur écrit dans ce même langage. En d’autres mots, l’image d’une nouvelle version de Pharo est générée par une application Pharo qui s’exécute dans une version antérieure de Pharo.

Au‑delà de l’élégance de la démarche de créer la version suivante à partir de la précédente, cela permet aussi de créer des noyaux de Pharo réduits. Cela peut être intéressant soit dans une perspective de sécurité (on réduit la surface d’attaque), soit dans une perspective d’informatique embarquée (on réduit l’usage de la mémoire pour Pharo). Il est ainsi possible d’obtenir à l’aide de ce bootstrap des noyaux de l’ordre de 200 Kio.

Calypso

Calypso est depuis Pharo 7.0 le nouveau navigateur système de Pharo (system browser). Il remplace Nautilus, apporte des améliorations pour le travail à distance et des capacités de navigation plus avancées.

Gestion de différents états pour les traits

Avec Pharo comme pour Smalltalk, l’héritage est simple. Une classe n’hérite que d’une seule autre. En revanche, pour quand même pouvoir gérer une forme d’héritage multiple, Pharo implémente la notion de traits. Cela permet de partager des comportements entre classes au‑delà de la hiérarchie des classes. Depuis Pharo 7.0, les stateful traits sont implémentés.

64 bits

Dans ses premières versions, Pharo était une version 32 bits. Depuis Pharo 6.0, une version 64 bits est disponible pour GNU/Linux et macOS. C’est également le cas pour Windows depuis Pharo 8.0.

Et pour la suite ?

La publication de Pharo 9.0 est prévue pour mars 2021. Dans les cartons, une série de nouvelles fonctionnalités :

  • nouvelle syntaxe de classe ;
  • commentaire en Microdown (une sorte de Markdown) ;
  • des nouveaux outils ;
  • nouveau cadriciel graphique (avec possibilités de rendu GTK) ;
  • nouveau mécanisme de complétion automatique ;
  • optimisation du compilateur ;
  • nouvelles machines virtuelles sur ARM 64 bits ;
  • nouveau FFI ;
  • ses tonnes de corrections et tests…

Ressources

Pharo n’est clairement pas un projet qui se cache ou qui est difficile d’accès sur Internet. Il y a pas mal de ressources qui permettent de le découvrir même pour de parfaits newbies. On retrouvera pas mal d’informations sur le site officiel de Pharo.

MOOC

Mettons en exergue la possibilité de suivre un MOOC sur www.fun-mooc.fr. C’est la première version du MOOC remis à jour, mais il se base sur le MOOC précédent qui a connu au minimum quatre sessions. Plutôt orienté pour des personnes ayant une expérience de la programmation, il devrait cependant être accessible à toute personne motivée. Pour contenter tout le monde, le MOOC est constitué de cinq parcours :

  • débutant complet ;
  • en quête de Web ;
  • rafraîchir votre vision OO ;
  • devenir un expert Pharo ;
  • en quête de magie noire.

Ces profils sont complémentaires : pour devenir un expert en Pharo, il faut commencer par le profil débutant et compléter avec les autres parcours.

Des livres

Une série de livres sont disponibles sur Internet. Tous sont téléchargeables gratuitement. Une partie de ceux‑ci sont disponibles en version imprimée sur www.lulu.com. Je ne les ai pas toutes vérifiées mais il semble que tous les livres sont sous des licences CC. Parfois libre, parfois NC.

Ce ne sont pas vraiment des livres, mais pour ceux qui veulent aller plus loin, il y a aussi une recension des articles académiques liés à Pharo.

Mais aussi

Sur la chaîne YouTube de Pharo, on retrouve une grande variété de vidéos, notamment des archives des Pharo Tech Talks qui sont organisées tous les mois. On retrouve aussi de nombreuses présentations réalisées sur Pharo ou certaines de ses applications. Si vous désirez discuter avec la communauté Pharo sur Discord, c’est par là. Si vous voulez obtenir des nouvelles régulières, ce blog est à conseiller.

Aller plus loin

  • # Lisp et Smalltalk, deux mondes pleins de mystères et de promesses

    Posté par  . Évalué à 10.

    Je regardais Common Lisp et Smalltalk avec les mêmes yeux ronds. Ces deux langages semblent tout faire différemment du reste du monde de l'informatique, tout en ayant de nombreux points communs.

    Finalement, je me suis mis au Lisp, au point de faire tourner une paire de services "en production©", mais Smalltalk me paraît toujours aussi étrange… peut-on utiliser Emacs ou n'importe quel autre éditeur pour Smalltalk/Pharo ? Il semble que non. Peut-on lancer un REPL dans le terminal ? Il semble que non. Est-on vraiment obligés d'utiliser la souris dans Pharo ? Il semble que oui !! (et là me paraît son grand fail, mais je devrais l'apprendre avant de juger…)

    Les deux ont un framework web qui fait les choses différemment, Seaside et Weblocks. Mais est-ce que Seaside permet vraiment de se passer de JavaScript ? Et surtout, où peut-on trouver une application de démo ou un site existant qui tourne sous Seaside ?? Je n'ai pas trouvé (et j'ai demandé, une fois). Weblocks permet de construire des applications web dynamiques, basées sur Ajax (si JS est disponible, sinon full HTML), sans une ligne de JS. Certes, il ne permet pas de "double-data binding".

    Je reconnais les promesses de Pharo dans Lisp: "langage simple et puissant", "environnement vivant" avec "un retour d’information immédiat à tout moment", un débogeur interactif qui permet "de relancer l’exécution des méthodes, de créer des méthodes à la volée", etc. Mais comment cela se passe dans Pharo, mis à part la multitude de fenêtres, je n'en ai aucune idée. C'est fou l'informatique…

    • [^] # Re: Lisp et Smalltalk, deux mondes pleins de mystères et de promesses

      Posté par  . Évalué à 2.

      Pas des réponses à tout, et même pas certain des réponses :

      • pour la souris, il y a quand même beaucoup de raccourcis clavier. Vu que je ne suis pas un programmeur, j'utilise la souris sans renâcler; je ne peux donc pas être trop affirmatif mais il me semble que la souris est peu voir pas indispensable.
      • pour SeaSide, je viens de faire le tutoriel TinyBlog et je n'ai pas rencontré de Javascript.
      • pour des exemples utilisant SeaSide voir et chercher SeaSide. Cela répond-t-il à ta question ?

      Surtout, ne pas tout prendre au sérieux !

  • # Similitudes avec omnis studio™ ?

    Posté par  . Évalué à 2.

    Dans la description :

    un environnement vivant et immersif : un retour d’information immédiat à tout moment de votre développement — développement, test, débogage — ; même dans les environnements de production, vous ne serez plus jamais bloqué dans la compilation et le déploiement des étapes !

    une expérience de débogage étonnante : l’environnement Pharo comprend un débogueur comme vous n’en avez jamais vu auparavant. Il vous permet de parcourir le code, de relancer l’exécution des méthodes, de créer des méthodes à la volée, et bien plus encore !

    Je connais ça dans Omnis Studio depuis un bon moment ;) mais Omnis Studio n'est pas libre…

  • # bootstrap / self-hosting

    Posté par  . Évalué à 5.

    Merci pour la mise à jour. Très intéressant.

    compiler un langage en utilisant un compilateur écrit dans ce même langage.

    Cette approche implique une vision forward et jamais backward.

    Et cela ne rendra pas la vie facile aux historiens du futur (s'il y a). Si le compilateur (binaire) est perdu, le compilateur (source) ne pourra plus être compilé. Et si jamais, un programme a besoin de cette version spécifique du compilateur, ce programme ne pourra donc plus être compilé non plus. En imaginant que le matériel est conservé dans un musée, comme « Computer History Museum » par exemple.

    Aujourd'hui, la technologie informatique commence à avoir assez d'années derrière elle pour voir de telles situations. Sans chercher bien loin : essayez avec Haskell des années mi-90.

    Même si c'est élégant et utiliser ses propres outils permet de les améliorer. :-)

  • # Petite correction sur l'envoie de message

    Posté par  . Évalué à 4.

    Condition
          ifTrue: quelque chose
          ifFalse: autre chose
    

    Condition est un objet de type booléen à qui on envoie deux messages (ifTrue et ifFalse, avec à chaque fois un bloc comme argument).

    En fait, ifTrue:ifFalse: est une méthode de la classe abstraite Boolean avec une implémentation différente dans les sous-classes concrètes True et False. Voici l'implémentation de la méthode dans la classe True:

    True>>ifTrue: trueBlock ifFalse: falseBlock
      ^ trueBlock value
    

    La première ligne est la signature de la méthode ifTrue:ifFalse: qui prend 2 arguments (trueBlock et falseBlock). La deuxième ligne est l'implémentation qui retourne la valeur du premier argument. Dans la classe False, l'implémentation est la même sauf que c'est la valeur du deuxième argument qui est retournée. Grâce à ça, le langage n'a pas besoin de if/then/else.

    Dans le code de l'article, un seul message ifTrue:ifFalse: est envoyé à l'objet Condition pour que la méthode du même nom soit exécutée, et non pas deux.

    • [^] # Re: Petite correction sur l'envoie de message

      Posté par  . Évalué à 2.

      Bonjour Damien

      Merci pour la correction.
      Si un gentil modérateur passe encore par ici, qu'il ne se gêne pas pour corriger le texte de la dépêche.

      Sinon, Damien, si j'ai bien suivi ton parcours sur Internet, il me semble que tu t'es professionnellement éloigné de Pharo depuis que tu as quitté l'Inria. Je me demandais si tu utilisais encore Pharo pour des projets personnels ou professionnels. Je trouve que ce serait un retour intéressant.

      Surtout, ne pas tout prendre au sérieux !

      • [^] # Re: Petite correction sur l'envoie de message

        Posté par  . Évalué à 3.

        C'est modifié. Merci pour la correction.

        « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

  • # Intel ?

    Posté par  . Évalué à 3.

    Corrigez-moi si je me trompe. J'ai lu (où ?) que les machines de production des processeurs Intel sont programmées en SmallTalk. La raison serait que comme les programmes sont modifiables à chaud cela permet de changer de génération de processeur sans arrêter les machines, car les arrêter serait problématique.

    • [^] # Re: Intel ?

      Posté par  . Évalué à 2.

      Je suis loin, très loin d'être spécialiste de la question. Tout ce que je peux te dire c'est que c'est une information que je n'ai pas rencontrée lors de mes recherches pour écrire cette dépêche.

      Surtout, ne pas tout prendre au sérieux !

    • [^] # Re: Intel ?

      Posté par  . Évalué à 3.

      Qu’est-ce que tu appelles machine de production des processeurs ? Si tu parles des « graveuses », je ne vois pas bien le besoin (je ne connais pas le domaine), ça m’étonnerait qu’ils changent régulièrement de génération en gravant, ils doivent plutôt faire de gros batch. Et même si c’était le cas, je pense que beaucoup de langages permettent un reload assez rapide.

      (Accessoirement, une recherche Google sur le sujet mène à ce contenu en deuxième résultat)

      « Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.