26 points par GN⁺ 2025-07-14 | 3 commentaires | Partager sur WhatsApp
  • Distribuer un outil sous forme de binaire statique autonome permet aux utilisateurs de l’utiliser immédiatement, sans installer d’environnement de développement ni de chaîne d’outils supplémentaire
  • Le processus de compilation sert de garde-fou supplémentaire qui réduit le risque de déployer du code défaillant
  • Les outils basés sur des langages interprétés entraînent une forte charge de maintenance, avec l’installation de multiples dépendances et du gaspillage d’espace disque, ainsi que des réinstallations répétées lors des mises à niveau
  • Plus il y a de dépendances, plus les vulnérabilités de sécurité et la surface d’attaque augmentent, ce qui favorise les risques de piratage et les problèmes de maintenance
  • Les binaires statiques issus de langages compilés ne sont pas affectés par les changements de l’environnement externe, ce qui garantit une utilisation stable même après le déploiement

Avantages de la distribution de binaires statiques autonomes

Utilisable immédiatement, sans installation

  • Comme dans le cas où OpenAI a reconstruit Codex en Rust en abandonnant TypeScript, distribuer un binaire unique écrit dans un langage compilé permet aux utilisateurs de l’exécuter immédiatement sans installer de chaîne d’outils supplémentaire
  • Le principal avantage n’est ni la vitesse ni l’efficacité, mais bien le fait de pouvoir utiliser l’outil immédiatement, sans installation

Le compilateur comme garde-fou supplémentaire

  • Les vérifications effectuées à l’étape de compilation réduisent la probabilité de déployer du code défaillant
  • Par exemple, Google Cloud CLI, basé sur Python, a déjà été distribué à plusieurs reprises dans un état inutilisable
  • Même les grandes équipes ont du mal à éviter ce type de problème ; pour les petites équipes, il est encore plus difficile de distribuer de façon fiable des outils fondés sur des langages interprétés

Aucune dépendance à une chaîne d’outils

  • Les outils fondés sur des langages compilés peuvent être distribués sous la forme d’un seul binaire, tandis que les outils en langages interprétés comme Python, Ruby ou TypeScript nécessitent impérativement l’environnement de développement correspondant
  • Comme pour mdl (markdown linter), écrit en Ruby, une réinstallation est nécessaire à chaque mise à niveau de l’environnement de développement (Ruby)
  • Avec markdownlint, basé sur JavaScript, il faut installer npm ainsi que plus de 44 dépendances

Le problème du gaspillage d’espace disque

  • aider, un assistant de code FOSS populaire, est écrit en Python et son installation via Homebrew entraîne l’installation supplémentaire de 51 paquets
  • L’utilisation réelle du disque augmente alors de plus de 3 GiB, soit davantage que la taille de la plupart des distributions Linux
  • À l’inverse, le gestionnaire de paquets uv, écrit en Rust, peut être installé avec un seul binaire de 35 MiB, sans nécessiter Rust lui-même ni rustup

Hausse des vulnérabilités de sécurité

  • Plus un outil a de dépendances, plus la surface d’attaque s’élargit et plus l’exposition aux vulnérabilités de sécurité augmente
  • Le paquet Codex d’OpenAI compte 24 dépendances directes et 184 dépendances indirectes
  • Même si OpenAI audite toutes les dépendances, les versions n’étant pas figées, de futures mises à jour peuvent entraîner des problèmes tels que des vulnérabilités, des paquets malveillants ou des pannes de fonctionnement

Facilité de maintenance

  • Les outils fondés sur des langages interprétés comme JavaScript, TypeScript ou Python cessent de fonctionner si une dépendance disparaît
  • Comme l’a montré l’affaire left-pad, la suppression d’un seul paquet peut paralyser à grande échelle des services et des outils
  • Les langages compilés n’ont besoin de dépendances qu’au moment du build ; même si un dépôt externe disparaît ensuite, l’outil continue de fonctionner normalement

Expérience de l’auteur

  • L’auteur avait auparavant créé des outils comme adb-enhanced en Python, puis a open sourcé divers outils comme gabo et wp2hugo en Go
  • Il n’envisage plus de développer des outils autonomes en Python, TypeScript ou autres
  • Il recommande d’utiliser impérativement des langages capables de produire des binaires distribuables avec liaison statique (Rust, Go, C++, etc.)

Conclusion

  • Les outils autonomes devraient être développés dans des langages compilés comme Rust, Go ou C++
  • Ils devraient être distribués sous forme de binaires statiques avec un minimum de dépendances externes

3 commentaires

 
rikko 2025-07-15

Je ne peux qu’être assez d’accord sur le problème du gaspillage d’espace disque...
J’exploite AKS, et chaque fois que je vois une appli Python avec une image de conteneur qui dépasse 1 Go, j’ai mal à la tête.
Pour l’instant, je récupère juste le Dockerfile, je réduis moi-même la taille puis je remets en ligne, et si je n’arrive pas à descendre sous les 500 Mo, j’abandonne tout simplement lol

 
eususu 2025-07-15

Il existe des paquets dont les dépendances pytorch+cuda ne diffèrent que par la version… c’est assez hallucinant.
Et alors qu’ils n’ont quasiment aucune fonctionnalité, chaque petit daemon installe près de 2 Go de dépendances..

 
rikko 2025-07-15

Avec un runtime CPU utilisé uniquement pour de l’inférence simple, la situation est un peu meilleure, mais avec les services LLM qu’on demande aujourd’hui, le trafic augmente, la capacité aussi, donc quand on fait le calcul des coûts, ça donne envie de jurer lol