Introduction
Salut à toutes et à tous ! J’espère que tout le monde va bien.
L’année file et nous voici déjà en Mindshifting May, le mois que j’attends avec le plus d’impatience, surtout parce qu’il inclut Prolog !
J’espère qu’Analytical April a plu. Absolument plein de gens y ont participé et je pense que ça a été l’un des mois les plus réussis jusqu’ici. J’ai aussi discuté avec Simon Peyton Jones en avril, dans le cadre d’une interview tardive de Functional February. C’était vraiment bien, et je te recommande vraiment de la regarder, ne serait-ce que pour la magnifique phrase : « Quand le calcaire de la programmation impérative se sera érodé, le granite de la programmation fonctionnelle apparaîtra en dessous. »
Bref, passons à Mindshifting May ! Comme d’habitude, Erik et moi allons te donner un aperçu rapide de ce que sont ces mois et des différents langages que nous allons explorer.
Nous avons donc pas moins de six langages ce mois-ci : Ballerina, Pharo, Prolog, Red, Tcl (prononcé « tickle ») et Unison. Chacun de ces langages est assez différent des langages plus « classiques », alors nous te recommandons d’en essayer plus d’un pour voir en quoi ils diffèrent. Je te recommande vraiment Prolog, parce que c’est l’un des langages avec lesquels j’ai pris le plus de plaisir à coder de toute ma vie. Erik est lui aussi très enthousiaste à propos d’Unison, donc c’est un autre bon candidat à essayer.
Les badges
Pour obtenir le badge Mindshifting May, tu dois terminer cinq exercices dans l’un de ces langages pendant le mois de mai.
Il y a aussi le badge 12in23, qui dure toute l’année. Pour l’obtenir, il faut résoudre cinq de nos exercices à l’honneur dans le langage. Si tu regardes ça après le mois de mai, tu peux faire cette partie à n’importe quel moment de l’année, donc tu n’as rien manqué. Choisir ces exercices n’a pas été facile, car les langages sont tous très différents ; nous avons donc opté pour des exercices plus génériques, amusants à résoudre et intéressants pour explorer différentes approches.
- Acronyme : convertir une phrase en son acronyme
- Isogramme : vérifier si une phrase contient des lettres répétées
- Chiffres romains : convertir un nombre décimal en chiffres romains
- Gouttes de pluie : convertir un nombre en sons de gouttes de pluie
- Ère spatiale : calculer l’âge qu’aurait quelqu’un sur les planètes de notre système solaire
Ces exercices, ainsi que ceux des mois précédents, se trouvent tous sur la page #12in23.
Les aperçus
Plongeons dans le vif du sujet et explorons ces langages, avec un aperçu de chacun.
Prolog :
- Une autre façon de penser. Un programme se définit comme un ensemble de relations. On « interroge » ensuite la base de relations pour trouver des réponses grâce à l’unification (filtrage par motif). Parfait pour les systèmes à base de règles
- Peu de syntaxe : un seul type de données (les termes) et un seul élément structurel du langage (les clauses). Les clauses sont entièrement construites à partir de termes et peuvent définir des faits ou des règles.
- Très déclaratif. On se soucie moins de la façon dont les choses sont calculées, et davantage de ce qui doit être calculé. Dans bien des cas, cela veut dire moins de code
- Conçu pour bien fonctionner quand on interroge de grands espaces de recherche. Différentes stratégies de recherche (en profondeur, en largeur), et un élagage automatique
Unison
- Aucun conflit de version dans le code Unison ! Une fonction Unison connaît les hash de ses dépendances, elle peut donc trouver la bonne version du code dont elle a besoin.
- Unison prend en charge la navigation en direct dans le code, depuis l’interface de développement locale et les dépôts hébergés, ce qui te permet de cliquer à tout moment pour voir le code source des bibliothèques dont tu dépends.
- Les capacités sont une façon de gérer les « effets » (par exemple les entrées-sorties) de manière purement fonctionnelle
Pharo
- Très peu de syntaxe : toute la syntaxe tient sur une carte postale (seulement 6 mots réservés !). La syntaxe des messages imite les langues naturelles, avec un sujet, un verbe et des compléments (between: 1 and: 2 +). La sémantique est simple elle aussi (par exemple des règles de priorité d’une simplicité enfantine). Ça le rend plus facile à apprendre et à lire
- La productivité est excellente, une fois passée la courbe d’apprentissage initiale. Pour plusieurs raisons, notamment la sémantique simple et le peu de syntaxe, mais aussi certaines des fonctionnalités phares de Pharo, évoquées plus loin
- Tourne sur la plupart des plateformes (Windows, macOS, Linux, avec prise en charge ARM) sur une machine virtuelle rapide (OpenSmalltalk)
- Pas seulement une implémentation de Smalltalk : Pharo est toujours activement développé (la dernière version de Smalltalk est Smalltalk 80, de 1980)
- Une communauté sympathique
Tcl (prononcé « tickle »)
- Très peu de syntaxe : 12 règles seulement, qui tiennent sur une feuille de papier. La sémantique est elle aussi relativement simple. Les programmes sont donc faciles à lire et à apprendre
- Une concurrence simple grâce aux coroutines, ce qui permet d’écrire du code asynchrone comme du code synchrone
- Une boucle d’événements intégrée pour la programmation réseau et les entrées-sorties de fichiers asynchrones
- Mature, mais toujours en évolution
Ballerina
- Une prise en charge de premier ordre du traitement déclaratif, sûr au niveau des types, des données JSON, XML et tabulaires, avec des requêtes intégrées au langage
- Des types flexibles, avec un typage structurel (duck typing) omniprésent. Les types fermés permettent de faire du sous-typage, tandis que les types ouverts gèrent élégamment l’envoi de trop de données. Liaison de données et validation intégrées lorsqu’on les utilise dans des ressources HTTP
- Une prise en charge intégrée des patrons d’intégration courants et des connecteurs, notamment les transactions distribuées, la compensation et les disjoncteurs
- Tout programme Ballerina est automatiquement observable par n’importe quel outil Open Telemetry, ce qui te donne un contrôle et une visibilité complets sur le comportement et les performances du code.
- Une excellente concurrence grâce aux strands, qui sont des threads légers. Les appels d’entrées-sorties non bloquants sont faciles. Le compilateur peut aider à vérifier les appels d’envoi et de réception entre les workers, ce qui évite les interblocages. L’immuabilité est aussi un atout pour le réseau
- Une gestion explicite des erreurs via les types union et le sucre syntaxique
checkpour t’aider
Red
- Léger. Toute la chaîne d’outils pèse environ 1,5 Mo à télécharger, en un seul exécutable.
- Portable. Compilation croisée facile. Produit de petits binaires sans dépendances. Empreinte mémoire réduite.
- Red est son propre méta-langage et son propre format de données (comme les LISP). Les programmes peuvent transformer et lire du code.
- Réactif : les objets peuvent être liés entre eux pour réduire la taille et la complexité d’un programme (pense aux feuilles Excel)
Où ces langages sont-ils utilisés ?
Prolog :
- Intelligence artificielle (Watson d’IBM)
- Traitement du langage (naturel)
- Base de données distribuée pour les bases de connaissances (TerminusDB)
- A servi aussi à spécifier les règles de typage de la machine virtuelle Java
Unison
- Utilisé pour écrire des systèmes distribués
- Services web généraux
- Traitements par lots
Pharo
- Utilisé pour des outils interactifs
- Utilisé dans des domaines très variés : plateforme de trading en ligne et outil de gestion d’investissement dans le cloud
- Prototypage d’interfaces et d’interactions dans l’industrie de la défense
- Application web de planification d’événements
- Environnement de développement modelable pour explorer des API, des données et des systèmes
Tcl
- Utilisé comme code de liaison ou embarqué
- Utilisé dans les interfaces graphiques des routeurs Cisco
- Divers systèmes de fabrication
- La NASA l’a utilisé à de nombreuses reprises
- Parmi les autres grandes entreprises : Pixar, Boeing, Intel, NBC, et bien d’autres.
- Tk, la boîte à outils d’interface graphique, a été adopté par d’autres langages de « scripting » comme Perl, Python et Ruby.
- Expect, un outil pour automatiser les applications interactives en ligne de commande
Ballerina
- Utilisé pour les applications cloud native
- Utilisé par MOSIP, une plateforme d’identité fondamentale qui aide les gouvernements et d’autres organisations à mettre en place des systèmes d’identité numériques et fondamentaux à moindre coût.
Qu’est-ce qui rend ces langages intéressants d’un point de vue programmation ?
Prolog :
- Langage de programmation logique (l’un des premiers), qui constitue un paradigme à part entière (comme la POO et la programmation fonctionnelle)
- Typage dynamique
Unison
- Langage purement fonctionnel
- Typage statique
Pharo
- Langage orienté objet, mais au sens de Smalltalk. Différent des langages orientés objet « classiques » : pas de constructeurs, pas de déclaration de types, pas d’interfaces, pas de types primitifs.
- Typage dynamique
Tcl
- Multi-paradigme : les styles orienté objet, impératif et fonctionnel sont pris en charge
- Typage dynamique
Ballerina
- Multi-paradigme : orienté objet, fonctionnel et déclaratif
- Typage statique
Red
- Multi-paradigme : impératif, fonctionnel, orienté objet, symbolique, réactif
- Typage statique
Quelles sont leurs fonctionnalités phares ?
Prolog :
- Flexible. Beaucoup de prédicats intégrés fonctionnent dans plusieurs directions. On peut interroger et créer des données avec la même syntaxe. Certains problèmes difficiles dans d’autres langages deviennent triviaux
- Les DCG sont une sorte de combinateur d’analyse syntaxique intégré, parfaits pour analyser, générer, compléter et vérifier des séquences
- La CLP est un moyen efficace de définir un programme en termes de contraintes
Unison
- Le code n’est pas du texte mais des données (immuables). Le code est stocké dans une base de données, et on y accède et on le met à jour via le Unison Codebase Manager. Les fichiers texte ne sont qu’un moyen parmi d’autres de faire entrer du code dans la base. Des données immuables, cela veut aussi dire que les résultats de tests peuvent être mis en cache et que la vérification des types ne doit être faite qu’une seule fois
- Les définitions sont référencées par leur hash, et non par leur nom. C’est ce qu’on appelle du code « adressé par contenu ». L’arbre syntaxique d’une définition détermine son hash. Aucun conflit de version, et les renommages sont triviaux.
- La documentation Unison est une entité de premier ordre du langage, toujours synchronisée avec les fonctions qu’elle décrit. Tu peux y intégrer des exemples vivants et vérifier que ton code d’exemple compile.
- Idéal pour le calcul dans le cloud : pas d’étape de compilation, les fonctions peuvent être distribuées à la volée, et on passe moins de temps à écrire des encodeurs et des décodeurs pour la communication entre services Unison.
Pharo
- Un modèle d’exécution simple : tout est objet, et l’exécution se fait exclusivement par messages (qui sont eux aussi des objets). Même le contrôle de flux passe par des messages. Le modèle est simple, mais très puissant. Très différent des autres langages orientés objet.
- Ton code réside dans une image Pharo, et non dans des fichiers texte. Une image Pharo contient tout l’état de ton application et peut être exécutée dans une machine virtuelle Pharo. Quand tu enregistres ton travail, Pharo sauvegarde l’état complet de l’environnement dans un fichier image. Ce fichier contient tous les objets, leurs relations et le contexte d’exécution. Les fichiers image peuvent être partagés et chargés sur d’autres machines ou plateformes. Les développeurs peuvent ainsi collaborer facilement sur un projet ou distribuer des applications écrites en Pharo
- Vivant et immersif : un retour immédiat pendant l’exécution grâce à l’IDE propre à Pharo. Exécute et modifie ton programme à la volée, même pendant qu’il tourne ! Un débogueur puissant, qui permet de redémarrer des méthodes et de corriger des bugs à la volée
Tcl
- Un système de types simple : tout est une string. « Tout est une string » était la façon dont Tcl était implémenté autrefois. Aujourd’hui, sous le capot, il y a un système de types robuste, où l’entité Tcl (que ce soit une string, un nombre à virgule flottante, un tableau ou un dictionnaire) possède à la fois une représentation propre à son type et une représentation sous forme de string. Cela améliore grandement les performances du code Tcl, qui n’a plus besoin de convertir dans un sens puis dans l’autre depuis les strings.
- « Tout s’exécute comme des commandes ». Il n’y a aucune commande intégrée. Tcl est livré avec une « bibliothèque standard » de commandes, dont if et while, etc. Ajouter de nouvelles commandes de contrôle de flux est très simple, par exemple une boucle until. Il est également facile de redéfinir une commande Tcl.
- Parce qu’il est compact, de sémantique simple et implémenté comme une bibliothèque C, il est facile à intégrer
Ballerina
- Cloud native. Des conversions intégrées de JSON vers des types définis par l’utilisateur. Une syntaxe ultra légère pour créer des (micro)services. Exécution concurrente des services intégrée. Prise en charge de HTTP (1 et 2), GraphQL et gRPC nativement
- Génère automatiquement les artefacts nécessaires pour déployer ton code sur différents clouds. Ces artefacts peuvent être des Dockerfiles, des images Docker, des fichiers YAML Kubernetes ou des fonctions serverless.
- Visualisation intégrée du code sous forme de diagrammes de séquence. Idéal pour visualiser le flux du code. Peut même visualiser les appels HTTP
Red
- Idéal pour construire et analyser des langages dédiés (DSL) ou « dialectes » (terminologie de Rebol). Plusieurs dialectes intégrés :
- Red/System : un langage de programmation système de niveau C, compilé en code natif
- Parse : un puissant analyseur PEG
- VID : un dialecte simple pour créer des interfaces graphiques
- Draw : un dialecte de dessin vectoriel 2D
- Rich-text : un dialecte de description de texte enrichi
- Des interfaces graphiques faciles. Entièrement multiplateformes et natives. Prend en charge la liaison bidirectionnelle, la mise à jour en direct, les événements, et donne accès aux fonctionnalités du système d’exploitation
Lequel ou lesquels essayer pendant le mois de mai ?
Ce sont tous des langages intéressants en soi, on pourrait donc plaider pour n’importe lequel d’entre eux.
- Si le cloud t’intéresse, Ballerina et Unison sont d’excellents choix. Tcl a lui aussi d’excellentes fonctionnalités de concurrence
- Si tu connais la programmation orientée objet mais que tu veux en voir une autre approche, essaie Pharo
- Si tu veux voir ce que ça fait de programmer dans un langage qui ne repose pas sur des fichiers texte, essaie Pharo et son IDE unique et puissant, ou bien Unison et son Unison Codebase Manager.
- Si tu aimes le minimalisme, Tcl, Prolog, Pharo et Red ont tous une syntaxe assez réduite et une sémantique relativement simple
- Si tu veux voir un mélange intéressant de paradigmes, Ballerina, Tcl et Red prennent tous en charge des paradigmes différents
- Si tu veux essayer des paradigmes plus inhabituels, essaie Prolog pour la programmation logique, Red pour la programmation réactive et Ballerina pour la programmation déclarative
- Si tu aimes la programmation fonctionnelle, jette un œil à Unison, et en particulier à ses capacités.
- Si la métaprogrammation t’intéresse, Tcl, Prolog, Pharo et Red offrent tous une excellente prise en charge
Bien sûr, si tu as le temps, je te recommande d’en essayer deux ou trois ! Ils sont tous assez uniques. Résous le même exercice dans deux ou trois des langages à l’honneur et regarde à quel point l’implémentation est différente.