- Par le passé, les environnements de développement Ada avaient déjà résolu le problème du formatage du code
- Les développeurs manipulaient le code sous forme de représentation intermédiaire (IR) DIANA, puis l’affichaient avec les réglages de pretty-printing de leur choix
- Aujourd’hui encore, des inefficacités et débats récurrents subsistent autour des linters et des politiques de formatage
- À l’époque, la station de travail Rational R1000 offrait un environnement de développement et des fonctionnalités innovants
- À partir de cette approche d’il y a une génération pour le problème du formatage du code, l’article propose des idées pour faire évoluer les pratiques de développement actuelles
Le débat sur le formatage du code — la solution des années 1980
- L’auteur évoque son expérience avec M. Paige, professeur d’informatique qui avait participé à un projet de compilateur Ada lorsqu’il était au lycée
- En 2016, alors qu’il se plaignait des difficultés de configuration d’un outil de linter en demandant « pourquoi doit-on encore subir ce genre de problème ? », on lui a raconté qu’une solution existait déjà depuis plus de 40 ans
L’émergence d’Ada et de DIANA
- Au lieu de stocker du code source textuel, les développeurs Ada utilisaient une représentation intermédiaire appelée DIANA (Descriptive Intermediate Attributed Notation for Ada)
- Chaque développeur pouvait consulter le source selon ses propres réglages de pretty-printing
- Il n’y avait ni débats sur le formatage ni problèmes de linter, et l’éditeur permettait de modifier directement l’arbre du programme, de manière similaire à l’édition projectionnelle moderne
Rational R1000 — un environnement de développement pionnier
- La station de travail Rational R1000 intégrait de nombreuses fonctions avancées, comme la compilation incrémentale, l’analyse statique, la gestion de versions et le débogage
- Elle a été utilisée pour des projets logiciels critiques, notamment pour le DoD, la Station spatiale internationale (ISS) et le chasseur F-22, et a aussi contribué à la naissance d’UML
- Selon Grady Booch, le R1000 était une machine fondée sur DIANA qui ne stockait pas le code source, mais utilisait uniquement le pretty-printing de l’arbre DIANA
Les avantages du développement fondé sur DIANA
- Plus besoin de débats sur le formatage, de configuration de linter ou d’uniformisation de l’environnement d’édition
- Grâce à l’accélération matérielle, il offrait une expérience de développement innovante avec compilation incrémentale, refactorisation aisée et intégration rapide
- Cela a eu un impact important sur l’efficacité de développement et le travail sur les grands systèmes
Ce que cela implique aujourd’hui
- La compilation accélérée par le matériel est moins importante aujourd’hui, mais le problème du formatage reste encore insuffisamment résolu
- Même si l’approche dominante n’est ni l’édition projectionnelle ni les environnements live, il est peut-être temps de réfléchir, comme autrefois, à l’adoption de pratiques de développement plus efficaces et moins sujettes aux débats
Références
- En étudiant ce sujet, l’auteur cite divers documents et rapports techniques sur le R1000
4 commentaires
À ma connaissance, il existe déjà une fonctionnalité qui formate automatiquement le code partagé à l’aide d’une configuration unifiée, et il me semble que les entreprises l’utilisent beaucoup.
Il me semble que le sujet n’est pas le formatage automatique, mais plutôt l’idée qu’un formatage donné serait supérieur, ou même le fait de devoir abandonner son propre formatage pour s’adapter à un formatage étranger, ce qui en soi serait inutile. La logique est qu’il suffirait de stocker une représentation intermédiaire indépendante du formatage, puis de faire un pretty-printing selon les préférences de chaque utilisateur, dans la forme qui lui convient.
Je voulais dire qu’avec le formatage automatique, on peut accomplir exactement la même chose avec les langages existants, même sans expressions intermédiaires, mais mon explication n’était pas assez claire.
Avis Hacker News
include: si on ne trie pas, on ajoute toujours à la fin et cela provoque beaucoup de conflits de fusion. Comme avec les autoformatteurs, le tri devrait aussi faire gagner du temps. Et je suis sensible aux styles incohérents : le plus important est d’uniformiser sur un seul style.register, tout en gardant la convention qui note les pointeurs avec un astérisque (*). Pourtant, chaque notation pourrait être plus intuitive et plus claire, mais on s’obstine à conserver des façons complexes et difficiles à lire. On pourrait aussi remplacer des symboles ou mots-clés réservés par des termes plus familiers et naturels, mais on est trop attachés aux conventions traditionnelles ou existantes, au prix de la lisibilité. L’auteur explique par exemple que la fonctionstrcpyen C pourrait être entièrement repensée avec des termes et une syntaxe plus clairs et plus faciles à lire.char *argv[]. Il estime aussi que le style de formatting à la C++ (par exemplechar* a, b) peut induire en erreur, et qu’il vaut mieux l’éviter.=, ou insérer des tabulations pour faire davantage ressortir la profondeur de la structure. Selon qu’on veuille mettre en valeur les valeurs elles-mêmes, on peut aligner les nombres à droite, ou bien aligner les champs membres pour faire ressortir la structure. L’auteur soutient que sans métadonnées supplémentaires, ces informations ne sont pas extractibles depuis l’AST.setValue([bar, glob], 1)ou une syntaxe de commentaires pour surcharger le style, parmi d’autres solutions possibles.git diffvia une projection IR (représentation intermédiaire). L’apparition d’outils AST comme treesitter permet d’imaginer des interfaces où les humains manipuleraient plus efficacement les AST ou les IR. Par exemple, la structure de compilation ordonnée de F# aide à simplifier les revues de code. À l’inverse, dans les langages ou structures qui autorisent un ordre libre, il faut souvent naviguer entre plusieurs endroits pour comprendre le contexte global d’un petit diff, ce qui est fastidieux.eslint-config-airbnb, en citant des problèmes représentatifs : #1271, #1122. Il explique avoir perdu plus d’une heure à galérer pour appliquer la configuration airbnb à un projet existant, alors que le code était déjà parfait à l’origine. À cause de règles inutiles, cela lui a semblé contre-productif. Il a fini par désactiver localement ces règles, et ne l’a plus jamais réutilisé sur les projets suivants. Cet exemple montre à quel point de mauvaises règles de lint peuvent ruiner la productivité.