6.3. Stratégies de vérification et de test
Cet ordre est présenté comme nécessaire, et il ne l'est pas également partout. Que la modalité précède l'inférence des types concrets tient à un argument précis (chapitre 3, §3.1) qui ne vaut que pour une unification à la Damas-Milner, d'autres architectures s'en dispensant. Que la vérification de pureté précède la preuve de terminaison l'est moins : un argument structurel de décroissance sur une algèbre initiale ne dépend pas, en rigueur, de l'absence d'effets. L'ordre retenu simplifie l'implémentation et regroupe les vérifications par nature ; à cet endroit précis, c'est un choix d'ingénierie présenté comme une contrainte logique.
La vérification décrite au §6.1 a pour conséquence de vider de leur sens la plupart des catégories usuelles de test, en les faisant coïncider avec des mécanismes déjà établis plutôt qu'avec des pratiques séparées. Un test unitaire, dans cette lecture, est couvert pour partie par un type de raffinement vérifié par le solveur SMT de la Phase 5. Un test d'intégration l'est par la vérification du DAG topologique du chapitre 4 (§4.5). Un test de résilience l'est par l'arbre de supervision lui-même, dont la politique de redémarrage (chapitre 4, §4.5) encaisse la panne plutôt que de la simuler. Une part de ce que le développeur écrirait ailleurs comme suite de tests est donc vérifiée une fois pour toutes à la compilation. Le mot couvre est ici plus juste que le mot est, et la nuance n'est pas de prudence. Un test d'intégration éprouve des propriétés que la structure statique n'exprime pas ; un arbre de supervision est une structure de contrôle et non la propriété de résilience elle-même. Le test de propriétés reste donc nécessaire là où l'obligation n'a pas de forme statique, et l'oracle de référence demeure une hypothèse de confiance. Écrire l'équivalence plutôt que le recouvrement ferait passer pour démontré ce qui n'est qu'espéré.
Les doctests occupent, dans ce paysage, une position particulière : le compilateur les exécute comme
des tests unitaires ordinaires pendant la Phase 1, avant toute génération de code, ce qui en fait la
seule forme de test dont l'échec bloque la compilation elle-même plutôt qu'une exécution ultérieure.
En mode +strict-tdd, un symbole public sans doctest associé est lui-même rejeté — la documentation
devient une obligation de preuve comme une autre, vérifiée avec le même sérieux que le jugement
lui-même.
Un résidu dynamique subsiste néanmoins, et ce chapitre ne prétend pas l'éliminer : la falsification
des indices SMT par test de propriétés (§6.1, Phase 5),
activée en mode +verify, reste un test au sens classique du terme — une exécution qui pourrait
échouer, plutôt qu'une preuve qui ne le peut pas. Le chemin nominal de K7PL est statique de bout en
bout ; ce résidu en est la seule exception assumée, et il ne porte que sur les indices qu'un
développeur a lui-même fournis, jamais sur le cœur du système de types.
Une seconde exception, d'un autre ordre, tient à l'oracle lui-même : l'interpréteur de référence est supposé sémantiquement correct par construction, sans qu'aucune preuve ne relie son comportement à la sémantique catégorique des chapitres 1 et 2. C'est une hypothèse de confiance, non un théorème.
Elle n'est pas hors d'atteinte pour autant. Trois techniques attestées s'y appliquent. Les prédicats logiques pour la logique linéaire intuitionniste, par lesquels s'établit la complétude pleine de la traduction de Girard [30]. La bisimilarité applicative, définie coinductivement pour les λ-calculs à état et adaptée à un interpréteur qui en manipule [31]. Et la traduction vers un métalangage en π-calcul, interprété une fois pour toutes, où correction et adéquation se raisonnent au niveau du métalangage [32].
Une quatrième voie se signale pour ce qu'elle prouve de faisabilité plutôt que pour être suivie : le même objet — un interpréteur de référence servant d'oracle à un testeur — a été construit et entièrement vérifié ailleurs, pour exactement cet usage [33]. L'hypothèse de confiance énoncée ci-dessus n'est donc pas une limite de principe : elle a un prix, et ce prix a été payé au moins une fois.
C'est la troisième voie que ce document retient, et le chapitre 4 (§4.6) la construit : le métalangage y est défini, la traduction donnée, et sa préservation du typage énoncée en théorème. La dette change alors de nature. Il ne s'agit plus de prouver l'interpréteur correct construction par construction, mais d'établir que la traduction préserve le typage — le métalangage étant interprété une fois pour toutes, correction et adéquation s'y raisonnent [34]. Cette dette-là reste ouverte, et elle est plus étroite : le théorème 45 l'énonce et n'en donne qu'une esquisse, et la fidélité elle-même demande en outre la simulation du théorème 46, qui l'accompagne.
Sa portée, en revanche, ne l'est plus. Le §4.6 étend le métalangage pour que les effets y aient une image, sous la forme de communications sur des canaux distingués. Un interpréteur prouvé fidèle l'est donc à la structure de communication, au contrôle et aux effets, dont le temps. Ce que ce choix déplace n'est pas la difficulté mais son lieu : la discipline qui garantit qu'aucun programme traduit n'accède aux canaux distingués reste à écrire, et elle conditionne la valeur de l'énoncé.
Reste le protocole du test différentiel, que ce chapitre invoque sans l'avoir écrit. Il compare, sur
un même programme, l'exécution du binaire optimisé et celle de l'interpréteur de référence. Le
corpus est composé de trois sources — les doctests, les cas d'étude du chapitre 7, et des
programmes engendrés par propriété à graine fixée et consignée —, et chaque cas porte son profil
de représentation \Pi. La comparaison se fait sur l'observation et la trace d'effets modulo la
congruence du métalangage : aucune tolérance sur le rejeu logique ; sur la représentation, l'égalité
bit à bit n'est exigée que sous le profil déclaré. Un écart est classé — erreur du compilateur,
erreur de l'oracle, ou ambiguïté de la spécification — et bissecté phase par phase du pipeline,
puis réduit au plus petit programme qui le reproduit, lequel rejoint le corpus de non-régression.
Le test est reproductible si chaque passe appliquée est déterministe et que la trace est respectée
au niveau du binaire testé : c'est le critère opérationnel de la compilation reproductible.
Tant que la fidélité de l'oracle n'est pas démontrée, un écart n'est pas une preuve contre le
compilateur, et son absence n'en est pas une pour lui.
- NOWACKI, Todd; BLACKSHEAR, Sam; MITCHELL, John; QADEER, Shaz; SERGEY, Ilya. Tracking Borrows with Regular Expressions. s. d., vol. 10, p. 1–27.
- GREGERSEN, Simon Oddershede; BAY, Johan; TIMANY, Amin; BIRKEDAL, Lars. Mechanized Logical Relations for Termination-Insensitive Noninterference. Proceedings of the ACM on Programming Languages [en ligne]. 2021, vol. 5, p. 1–29 [visité le 2025-05-07]. Disp. à l’adr. DOI: 10.1145/3434291
- ALGEHED, Maximilian; BERNARDY, Jean-Philippe. Simple Noninterference from Parametricity. Proceedings of the ACM on Programming Languages [en ligne]. 2019, vol. 3, no. ICFP, p. 1–22 [visité le 2025-06-05]. Disp. à l’adr. DOI: 10.1145/3341693
- BOWMAN, William J; AHMED, Amal. Noninterference for Free. In: Proceedings of the 20th ACM SIGPLAN International Conference on Functional Programming [en ligne]. Vancouver BC Canada: ACM, 2015, p. 101–113. Disp. à l’adr. DOI: 10.1145/2784731.2784733
- O’CONNOR, Liam; CHEN, Zilin; RIZKALLAH, Christine; JACKSON, Vincent; AMANI, Sidney; KLEIN, Gerwin; MURRAY, Toby; SEWELL, Thomas; KELLER, Gabriele. Cogent: Uniqueness Types and Certifying Compilation. Journal of Functional Programming [en ligne]. 2021, vol. 31, p. e25 [visité le 2025-05-19]. Disp. à l’adr. DOI: 10.1017/S095679682100023X
- KIRKHAM, Jake; SORENSEN, Tyler; TURECI, Esin; MARTONOSI, Margaret. Foundations of Empirical Memory Consistency Testing. Proceedings of the ACM on Programming Languages [en ligne]. 2020, vol. 4, p. 1–29 [visité le 2025-05-06]. Disp. à l’adr. DOI: 10.1145/3428294
- SARKAR, Dipanwita; WADDELL, Oscar; DYBVIG, R. Kent. EDUCATIONAL PEARL: A Nanopass Framework for Compiler Education. Journal of Functional Programming [en ligne]. 2005, vol. 15, no. 5, p. 653 [visité le 2025-05-15]. Disp. à l’adr. DOI: 10.1017/S0956796805005605
- PATTERSON, Daniel; AHMED, Amal. The next 700 Compiler Correctness Theorems (Functional Pearl). Proceedings of the ACM on Programming Languages [en ligne]. 2019, vol. 3, p. 1–29. Disp. à l’adr. DOI: 10.1145/3341689
- DE AMORIM, Arthur Azevedo; GABOARDI, Marco; GALLEGO ARIAS, Emilio Jesús; HSU, Justin. Really Natural Linear Indexed Type Checking. In: Proceedings of the 26nd 2014 International Symposium on Implementation and Application of Functional Languages [en ligne]. Boston MA USA: ACM, 2014, p. 1–12 [visité le 2026-08-02]. Disp. à l’adr. DOI: 10.1145/2746325.2746335
- ORCHARD, Dominic; LIEPELT, Vilem-Benjamin; EADES III, Harley. Quantitative Program Reasoning with Graded Modal Types. Proceedings of the ACM on Programming Languages [en ligne]. 2019, vol. 3, no. ICFP, p. 1–30 [visité le 2026-08-02]. Disp. à l’adr. DOI: 10.1145/3341714
- MOON, Benjamin; EADES III, Harley; ORCHARD, Dominic. Graded Modal Dependent Type Theory. Programming Languages and Systems [en ligne]. Cham: Springer International Publishing, 2021, vol. 12648, p. 462–490 [visité le 2026-08-02]. Disp. à l’adr. DOI: 10.1007/978-3-030-72019-3_17
- KNOTH, Tristan; WANG, Di; REYNOLDS, Adam; HOFFMANN, Jan; POLIKARPOVA, Nadia. Liquid Resource Types. Proceedings of the ACM on Programming Languages [en ligne]. 2020, vol. 4, no. ICFP, p. 1–29 [visité le 2025-04-30]. Disp. à l’adr. DOI: 10.1145/3408988
- CHU, Ethan; GUO, Yiyang; HOFFMANN, Jan. Handling Exceptions and Effects with Automatic Resource Analysis. Proceedings of the ACM on Programming Languages [en ligne]. ACM, 2026, vol. 10, no. 99, p. 1–30. Disp. à l’adr. DOI: 10.1145/3798207
- MACQUEEN, David; HARPER, Robert; REPPY, John. The History of Standard ML. Proceedings of the ACM on Programming Languages [en ligne]. 2020, vol. 4, p. 1–100 [visité le 2025-05-05]. Disp. à l’adr. DOI: 10.1145/3386336
- HUDAK, Paul; HUGHES, John; PEYTON JONES, Simon; WADLER, Philip. A History of Haskell: Being Lazy with Class. In: Proceedings of the Third ACM SIGPLAN Conference on History of Programming Languages [en ligne]. San Diego California: ACM, 2007 [visité le 2025-05-07]. Disp. à l’adr. DOI: 10.1145/1238844.1238856
- BERRY, Dave. Lessons from the Design of a Standard ML Library. Journal of Functional Programming [en ligne]. 1993, vol. 3, no. 4, p. 527–552 [visité le 2025-05-15]. Disp. à l’adr. DOI: 10.1017/S0956796800000873
- APPEL, Andrew W.; JIM, Trevor. Shrinking Lambda Expressions in Linear Time. Journal of Functional Programming [en ligne]. 1997, vol. 7, no. 5, p. 515–540 [visité le 2025-05-15]. Disp. à l’adr. DOI: 10.1017/S0956796897002839
- BRANDON, William; DRISCOLL, Benjamin; DAI, Frank; BERKOW, Wilson; MILANO, Mae. Better Defunctionalization through Lambda Set Specialization. Proceedings of the ACM on Programming Languages [en ligne]. 2023, vol. 7, p. 977–1000 [visité le 2025-05-07]. Disp. à l’adr. DOI: 10.1145/3591260
- XIE, Ningning; LEIJEN, Daan. Generalized Evidence Passing for Effect Handlers: Efficient Compilation of Effect Handlers to C. Proceedings of the ACM on Programming Languages [en ligne]. 2021, vol. 5, p. 1–30 [visité le 2025-05-07]. Disp. à l’adr. DOI: 10.1145/3473576
- REINKING, Alex; XIE, Ningning; DE MOURA, Leonardo; LEIJEN, Daan. Perceus: Garbage Free Reference Counting with Reuse. In: Proceedings of the 42nd ACM SIGPLAN International Conference on Programming Language Design and Implementation [en ligne]. Virtual Canada: ACM, 2021, p. 96–111 [visité le 2025-05-02]. Disp. à l’adr. DOI: 10.1145/3453483.3454032
- HUANG, Yulong. QTAL: A Quantitatively and Dependently Typed Assembly Language. Cambridge: Dept. of Computer Science and Technology, 2023.
- FELICISSIMO, Thiago; LERAY, Yann; PUJET, Loïc; TABAREAU, Nicolas; TANTER, Éric; WINTERHALTER, Théo. Definitional Proof Irrelevance Made Accessible. LIPIcs, Volume 380, LICS 2026 [en ligne]. Schloss Dagstuhl – Leibniz-Zentrum für Informatik, 2025, vol. 380, p. 41:1-41:26. Disp. à l’adr. DOI: 10.4230/LIPIcs.LICS.2026.41
- TEJIŠČÁK, Matúš. A Dependently Typed Calculus with Pattern Matching and Erasure Inference. Proceedings of the ACM on Programming Languages [en ligne]. 2020, vol. 4, p. 1–29 [visité le 2025-04-30]. Disp. à l’adr. DOI: 10.1145/3408973
- FITZGIBBONS, Michael; PARASKEVOPOULOU, Zoe; MUSHTAK, Noble; THALAKOTTUR, Michelle; SULAIMAN MANZUR, Jose; AHMED, Amal. RichWasm: Bringing Safe, Fine-Grained, Shared-Memory Interoperability down to WebAssembly. Proceedings of the ACM on Programming Languages [en ligne]. 2024, vol. 8, p. 1656–1679 [visité le 2025-05-08]. Disp. à l’adr. DOI: 10.1145/3656444
- PHIPPS-COSTIN, Luna; ROSSBERG, Andreas; GUHA, Arjun; LEIJEN, Daan; HILLERSTRÖM, Daniel; SIVARAMAKRISHNAN, Kc; PRETNAR, Matija; LINDLEY, Sam. Continuing WebAssembly with Effect Handlers. Proceedings of the ACM on Programming Languages [en ligne]. 2023, vol. 7, p. 460–485 [visité le 2025-05-07]. Disp. à l’adr. DOI: 10.1145/3622814
- LEISSA, Roland; ULLRICH, Marcel; MEYER, Joachim; HACK, Sebastian. MimIR: An Extensible and Type-Safe Intermediate Representation for the DSL Age. Proc. ACM Program. Lang. [en ligne]. 2024, vol. 9, p. 95–125 [visité le 2025-05-19]. Disp. à l’adr. DOI: 10.1145/3704840
- WANG, Yuting; XU, Xiangzhe; WILKE, Pierre; SHAO, Zhong. CompCertELF: Verified Separate Compilation of C Programs into ELF Object Files. Proceedings of the ACM on Programming Languages [en ligne]. 2020, vol. 4, p. 1–28 [visité le 2025-05-06]. Disp. à l’adr. DOI: 10.1145/3428265
- LEROY, Xavier. A Syntactic Theory of Type Generativity and Sharing. Journal of Functional Programming [en ligne]. 1996, vol. 6, no. 5, p. 667–698 [visité le 2025-05-15]. Disp. à l’adr. DOI: 10.1017/S0956796800001933
- FIX TRADING COMMUNITY. Simple Binary Encoding (SBE) Technical Specification, Version 1.0 with Errata [en ligne]. 2020 [visité le 2026-08-27]. Disp. à l’adr. https://www.fixtrading.org/standards/sbe/
- HASEGAWA, Masahito. Girard Translation and Logical Predicates. Journal of Functional Programming [en ligne]. Kyoto Univ.: Research Institute for Mathematical Sciences, 2000, vol. 10, no. 1, p. 77–89 [visité le 2025-05-15]. Disp. à l’adr. DOI: 10.1017/S0956796899003615
- RITTER, Elke; PITTS, Andrew M. A Fully Abstract Translation between a λ-Calculus with Reference Types and Standard ML [en ligne]. Berlin, Heidelberg: Oxford Univ. Computing Laboratory et Cambridge Univ. Computer Laboratory, 1994, vol. 902, p. 397–413. Disp. à l’adr. DOI: 10.1007/bfb0014067
- CASTELLAN, S.; STEFANESCO, L.; YOSHIDA, N. Game Semantics: Easy as Pi — Introducing Programming Game Semantics. s. d..
- WATT, Conrad; TRELA, Maja; LAMMICH, Peter; MÄRKL, Florian. WasmRef-isabelle: A Verified Monadic Interpreter and Industrial Fuzzing Oracle for WebAssembly. Proceedings of the ACM on Programming Languages [en ligne]. 2023, vol. 7, p. 100–123 [visité le 2025-05-07]. Disp. à l’adr. DOI: 10.1145/3591224
- CAIRES, Luís; TONINHO, Bernardo. The Linear Session Abstract Machine. ACM Transactions on Programming Languages and Systems [en ligne]. Lisbonne: Univ. de Lisboa, 2026, vol. 48, no. 3, p. 1–66 [visité le 2026-08-02]. Disp. à l’adr. DOI: 10.1145/3819583