De Smalltalk à Pharo : 40 ans d’innovations en génie logiciel

Simplicité, dynamicité, réflexivité. Tels sont les maîtres-mots du langage à objets Pharo, digne héritier du fameux Smalltalk. Ces ingrédients constituent un formidable moteur d’innovation. Le résultat est un langage puissant, aux multiples domaines d’application.

En 1980, la sortie de Smalltalk a marqué le tournant de l’informatique vers la programmation par objets. Les idées qu’il a introduites – révolutionnaires à l’époque – ont été largement reprises dans de nombreux langages, tels que Java, Python, Ruby, Scala, Perl et bien d’autres.

Dans cet article, nous présentons Smalltalk à travers le prisme de son digne successeur : le langage Pharo. Diffusé sous licence libre MIT, Pharo a repris depuis plus de 10 ans le flambeau de l’innovation en génie logiciel. Il s’appuie pour cela sur un consortium international, mêlant à la fois des entreprises technologiques pour l’ancrage terrain et des laboratoires de recherche universitaires pour l’innovation. Le tout est piloté par l’équipe RMoD du laboratoire de recherche de l’Inria à Lille.

Cet article est paru en septembre 2020, dans le numéro 240 de GNU Linux Magazine France. Je reprends ici quelques extraits. J’espère qu’ils vous donneront envie de lire le texte intégral qui est, désormais, gratuitement accessible.

1. L’histoire de Smalltalk en 3 anecdotes

1.1. Une origine industrielle, en direct de la Silicon Valley

[…] c’est en fait de Smalltalk-80 qu’il s’agit. Cette release a été rendue publique en 1980, après une décennie de recherches au sein du PARC (Xerox Palo Alto Research Center). Ce dernier était un laboratoire de Xerox, société connue pour ses photocopieurs. […]

1.2 Un nom volontairement humble

Le nom Smalltalk a pour origine l’expression anglaise small talk (en 2 mots), qui peut être traduite en « menus propos » ou « banalités ». […] Il s’agit, en fait, d’un pied de nez à la tendance de l’époque d’utiliser des noms suggérant beaucoup, pour des langages in fine décevants comme Zeus, Odin et Thor.

1.3 Une montgolfière en guise de mascotte

La mascotte associée à Smalltalk est une montgolfière. Elle trouve son origine dans le numéro hors-série de la revue Byte Magazine dédié à Smalltalk […]. Elle symbolise la release publique du langage Smalltalk, après une décennie de confinement dans les laboratoires de recherche.

2. Pharo, digne héritier de Smalltalk

2.1. Un ensemble de concepts réduits

Dans Pharo, il y a 2 concepts fondamentaux : les objets et les variables. Les nombres, les booléens, les caractères, les tableaux sont tous des exemples d’objets. Chacun d’eux est associé à une référence unique. Ce sont les références des objets qui sont stockées dans les variables. Pour faire une analogie basée sur le langage C, c’est comme si toutes les variables étaient de type pointeur.

[…]

Les règles de visibilité sont simples. Toutes les classes sont publiques et peuvent être référencées et utilisées dans n’importe quelle méthode. Toutes les méthodes sont publiques et peuvent être appelées de n’importe où. En revanche, la structure des objets est privée, au sens le plus strict du terme. Seul l’objet lui-même peut lire ou modifier sa structure.

2.2. Une syntaxe minimaliste

La syntaxe de Pharo est minimaliste. L’illustration de l’ensemble des règles et des caractères spéciaux occupe à peine le côté message d’une carte postale […]

2.3. Un langage hautement réflexif

En tant que langage réflexif, Pharo permet d’écrire des programmes capables d’analyser leur propre structure, et même de s’automodifier en cours d’exécution. Il permet également de modifier sa propre sémantique, c’est-à-dire la manière d’exécuter les programmes. Deux caractéristiques permettent cette réflexivité : la pureté et la dynamicité.

2.3.1 La pureté

Les concepts du langage sont limités en nombre et uniformément utilisés, sans exception. C’est ce qui fait la réputation de Smalltalk comme LE langage à objets pur par excellence. Ainsi, hormis les variables, tout est objet. Tout objet peut réaliser des traitements en exécutant des méthodes. Et pour adapter la structure ou le comportement d’un objet, il suffit de modifier sa classe. Ainsi, les classes, les méthodes, les threads, l’ordonnanceur des threads, le compilateur, le contexte d’exécution sont tous des objets. Ils peuvent donc être manipulés et être modifiés au même titre que les objets applicatifs. […]

2.3.2 La dynamicité

La réflexivité de Pharo repose aussi sur sa dynamicité. Tout se passe à l’exécution. Le développement consiste à enrichir et adapter, in vivo, un ensemble d’objets. Le développement commence à partir d’un ensemble d’objets fondamentaux comme true, false, ainsi que des classes de base comme Object et Array. Le développeur ajoute progressivement les classes, les méthodes et les objets de son application. Il peut également inspecter et modifier les objets existants, y compris les classes de base. Cette dynamicité est favorable à une approche de développement agile, dirigée par les tests (Test Driven Development, TDD). […] Tout le contexte (variables, pile d’appels des méthodes) qui a débouché sur le dysfonctionnement est directement disponible et observable, ce qui facilite et accélère le déverminage.

[…]

Une autre facette de la dynamicité réside dans la gestion des types. Le typage Pharo est strict, mais résolu dynamiquement. […] C’est à l’exécution que le type est vérifié. En cas d’erreur, la méthode doesNotUnderstand: est appelée. Par défaut, elle lève une exception. […] La méthode doesNotUnderstand: est redéfinie pour capturer les appels de méthodes et les transmettre via le réseau, à des objets situés sur d’autres machines.

3. Les spécificités remarquables de Pharo

Comparé à Smalltalk, Pharo est porteur de nombreuses innovations […]

 

3.1 Des nouveautés sur tous les plans

Sur le plan de l’environnement de développement, la palette d’outils de Pharo s’est progressivement enrichie de manière à améliorer la productivité des développeurs.  […]

Côté infrastructure, une nouvelle génération de machines virtuelles a été développée pour Pharo. Elles ont adopté une architecture 64 bits, […] un compilateur JIT (Just In Time Compiler).

Du côté du langage à proprement parler, le compilateur Pharo a été totalement réécrit […] très modulaire […] facilite la manipulation de l’arbre de syntaxe abstraite, et permet de générer un code intermédiaire de haut niveau, en plus de générer le code machine exécutable. Cette modularité a permis […] d’étendre le langage.

3.2 Les slots pour contrôler la représentation mémoire des objets

Dans la majorité des langages à objets, la représentation en mémoire de la structure des objets est inaccessible aux développeurs. A contrario, Pharo permet d’adapter cette structure au cas par cas, suivant les besoins applicatifs. Pour cela, les variables d’instance sont réifiées. Cela revient à représenter ces variables sous forme d’objets, appelés slots, qui régissent leurs propres cycles de vie (allocation, lecture, écriture…). […]

3.3 Les traits pour un héritage multiple et dynamique

L’héritage entre classes Pharo est à la fois multiple et dynamique. Une classe peut hériter de multiples traits, en plus d’une superclasse. Cette relation est flexible. Elle peut évoluer en cours d’exécution d’un programme. Un exemple de l’utilité de cette caractéristique est la mise à jour à chaud. L’héritage peut être modifié sans redémarrer le programme.

[…] L’idée a depuis été reprise – en partie seulement ! – dans d’autres langages à classes.

Les traits peuvent être vus comme une sorte de classes abstraites. Ils ne sont pas instanciables, mais ils permettent de définir du code réutilisable dans des classes appartenant à différentes hiérarchies. Dans la plupart des langages, un trait ne peut définir que des méthodes. Pharo va plus loin en permettant de créer des traits pouvant définir également des slots.

La figure [ci-dessous] donne un exemple d’héritage multiple illustrant l’usage des traits de Pharo. […]

4. Sélection de logiciels libres développés en Pharo

Pharo est utilisé pour réaliser de multiples logiciels libres, produits par une communauté très dynamique. Ces projets sont très divers. Ils touchent différentes branches de l’informatique […]

4.1 Visualisation de données et animation graphique

L’analyse de grandes quantités de données brutes est un challenge. Une manière d’y faire face consiste à recourir à des représentations graphiques. C’est à cette famille de solutions qu’appartient le projet Roassal. Il permet de visualiser, sous la forme de graphiques interactifs et animés, des données fournies dans des formats variés tels que XML, JSON et CSV. [….]

4.2 Intelligence artificielle et apprentissage automatique

L’intelligence artificielle étant un thème qui a le vent en poupe, ce n’est donc pas une surprise qu’elle soit l’objet de divers livres et projets Pharo […]

4.3 Internet des Objets et Robotique

Comme son nom l’indique, le projet Pharo IoT (Internet of Things) cible le développement d’applications pour l’Internet des Objets. […]

Le support de la programmation interactive (Interactive programming) permet à Pharo IoT de se démarquer par rapport aux autres solutions. Le développeur travaille sur un ordinateur classique, et bénéficie de tout le confort de l’environnement de développement de Pharo. Et, au fur et à mesure des ajouts et modifications du code, le programme est actualisé sur la Raspberry Pi. Ainsi, le débogage des applications est effectué de manière interactive. Le développeur voit sans délai les effets de ses changements. […]

La robotique mobile et autonome est également au cœur du projet PhaROS. Celui-ci a permis différentes réalisations, mettant en œuvre des robots mobiles et autonomes dans différents contextes. En effet, PhaROS permet d’interfacer des programmes Pharo avec l’intergiciel ROS (Robot Operating System). […]

4.4 Le Web, côté serveur

Seaside est le plus populaire des frameworks de développement web en Pharo. Une de ses caractéristiques majeures est la modularité. Les applications sont constituées de composants imbriquables […] il n’y a pas de notion de page. En revanche, n’importe quel composant peut être utilisé pour générer une page en réponse à une requête.

Un composant joue le rôle de contrôleur au sens du fameux schéma de conception MVC (Model-View-Controller). Il a la responsabilité de générer le code HTML de la vue, et de le lier avec le code du modèle. […]

Une dernière caractéristique importante de Seaside est la gestion simplifiée des opérations longues nécessitant plusieurs pages d’interaction avec les utilisateurs. […] Il permet de décrire de telles séquences de manière naturelle, ce qui reflète bien l’aspect séquentiel d’un tel processus. […]

4.5 Applications mobiles pour iOS et Android

Le projet PharoJS est né de la volonté de mettre la puissance de Pharo au service des développeurs d’applications mobiles. Le codage et la mise au point sont effectués en Pharo. Pour le passage en production, le code Pharo de l’application est totalement transformé en JavaScript. Ce code JavaScript, accompagné de fichiers HTML et CSS peut alors être transformé en application mobile […]

[…] pensés pour encourager une approche de développement dirigée par les tests TDD (Test Driven Development). […] les objets DOM, ainsi que d’éventuelles librairies JavaScript utilisées. Pour cela, PharoJS ouvre la page HTML de départ de l’application dans un navigateur web. Le middleware se charge d’établir la connexion pour acheminer les communications entre les objets JavaScript et les objets Pharo en cours de développement. […]

[…] utilisée avec succès pour produire des applications mobiles, […]. Elle peut donc être utilisée également pour d’autres types de réalisations, comme des clients web ou des applications NodeJS.

5. Exemples de produits commerciaux d’envergure basés sur Pharo

  • Architecture à microservices pour la mobilité
  • Place de marché en ligne pour les équipements professionnels
  • Prototypage d’interfaces d’équipements militaires
  • Télécommunications mobiles et IoT

Conclusion

« La simplicité est la sophistication suprême. » Léonard de Vinci

Smalltalk a, sans conteste, marqué de son empreinte l’industrie informatique. Ses concepteurs ont su capturer la substantifique moelle de la programmation par objets. Cet ensemble réduit de concepts de haut niveau, combiné avec une syntaxe simple et uniforme, a un double intérêt. D’une part, l’apprentissage se limite essentiellement à une prise en main des bibliothèques et des outils de développement. D’autre part, les développeurs peuvent se focaliser sur l’analyse du problème et sur la logique de la solution réalisée.

Pharo a été bâti sur ces solides fondations. Sa communauté, équilibrée entre industriels et académiques, constitue une belle source d’innovations en génie logiciel, comme en témoignent de nombreuses nouveautés. Ces évolutions ont pu être introduites grâce aux capacités inédites de Pharo en matière de réflexion et de métaprogrammation.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.