- Le cœur de la productivité en programmation réside moins dans le langage lui-même que dans un riche écosystème de bibliothèques
- Des frameworks qui exploitent les fonctionnalités avancées du langage, comme Ruby on Rails, offrent une forte productivité même aux non-spécialistes
- Cependant, en raison des limites structurelles du langage, il est difficile d’implémenter un framework du niveau de Rails en Java ou en C
- La conception d’un langage détermine directement la forme et la complexité des bibliothèques qu’il est possible d’écrire, et c’est là l’objectif fondamental de l’évolution des langages
- Le langage Stanza illustre, sous cet angle, l’importance d’une conception de langage qui permette de créer des bibliothèques puissantes et faciles à utiliser
Relation entre langages de programmation et bibliothèques
- La plupart des langages de programmation partagent des éléments de base similaires, comme les variables, les tableaux, les boucles et les fonctions
- Certains langages proposent des fonctionnalités avancées comme les fonctions de première classe ou les coroutines, mais les non-spécialistes les utilisent rarement
- Pour de nombreux développeurs, ce qui améliore la productivité, ce sont les bibliothèques plus que le langage
- Par exemple, Ruby on Rails permet de construire facilement des applications web adossées à une base de données
- Grâce à Rails, la préférence va davantage au framework qu’au langage Ruby lui-même
Interaction entre Ruby on Rails et les fonctionnalités du langage
- Rails exploite diverses fonctionnalités de Ruby, notamment la métaprogrammation, l’évaluation à l’exécution, les fonctions de première classe et le ramasse-miettes
- Exemple : ActiveRecords utilise la métaprogrammation, tandis que le système de templates utilise l’évaluation à l’exécution
- La gestion des événements est implémentée en transmettant des fonctions de première classe comme callbacks
- En Java ou en C, ces fonctionnalités font défaut, ce qui rend impossible l’implémentation d’un framework du niveau de Rails
- La métaprogrammation de Java n’est pas assez puissante pour implémenter ActiveRecords
- Rails est donc possible grâce à la structure du langage Ruby, et la conception du langage détermine les possibilités offertes aux bibliothèques
La conception du langage détermine la forme des bibliothèques
- Le langage C ne prend en charge la réutilisation qu’au moyen de la déclaration et de l’appel de fonctions ; la plupart des bibliothèques C prennent donc la forme d’ensembles de fonctions
- Ruby prend en charge les fonctions de première classe, ce qui permet d’exprimer de façon concise « l’action à exécuter lors d’un clic sur un bouton »
- En Java, à l’inverse, il faut définir une classe de gestionnaire, ce qui complexifie le code
- Le pouvoir d’expression d’un langage définit directement la structure et l’utilisabilité des bibliothèques
Logiciels interactifs et émergence de frameworks extensibles
- Dans l’informatique par lots des années 1970, des bibliothèques centrées sur les fonctions suffisaient
- Les logiciels interactifs modernes nécessitent des bibliothèques extensibles
- Dans les GUI ou les systèmes orientés événements, il faut une structure du type « exécuter mon code quand l’utilisateur clique »
- Java et C++ prennent en charge l’extension via l’héritage et la redéfinition de méthodes, et cette structure a évolué en framework
Contexte de conception de Stanza et limites des langages
- La motivation de la conception de Stanza est née de la difficulté à écrire en Java une bibliothèque de programmation de jeux facile à utiliser
- En Java, il fallait exprimer la concurrence sous forme de machine à états (state machine)
- Scheme prend en charge les continuations, ce qui permet une implémentation plus intuitive
- Cependant, Scheme ne prend pas en charge la vérification statique des types, ce qui réduit l’efficacité du débogage
- À l’heure actuelle, la plupart des langages ne permettent pas d’étendre leur système de types sous forme de bibliothèque
- Stanza propose un système de types optionnel, un ramasse-miettes et un système objet fondé sur les multiméthodes
- Mais il n’est pas possible d’écrire de zéro un nouveau système objet défini par l’utilisateur
Finalité des langages et pistes de recherche
- L’objectif d’un langage de programmation généraliste est de permettre la création de bibliothèques puissantes et faciles à utiliser
- Plus un langage est puissant, plus l’usage des bibliothèques devient concis
- Lorsqu’un code utilise une bibliothèque bien conçue, il possède un naturel qui donne l’impression de lire une phrase adressée à un collègue
- Racket, Shen et les recherches sur les protocoles méta-objets explorent des systèmes de types et d’objets extensibles
- En fin de compte, les langages se distinguent par « quelles bibliothèques ils permettent d’utiliser, et lesquelles ils ne permettent pas »
- Derrière les bibliothèques élégantes se trouvent des décennies de recherche et d’efforts de conception sur les langages
1 commentaires
Commentaires sur Hacker News
Le meilleur exemple, c’est Prolog. On le présente souvent comme le langage emblématique de la programmation logique, mais en réalité ce n’est guère plus qu’un ensemble d’algorithmes, qui pourraient être implémentés comme bibliothèque dans divers langages. Il suffirait, à mon avis, de fournir l’expression syntaxique de Prolog adaptée à la grammaire de chaque langage
Il y a dix ans, j’étais fan de Scala. Le concept de « Scalable Language », qui permet de construire des DSL dans le système de types, me séduisait beaucoup. Mais j’ai perdu l’intérêt quand la communauté s’est mise à l’utiliser comme une sorte de Haskell sur la JVM. Aujourd’hui, j’attends avec intérêt des technologies comme WASM ou Graal, qui pourraient rendre le choix du langage plus flexible. Souvent, JS suffit, mais c’est bien d’avoir l’option d’un langage plus bas niveau comme Rust quand c’est nécessaire
J’aimerais bien pouvoir remplacer bash par un langage de script typé. J’ai écrit un petit parseur JSON en Elixir, et c’était plutôt agréable
#!/usr/bin/env ocaml. En revanche, il n’y a pas de mécanisme pour installer automatiquement les dépendances externes dans un fichier uniqueLangages et bibliothèques ne sont pas mutuellement exclusifs. Certaines bibliothèques se comportent pratiquement comme des langages, et inversement certains langages sont conçus pour une bibliothèque précise. Julia, par exemple, illustre bien l’équilibre entre performance et ergonomie. On peut écrire directement du code haute performance en Julia et obtenir une exécution optimisée grâce à une compilation spécialisée par types au niveau JIT. Le modèle apparent reste un simple appel de fonctions, mais en interne c’est extrêmement sophistiqué
Raku est conçu comme une structure qui assemble plusieurs sous-langages (slangs). Par exemple, les expressions régulières, PEG, le quoting, etc., y sont traités comme des mini-langages distincts, et avec Slangify on peut facilement ajouter son propre DSL
Un développeur senior m’avait dit un jour : « si je vois Rails sur un CV, je le jette directement ». Ça m’a rappelé à quel point juger les gens à partir d’un langage est absurde
Langage ou bibliothèque, au fond ce sont surtout des moyens de communication avec la machine comme avec les humains. La machine comprend les bits et les tensions ; les humains, eux, comprennent des intentions et des concepts. Donc si un langage ou une bibliothèque offre aux humains un moyen clair et rapide d’exprimer cela, peu importe qu’on l’appelle langage ou bibliothèque. Rails ou Stanza, si c’est adapté au but et compréhensible pour l’équipe, alors c’est le bon choix
Pour moi, « la bibliothèque est le langage final ». Ruby on Rails, par exemple, est un excellent langage de services web bâti sur Ruby. Ruby et Rails ont évolué l’un pour l’autre. Au fond, programmer n’est qu’un processus continu de traduction entre langages
L’idée selon laquelle « plus un langage est puissant, plus il est facile d’utiliser des bibliothèques » me paraît juste. Dans l’ancien Java, il était difficile de créer un framework du type Express
Si l’on cherche un framework web pour le langage C, il y a toujours PHP, non ? ;)