Les méthodes formelles et l’avenir de la programmation
(blog.janestreet.com)- Les méthodes formelles sont des outils qui permettent de prouver qu’un logiciel satisfait les propriétés attendues, et la diffusion du codage par agents modifie l’évaluation coûts-bénéfices
- Jane Street estimait autrefois que, hors de quelques cas particuliers, les méthodes formelles offraient une valeur trop faible au regard de leur coût, mais met désormais en place une équipe dédiée
- seL4 a nécessité 25 années-personnes pour vérifier 8 700 lignes de code C, avec environ 23 lignes de preuve et une demi-journée-personne de vérification par ligne de code
- Le code généré par les agents reste éloigné de la qualité requise pour une mise en production, et les méthodes formelles deviennent importantes comme moyen de réduire le goulet d’étranglement de la vérification et de fournir un feedback fort aux agents
- Jane Street estime que, grâce à son contrôle profond sur le langage et à l’existence d’une communauté de programmeurs déjà prête, il y a de la place pour faire progresser OxCaml et les approches orientées preuve ensemble
Les méthodes formelles et l’avenir de la programmation
- Jane Street affirme depuis 25 ans qu’au niveau de l’organisation, l’entreprise ne s’intéresse pas aux méthodes formelles, mais cette position n’est désormais plus la sienne
- L’entreprise accorde depuis longtemps de l’importance à la puissance des outils permettant d’écrire un meilleur code et un code plus fiable, et considère les systèmes de types comme une forme légère de méthode formelle qui a apporté de grands bénéfices
- En dehors de cas particuliers, notamment la synthèse matérielle, elle jugeait que le coût des méthodes formelles était trop élevé pour convenir à la plupart des logiciels
- seL4 est un micronoyau vérifié formellement et une réalisation majeure, mais la vérification de 8 700 lignes de code C a demandé 25 années-personnes
- Environ 23 lignes de preuve étaient nécessaires pour chaque ligne de code, et la vérification d’une ligne demandait environ une demi-journée-personne
- Pour des cas à fort enjeu et à spécification relativement claire, comme un micronoyau critique pour la sécurité, cette approche peut avoir de la valeur
- Elle ne semblait pas adaptée à la plupart des logiciels, ni même aux logiciels les plus importants de Jane Street
- L’arrivée du codage par agents a changé ce jugement, et le scepticisme vis-à-vis du potentiel des méthodes formelles s’est transformé en attente positive
- Jane Street est en train de créer une équipe méthodes formelles et espère en faire un outil de construction logicielle aussi largement utile que les systèmes de types sophistiqués
Pourquoi ce changement d’avis
- Le codage par agents bouscule de plusieurs façons le rapport coûts-bénéfices historique des méthodes formelles
- Cela ne signifie pas que les agents peuvent, à eux seuls et de façon arbitraire, construire des preuves difficiles, mais les modèles apportent une aide importante et permettent à davantage de personnes d’utiliser les outils de manière productive
- Comme l’usage des méthodes formelles devient plus simple qu’auparavant, il vaut la peine de réexaminer le calcul coût/efficacité du passé
-
Le goulet d’étranglement de la vérification devient plus important
- Les modèles écrivent de mieux en mieux du code utile, mais il existe encore un écart important entre le code généré par les modèles et le code réellement publiable
- Les modèles sont étonnamment performants pour atteindre un objectif donné, mais pas assez solides pour maintenir ou améliorer la qualité d’une base de code au passage
- Le code produit par les agents s’améliore, mais il tend à être excessivement complexe, plein de bugs étranges et de cas limites, et à ne pas respecter les invariants essentiels de la base de code
- Les humains doivent consacrer beaucoup de temps à vérifier si le code produit par les agents est d’une qualité suffisante
- Les méthodes formelles peuvent réduire cette charge de vérification et rendre le processus de revue plus efficace
-
Les agents deviennent meilleurs grâce au feedback
- Les agents tirent parti du feedback, à la fois lors de l’entraînement par apprentissage par renforcement et lors de leur utilisation pour coder
- Les méthodes formelles constituent une forme de feedback puissante capable d’améliorer la faculté des agents à résoudre des problèmes difficiles
- Les tests restent très précieux, et ils peuvent encore être améliorés à l’aide du test basé sur les propriétés et du fuzzing
- Les tests seuls ne suffisent pas, et il existe des limites intrinsèques à leur capacité à couvrir l’espace des états qu’un programme peut explorer
- Dans l’expérience de programmation avec OxCaml, les agents tirent un grand bénéfice des garanties universelles fournies par le système de types
- Si le système de types peut empêcher les data races, alors il peut éliminer les data races
- Si des types bien conçus rendent impossibles les vulnérabilités de type cross-site scripting, elles peuvent être éliminées d’une manière difficile à obtenir avec de simples tests
- Les types atténuent le goulet d’étranglement de la vérification et fournissent un meilleur feedback lorsqu’on programme avec des agents
- L’usage de techniques de preuve plus puissantes pourrait permettre des progrès supplémentaires
Pourquoi ici
- Le monde entier réfléchit à ce que les agents signifient pour l’avenir de la programmation, et de nombreuses startups cherchent aussi à combiner méthodes formelles et agents
- Jane Street peut contrôler en profondeur le langage qu’elle utilise, ce qui lui permet de l’ajuster pour le rendre plus adapté aux approches orientées preuve
- Plusieurs directions sont possibles
- Il est possible d’intégrer au système de types des spécifications modulaires de propriétés
- On peut ajouter au niveau des types des contraintes sur des éléments comme la propriété et la mutabilité afin de faciliter certaines preuves
- On peut intégrer directement des techniques de preuve dans le langage
-
Une communauté de programmeurs prête
- Jane Street dispose d’une communauté de programmeurs prête à adopter ce type de techniques
- Pour ceux qui travaillent sur les langages de programmation, il est souvent plus difficile de faire adopter dans le travail réel de meilleures idées de programmation que d’inventer ces idées
- Chez Jane Street, il est fréquent que des utilisateurs se plaignent que de nouvelles fonctionnalités de système de types, prometteuses mais inhabituelles, n’arrivent pas assez vite
- De nombreuses personnes y ont déjà le bagage nécessaire pour tirer parti de ces techniques, et l’attention portée à la production de résultats corrects et de logiciels de haute qualité y est déjà bien ancrée
- Une base d’utilisateurs active et très demandeuse donne la liberté de tenter à la fois des améliorations de court terme et une vision de long terme
- Les améliorations de court terme peuvent avoir un impact relativement rapide
- La vision de long terme correspond à des objectifs plus ambitieux pouvant être atteints sur plusieurs années
- Les enseignements tirés des essais à court terme peuvent servir à construire vers les objectifs de long terme
-
Relation avec les outils externes
- Jane Street n’ignore pas le travail effectué à l’extérieur et puise attentes et inspiration dans le travail de plusieurs communautés de langages de programmation
- Parmi les outils concernés figurent Lean, Dafny, Rocq, Agda, Iris
- L’entreprise cherche des moyens d’intégrer OxCaml à certains de ces outils afin de tirer parti d’une excellente infrastructure déjà existante
- Elle estime aussi qu’il existe des avantages propres que l’on ne peut obtenir qu’en traitant simultanément le langage et les techniques de preuve
Rejoindre l’équipe
- Jane Street recrute sur les méthodes formelles à London et New York
- Les entretiens pour ces postes et la constitution de l’équipe n’en sont encore qu’à leurs débuts
- Il reste énormément de travail à faire, et l’entreprise cherche des personnes pour rejoindre l’équipe
Complément
- Les modèles ont encore besoin d’aide et de guidage humains lorsqu’ils traitent des preuves complexes
- Les programmeurs humains peuvent avoir des idées sur la raison pour laquelle un système fonctionne et sur la manière de le prouver à un niveau élevé
- La plupart des programmeurs ne savent pas comment encoder une idée de preuve d’une façon qui satisfasse un système de preuve donné
- Les modèles peuvent automatiser une grande partie du travail répétitif dans les détails techniques de la rédaction des preuves et apporter l’expertise nécessaire
- Des échappatoires comme
Obj.magicpeuvent permettre de contourner des contraintes au niveau des types - En suivant et en interdisant ces exceptions dans la majorité du code, on peut se rapprocher très fortement de garanties universelles
- Les méthodes formelles peuvent rendre explicites les raisons pour lesquelles l’usage de telles échappatoires est effectivement sûr
1 commentaires
Commentaires sur Hacker News
Il y a plusieurs décennies, j’ai travaillé sur la preuve de correction, et à l’époque le système automatisait davantage les preuves que beaucoup de systèmes apparus ensuite
Les parties faciles étaient prises en charge par le simplificateur Oppen-Nelson, le tout premier solveur SAT, et les parties difficiles par le démonstrateur Boyer-Moore, qui utilisait des heuristiques et des lemmes antérieurs. La partie difficile pour l’humain consistait à suggérer au démonstrateur des lemmes qu’il pourrait tenter puis réutiliser dans les preuves suivantes
Les systèmes apparus ensuite semblaient moins automatisés, et à mon avis les méthodes formelles se sont égarées parce qu’elles sont devenues trop formalistes par rapport aux besoins réels. Du point de vue de quelqu’un qui voulait du code sans bug pour des projets commerciaux, j’avais l’impression que les projets académiques subissaient un biais de mathématiciens, privilégiant des notations concises pour les articles et des analyses avec peu de cas
En pratique, il faut beaucoup de travail automatisé et peu d’intuition. Des gens brillants ont continué à inventer de nouvelles logiques, comme la logique modale ou la logique temporelle, pour éviter la verbosité des preuves sur papier, mais cela n’a pas beaucoup aidé. La vérité fondamentale de ce domaine, c’est que la plupart des théorèmes sont assez ordinaires
Comme le disent les gens de Jane Street, le fait de pouvoir contrôler le langage est un énorme avantage. Les assertions de vérification doivent être intégrées au langage de programmation ; si elles sont enfouies dans des commentaires, une autre syntaxe ou des fichiers séparés, cela ajoute du travail inutile. J’aime bien voir Jane Street pousser dans cette direction
J’ai travaillé là-dessus bien trop tôt, il y a plus de 40 ans ; à l’époque, reconstruire l’arithmétique depuis zéro avec le démonstrateur Boyer-Moore prenait environ 45 minutes de calcul, alors qu’aujourd’hui cela prend moins d’une seconde
https://archive.org/details/manualzilla-id-5928072/page/n3/m...
La logique occupe en informatique et en génie logiciel une place comparable à celle du calcul différentiel en physique, en mécanique ou en génie civil. Des choses comme LTL ou, plus récemment, la logique de séparation ont été d’énormes percées
La popularité assez large de TLA+ en est la preuve, et le model checking est très pratique. Ce qui est intéressant aujourd’hui, c’est que des méthodes formelles plus lourdes, en particulier la démonstration de théorèmes, pourraient devenir assez abordables pour être utilisées même dans les logiciels systèmes généralistes
Écrire une spécification formelle pour une fonction, puis la synthétiser et en prouver la correction à l’aide d’un hybride SAT/SMT, démonstrateur de théorèmes et LLM pourrait bientôt devenir la norme
On the Unusual Effectiveness of Logic in Computer Science: https://www.cs.rice.edu/~vardi/papers/aaas99.jsl.pdf
From Philosophical to Industrial Logics: https://www.cs.rice.edu/~vardi/papers/icla09.pdf
Ce qui m’inquiète, c’est l’apparition de mathématiques difficiles à déchiffrer, protégées par de petits groupes d’initiés. Différentes notations ésotériques ne seront pas compatibles entre elles, et en comprendre une n’aidera pas forcément beaucoup à en comprendre une autre. La plupart des gens finiront par n’écrire que des phrases en anglais impossibles à vérifier correctement
Pire encore, on pourrait demander aux machines de formaliser leurs propres phrases, puis participer à un théâtre de la vérification sans comprendre ni le formalisme ni les preuves, avant de faire semblant d’être surpris quand tout explose
On progresse lentement vers l’intégration de ce type de capacités pour les parties que le système de types ne traite pas rapidement, donc le point de vue de gens qui ont déjà emprunté cette voie m’intéresse
Très bien. Ces derniers mois, j’ai migré en Scala 3 vers des types expressifs, afin que les types embarquent de plus en plus de preuves à la compilation. Je n’utilise pas de macros, même si quelques-unes peuvent être utiles
Cette approche ne semble pas seulement aider à réduire le problème de la prolifération des tests agentiques, elle semble aussi empêcher les agents de retomber dans des méthodes de travail de faible qualité. En particulier, elle évite cette accumulation de substantifs où l’agent crée un nouveau type mono-cas pour tout, même lorsqu’il devrait raisonnablement généraliser
Je pense que ce qui accélérera le codage agentique de bonne qualité, ce sont des outils qui ressemblent aux méthodes formelles, y compris des langages dotés de systèmes de types puissants
Par types expressifs, j’entends des techniques qu’on ne voudrait pas forcément introduire dans une base de code classique si l’équipe n’est pas déjà à l’aise avec la programmation au niveau des types. Autrement dit, il faut une équipe pour qui les types de genre supérieur et les fonctions de type ne sont pas des étrangetés, mais des briques de base
Les agents sont généralement meilleurs en « mathématiques » que la plupart des développeurs sur le plan des connaissances, et souvent meilleurs même que des développeurs imbibés de théorie des catégories. En plus, si l’on considère qu’ils ont une patience « infinie » en conversation, ils enseignent plutôt bien
Personnellement, j’ai demandé à Codex de convertir quelques petites preuves de loisir dans le style Lean, et cela a été très facile. Je ne dirais pas que c’est exact à 100 %, et pour vérifier plus sérieusement il faudrait que j’apprenne davantage Lean 4, mais il semble au moins repérer les pièges classiques des preuves. L’avenir des méthodes formelles me rend très enthousiaste
Il semble que l’idée soit de déplacer la valeur humaine vers la vérification, puisque la Gen AI produit énormément de code. Je me demande parfois ce qu’est vraiment la programmation.
Quand l’anglais n’est pas sa langue maternelle, apprendre la programmation est déjà en soi un grand défi. Pour comprendre la documentation anglaise non traduite, il faut s’appuyer sur la traduction automatique, et les ressources disponibles dans ma langue ont 5 à 6 ans de retard.
Maintenant qu’il est impossible de relire des dizaines de milliers de lignes de code générées par l’IA, on voit apparaître des discussions sur l’établissement de règles absolues, comme des preuves mathématiques. En lisant cet article, j’ai pensé au borrow checker de Rust. En pratique, après avoir utilisé Rust quelques fois, on voit souvent les gens prendre de mauvaises habitudes en cherchant des astuces pour contourner le borrow checker.
Quand la rigueur mathématique devient excessive, les gens finissent par chercher des voies de contournement. Les programmeurs peu formés comme moi y sont particulièrement enclins.
J’ai l’impression que ce type d’approche finira par produire du code écrit uniquement pour des réponses formalisées très spécifiques. Une fois standardisé de cette façon, je ne suis pas sûr qu’il puisse encore répondre aux besoins humains.
Ces tentatives de programmation défensive sont très bien, mais, pour reprendre ma propre expression, j’ai envie de faire de la programmation offensive. C’est une manière de travailler qui accepte le risque, mais corrige et déploie vite, avec l’idée qu’au fil du temps le résultat deviendra suffisamment bon.
Bien sûr, dans des secteurs établis comme Jane Street, où la précision est cruciale et le périmètre de travail bien défini, l’approche de cet article est adaptée. Ils disposent de suffisamment de données pour modéliser correctement les besoins du marché.
Mais pour un perdant social comme moi, qui continue à se déplacer pour trouver sa mine d’or et gagner de l’argent, ce genre de méthodologie ressemble à un luxe. Les activités existantes, avec une modélisation mature, doivent être continuellement optimisées par des spécialistes très qualifiés, et je sais qu’en pratique il est impossible de suivre cette demande. C’est pourquoi je cherche des endroits où la modélisation n’est pas structurée, mais je ne sais pas si cette approche pourrait y fonctionner aussi.
Là-bas, il n’y a pas de « on corrigera plus tard ». Quand on aura compris ce qui s’est mal passé, on aura peut-être déjà perdu des milliards.
Donc l’approche offensive peut fonctionner dans des domaines non essentiels.
D’ailleurs, on utilise déjà un peu partout des approches défensives. Python, Java et d’autres ont des garbage collectors, et en ce sens on vérifie bien que le code s’exécute comme prévu.
Je me demandais quand la vérification formelle commencerait à apparaître, mais passer du stade où l’on se soucie des détails d’implémentation à celui où l’on décrit scientifiquement et mathématiquement le problème est quelque chose de naturel.
Avec la Gen AI, le coût de la programmation défensive a beaucoup baissé, tandis que le coût de la vérification humaine a fortement augmenté. À l’inverse, les méthodes formelles rendent la vérification moins coûteuse, mais introduisent un gros surcoût d’implémentation : il faut écrire des spécifications, des types, des preuves, et tordre l’implémentation pour la faire entrer dans un cadre rigide.
Or la Gen AI peut automatiser ce travail pénible. Les deux sont faits l’un pour l’autre.
Cela demande un peu d’effort, mais éliminer ce surcoût de traduction permanent vous aidera énormément.
En revanche, je ne vois pas bien le lien entre ce point et le fait de se qualifier soi-même de « perdant social », ou de dire que l’on ne suit pas ce genre de pratiques dans sa carrière.
Je m’amuse récemment avec des idées connexes, et ce qui m’a surpris, c’est à quel point les modèles de pointe, en particulier ChatGPT-5.5, parviennent bien à compléter certaines preuves manuelles dans Roqc, l’ancien assistant de preuve Coq.
Les preuves ne sont pas toujours élégantes, mais ChatGPT parvient souvent, en quelques minutes et en 10 à 100 itérations, à produire des démonstrations qui me prendraient bien plus longtemps, alors même que j’ai une expérience certes limitée mais réelle avec les assistants de preuve, ainsi qu’une expérience de domaine assez importante sur le type de lemmes à démontrer.
Ce qui rend cela intéressant dans le contexte de ce court article, c’est que cela remet en cause les hypothèses de base du fonctionnement de certains outils de méthodes formelles. Frama-C, Ada/SPARK et d’autres se concentrent sur la génération d’obligations de preuve que des outils comme CVC5 ou Z3 peuvent résoudre automatiquement ; en cas d’échec, on bascule vers l’alternative assez pénible de la preuve manuelle dans Roqc.
Le flux habituel consiste à découvrir qu’une obligation est « difficile », c’est-à-dire qu’elle n’est pas résolue automatiquement, puis à reconfigurer l’ensemble des lemmes auxiliaires et des assertions visibles au point du code où cette obligation est générée, afin de la rendre « facile », voire à modifier le code lui-même.
Cela a du sens dans un monde où une preuve Roqc coûte deux fois plus cher : elle est difficile à écrire pour un humain, et son coût de maintenance varie fortement quand le code et les preuves périphériques changent.
Mais si une preuve Roqc devient une « résolution automatique avec l’IA dans la boucle », alors cet écart de coût disparaît. On peut alors écrire des preuves comme on écrit du code, en mettant la clarté lisible par les humains en priorité absolue, et en reléguant très loin derrière l’optimisation pour le compilateur ou le démonstrateur. Je n’ai pas encore complètement assimilé toutes les implications, mais je trouve cela assez fascinant.
Je n’ai jamais travaillé sur les preuves, mais il m’est déjà arrivé de voir une IA modifier les tests eux-mêmes, au lieu de corriger le code pour qu’il fasse bien ce que je voulais — à savoir faire passer à la fois les anciens tests et les nouveaux — quand je lui disais : « après la modification, ce test échoue ».
J’ai hâte de voir la suite.
Chaque fois que je lis sur les spécifications formelles, j’ai l’impression que c’est « écrire les mêmes tests d’une autre manière », voire pire, « écrire la même implémentation d’une autre manière »
Le fait de l’écrire deux fois peut sans doute aider à repérer des erreurs, mais si une spécification formelle peut avoir les mêmes bugs qu’un test ou qu’une implémentation, je ne vois pas bien ce qu’elle a de spécial
Le problème de fond, c’est que pour prouver formellement qu’un programme fait quelque chose, il faut définir ce « quelque chose » de manière très précise. Au final, cela revient de fait à réécrire le test ou l’implémentation
Cela fait des années que je regarde ce sujet par intermittence, avec la sensation persistante de rater quelque chose, sans savoir quoi. Quelqu’un pourrait-il m’expliquer ?
Le défaut des tests, c’est qu’on ne peut tester que les comportements que l’on soupçonne de poser problème. Pour corriger de manière préventive des comportements dont on ignorait même qu’ils pouvaient mal tourner, il faut des outils plus atypiques dans la boîte à outils. Le fuzz testing est un début dans cette direction, et la vérification formelle en est un autre
Bien sûr, la qualité de ces outils dépend de la qualité du modèle formel exhaustif que l’on écrit, capable d’autoriser les comportements voulus et d’interdire ceux qu’on ne veut pas, et dans de nombreux domaines nous sommes encore étonnamment loin du compte
Par exemple, avec un test unitaire, on peut écrire « foo('abc') renvoie une chaîne sans espace de fin »
Mais avec des méthodes formelles, on peut prouver que « pour toute entrée x, foo(x) renvoie une chaîne sans espace de fin »
C’est un exemple trivial, mais on peut imaginer quelque chose de plus complexe comme « pour tout programme P, compile(P) se comporte comme P »
Bien sûr, il faut définir ce que signifie « se comporte comme »
On spécifie des propriétés de la conception, puis l’outil teste celle-ci de diverses façons pour vérifier si ces propriétés peuvent être violées
Par exemple, pour un système qui contrôle des feux de circulation, on peut spécifier la propriété selon laquelle deux voies qui se croisent ne peuvent pas être au vert en même temps, ni dans un certain intervalle de temps
L’outil vérifie cela par exploration exhaustive et peut montrer la trace de code qui viole la propriété
Un système de types prouvé statiquement permet de vérifier à l’avance que chaque composant s’accorde avec tous les autres. Il ne s’agit pas seulement de dire « ce test passe », mais de garantir qu’une fois combinés, « tous ces tests forment un ensemble raisonnable et cohérent », et d’empêcher qu’un modèle incohérent soit implémenté dans le code
C’est un peu comme prendre l’exigence de Rust selon laquelle
matchdoit couvrir exhaustivement toutes les branches possibles et l’étendre à l’échelle de toute la base de codeIl est vrai que cela ne vous protégera pas d’une erreur logique ou théorique fondamentale. Mais on peut être surpris de voir à quel point c’est plus robuste, par exemple, que la combinaison du système de types de Haskell, de tests fonctionnels ad hoc et de tests de propriétés. Cet ensemble constitue déjà globalement un cadre solide, mais la cryptographie formellement prouvée vise un niveau bien plus élevé
C’est particulièrement précieux dans les situations de concurrence, de systèmes distribués et de multithreading. Les race conditions et les interblocages sont très difficiles à tester et à raisonner, tout comme les questions du type « A, B et C peuvent-ils se produire dans l’ordre A, C, B ? »
La maturation de ce domaine suivra probablement à peu près cette trajectoire. D’abord, les LLM accéléreront fortement l’apprentissage et l’usage des méthodes formelles, même s’ils se limitent au départ à une sorte de vérification a posteriori, un « deuxième essai »
Ensuite, on passera à une automatisation où le LLM vérifiera « le code d’implémentation a changé, mais cela semble-t-il casser le modèle ? ». Cela restera non déterministe, mais ce sera probablement bien mieux que de demander à un humain de revoir quelque chose qui ne change qu’occasionnellement
Enfin, le vrai saut consistera à faire passer au niveau supérieur les outils du type « n’écrivez que la spécification formelle et générez l’implémentation ». Il existe déjà plusieurs projets de génération de code de ce genre, mais la plupart ne sont pas encore totalement mûrs au niveau qu’attendent les entreprises. Et si des outils LLM pouvaient accélérer les 1 à 2 années de travail manuel nécessaires pour adapter l’un d’eux à un besoin précis ?
L’article précédent de Kleppmann https://martin.kleppmann.com/2025/12/08/ai-formal-verificati... mérite aussi le détour, et il faut évidemment se demander si ce qu’on peut mettre dans un système de types ou dans un linter ne devrait pas simplement y être mis
J’espère qu’il émergera des approches plus simples à utiliser. Parmi les outils cités dans l’article, dafny et iris semblent les plus proches d’un usage industriel. Je crois savoir qu’Amazon S3 a aussi un historique d’usage interne de TLA
Mais je n’ai pas encore vu dans ce domaine l’équivalent d’un TypeScript : quelque chose qui s’intègre naturellement aux outils existants, fonctionne comme une abstraction sans coût et que les gens préfèrent sincèrement à l’ancienne manière de faire
Même utiliser des linters personnalisés reste assez pénible. golangci-lint est une base de code douloureuse, et je n’ai pas essayé semgrep, mais son moteur de règles m’a paru intimidant. Je n’ai pas encore non plus utilisé d’API AST qui me plaise vraiment
Cet éloge du raisonnement déductif, autrement dit des « méthodes formelles », passe toujours à côté de sa limite fondamentale : dans quelle mesure les axiomes et les définitions correspondent-ils réellement au domaine visé
C’est le même problème que dans la formule « En théorie, il n’y a pas de différence entre la théorie et la pratique. En pratique… ». J’imagine que Jane Street continuera à maintenir une grande base de code où l’objectif du code est de mettre en œuvre des algorithmes déterministes, donc avec une correspondance 1:1. Beaucoup de développeurs travaillent dans ce type de domaine, mais des millions n’y sont pas. C’est le cas de la plupart des UI, de la plupart des travaux exploratoires, etc.
Parallèlement aux méthodes formelles, il existe aussi un courant qui cherche à définir les critères d’acceptation avec une très haute résolution, sans passer par une approche logique ou mathématique. Ce courant affronte au moins le problème de la correspondance, mais il ne le résout pas dans la plupart des cas où la carte n’est pas le territoire.
La page de résultats de recherche Google dispose d’un framework interne d’optimisation extrêmement évolué, mais a-t-elle vraiment atteint l’optimum ? Un prototype bricolé à la hâte pour capturer une idée floue aurait-il pu mieux montrer la voie ? À ce type de questions, on répond le mieux en regardant non pas l’intérieur du système, mais l’extérieur qu’il sert
Les circuits logiques, les composants CPU fortement soumis à la vérification formelle, les kernels, les protocoles, les parseurs, les compilateurs, la cryptographie, les frameworks de sécurité, les primitives de concurrence, etc., tirent de grands bénéfices de la vérification
Pour aller plus loin, le texte de Hillel Wayne est un bon point de départ : https://www.hillelwayne.com/formally-specifying-uis/
Et dans certains cas, on peut apprendre même si le résultat n’est pas bien défini, donc ce n’est pas seulement une question de s’asseoir pour réfléchir à ce qui pourrait avoir du sens
En tant que personne un peu intéressée par la conception et l’implémentation des langages de programmation, cette phrase m’a vraiment marqué. « Pour la plupart des gens qui travaillent sur les langages de programmation, la partie facile consiste à imaginer des idées nouvelles et meilleures pour améliorer la programmation. La partie difficile consiste à convaincre quelqu’un d’utiliser réellement ces idées dans son travail »
Je suis totalement d’accord. Même quand il y a un bénéfice, il existe une limite à la quantité d’étrangeté qu’on peut introduire dans un nouveau langage
Mais les agents IA ne ressentiront probablement pas une forte résistance face à des idées radicalement nouvelles en conception de langages. Je réfléchis depuis quelque temps à la manière dont la conception des langages de programmation pourrait évoluer après l’arrivée de l’IA agentique
Quand on a beaucoup moins à se soucier de l’adoption, il sera très intéressant de voir quelles nouvelles idées on pourra inventer pour améliorer les langages de programmation
https://steveklabnik.com/writing/the-language-strangeness-bu...
Je travaille sur l’application des méthodes formelles aux tests de sécurité applicative, et je pense que la même approche peut aussi s’appliquer à la vérification de la logique métier
Pour cela, nous utilisons la taint analysis. C’est une approche de méthodes formelles assez bien établie, mais elle n’a pas encore été largement adoptée sur le terrain à cause de la complexité des flux de données dans les vraies bases de code
Étendre les méthodes formelles au-delà du pattern matching sur l’AST et des simples vérifications de types est un travail vraiment difficile. Il a fallu des années de R&D pour atteindre un niveau où la taint analysis peut suivre en quelques minutes les flux de données interprocéduraux dans de vraies bases de code et trouver des vulnérabilités profondément enfouies
Si cela vous intéresse, vous pouvez voir le projet : https://github.com/seqra/opentaint
Il y a environ 18 mois, je suis devenu accro à l’usage des types avec les LLM, et je me suis mis sérieusement à
lean4il y a environ 6 à 8 mois. Désormais, je n’envisage même plus d’utiliser une assistance IA pour le développement logiciel sans un socle de preuvesCICavec une FFI C/C++ pratique, donc relié de fait à à peu près toutNous avons interdit tout ce qui va de JSON à Python, et nous avons même réécrit
nixpour qu’il dispose d’un compilateur. Presque tout ce que nous utilisons subit non seulement des tests par propriétés et plusieurs fuzz tests poussés à la limite, mais possède aussi au minimum une preuvelean4pilotant les tests par propriétés via un lien.olean. Quand nous avons le temps, nous prouvons même l’exhaustivité de tout le domaine et testons aussi cette propriétéTout ce qui est rapide est généré depuis
lean4, ce qui permet de passer à côté des débats C++/Rust. Il y a un avantage quand un bug C++ est en réalité un bug dans le codelean4, mais cela peut aller dans les deux sensC’est un changement majeur, et je ne blâme pas ceux qui restent sceptiques en entendant « vous interdisez JSON et Python ? ». Mais nous avons inspecté des millions de lignes de cette manière, et IA + système formel représente un saut bien plus grand que de passer de l’absence d’IA à l’IA avec Python. D’après notre expérience, la seconde approche ne progresse pas de manière monotone, alors que la première progresse presque toujours de façon monotone
On peut faire des choses assez audacieuses. Voici une preuve formelle de calculs tensoriels polyédriques du type de ceux que modélisent ISL et CuTe, et cela permet de faire du swizzling et du tiling sur l’appareil avec
mdspande C++23 tout en prouvant que c’est correct. En revanche, cet exemple n’illustre pas très bien un argument à la L'Hôpital sur la couverture : https://github.com/b7r6/mdspan-cuteLe résultat est vraiment rapide, et il l’est dès le premier essai
https://straylight.software/assets/lambda-hierarchy.svg