- Née dans le chaos logiciel du département de la Défense américain dans les années 1970, Ada est un langage dont les principes centraux sont le typage statique fort et la séparation entre spécification et implémentation
- Grâce à sa structure en packages et à l’opacité de représentation, elle met en œuvre une encapsulation complète et a ensuite influencé les systèmes de modules de langages modernes comme Java, C# et Go
- Les types à contraintes sémantiques, les génériques, la concurrence (
task) et la conception par contrat sont autant de concepts qu’Ada a proposés avec plusieurs décennies d’avance, avant d’être repris par Haskell, Rust ou Swift - SPARK Ada élimine même les courses de données et les erreurs logiques par vérification formelle, et est utilisé dans des domaines à haute fiabilité comme l’aéronautique, le ferroviaire et les systèmes de défense
- Ada n’est pas un langage populaire, mais il reste un « langage qui fonctionne correctement en silence », ayant posé les principes fondamentaux de la conception des langages de programmation modernes
Contexte de naissance d’Ada et philosophie de conception
- Au début des années 1970, le département de la Défense des États-Unis (DoD) étudie une situation où plus de 450 langages et dialectes coexistent dans les systèmes d’armement, de logistique et de communication
- Chaque système souffre de problèmes d’interopérabilité, de maintenance impossible ou de disparition de l’auteur initial
- Cela provoque une crise des achats logiciels
- Le DoD n’adopte pas un langage existant (COBOL, Fortran, PL/1, etc.) et passe par un processus de définition des exigences sur cinq ans
- Strawman → Woodenman → Tinman → Ironman → Steelman
- Steelman (1978) exige une séparation explicite des interfaces, un typage statique fort, une concurrence intégrée, une gestion cohérente des exceptions, l’indépendance vis-à-vis de la machine, la lisibilité et la vérifiabilité
- En 1979, lors de la compétition entre quatre équipes (Green, Red, Blue, Yellow), l’équipe Green dirigée par Jean Ichbiah est retenue, et le langage reçoit le nom de Ada
- Ce nom rend hommage à Ada Lovelace et symbolise l’intention du langage
Structure en packages et encapsulation
- La structure centrale d’Ada est le package, avec une séparation physique entre la spécification (
specification) et le corps (body)- La spécification est le contrat exposé à l’extérieur, le corps est l’implémentation, et le compilateur impose la relation entre les deux
- Le code client ne peut pas accéder aux éléments absents de la spécification
- Cette structure constitue un prototype de système de modules, que des langages ultérieurs n’ont imité que partiellement
- Java, Python, JavaScript, C, Go et Rust ne mettent pas tous en œuvre la séparation structurelle complète d’Ada
- Les types
privaten’exposent que leur nom, tandis que leur représentation interne reste totalement opaque- Le client ne peut pas connaître la structure interne du type et ne peut utiliser que les opérations autorisées
- C’est une opacité de représentation plus forte que le contrôle d’accès
privatede Java
- Java et C# ont évolué progressivement pendant des décennies vers un niveau d’encapsulation proche de celui d’Ada
Système de types et contraintes sémantiques
- Ada définit mathématiquement la distinction entre type et sous-type
- Exemple :
type Age is range 0 .. 150crée un type distinct doté d’une contrainte d’intervalle - Le passage entre types incompatibles est détecté comme erreur à la compilation
- Exemple :
- En 1983, le système de types d’Ada était bien plus expressif que ceux de C, Fortran ou Pascal
- Les types à contraintes sémantiques permettent d’éviter des erreurs métier
- Le record discriminé (
discriminated record) est une structure qui possède des champs différents selon la valeur- Cela correspond aux sum types modernes ou aux types de données algébriques (ADT)
- Haskell, Rust, Swift, Kotlin et TypeScript ont introduit le même concept plusieurs décennies plus tard
Génériques et polymorphisme
- Les génériques d’Ada sont des unités pouvant prendre comme paramètres des types, des valeurs, des sous-programmes et des packages
- Ils implémentent un polymorphisme statique (
parametric polymorphism) avec vérification des types à la compilation
- Ils implémentent un polymorphisme statique (
- C++ (1990), Java (2004), C# (2005) et Go (2022), entre autres, n’ont introduit des fonctions similaires que plusieurs décennies après Ada
- Java, avec le type erasure, perd l’information de type à l’exécution
- Ada conserve les types à l’exécution et prend même en charge la paramétrisation de packages
- Les génériques d’Ada offrent une expressivité proche du polymorphisme d’ordre supérieur (
higher-kinded polymorphism)- Un concept comparable aux type classes de Haskell, aux traits de Rust et aux concepts de C++20
Modèle de concurrence et sûreté
- Ada intègre dès 1983 la concurrence au niveau du langage avec les
task- La déclaration de
tasket le modèle de communication par rendezvous mettent en œuvre une transmission de messages sans état partagé - Les channels de Go relèvent de la même famille de concepts CSP (Communicating Sequential Processes)
- La déclaration de
- Ada 95 introduit les protected objects
- Ils protègent l’accès aux données, avec une distinction entre
procedure,functionetentry - Ils fournissent des conditions de garde automatiques et une synchronisation sans verrou
- Ils protègent l’accès aux données, avec une distinction entre
- SPARK Ada démontre formellement l’absence de courses de données, d’exceptions, d’erreurs de plage et de violations de préconditions ou de postconditions
- Alors que le borrow checker de Rust ne garantit que la sûreté mémoire, SPARK va jusqu’à prouver la cohérence logique
Conception par contrat et sûreté vis-à-vis de null
- Ada 2012 intègre les contrats directement dans le langage
- Il permet d’exprimer des préconditions, des postconditions et des invariants de type
- La chaîne d’outils SPARK les exploite pour la preuve statique
- Il formalise au niveau du langage le concept de Design by Contract d’Eiffel (1986)
- C++, Java, Python et Rust n’en proposent que des implémentations partielles ou limitées à des bibliothèques
- Ada 2005 introduit les types
not nullafin de prendre en charge l’exclusion denullà la compilation- Par défaut, l’échec reste sûr via une exception à l’exécution (
Constraint_Error) - Une approche comparable aux références nullable de C# 8.0
- Par défaut, l’échec reste sûr via une exception à l’exécution (
Structure de gestion des exceptions
- Ada 83 introduit pour la première fois la gestion structurée des exceptions (
structured exception handling)- Les exceptions sont déclarées avant utilisation, traitées selon leur portée, avec des règles de propagation explicites
- Les checked exceptions de Java constituent une forme plus avancée, où l’appelant doit déclarer les exceptions
- Ada autorise librement la propagation des exceptions
- Rust supprime les exceptions et adopte une gestion des erreurs fondée sur le type
Result- La contribution d’Ada est d’avoir rendu la propagation des exceptions structurée et prévisible
Annexes et structure de normalisation
- La norme Ada comporte une structure d’extensions optionnelles appelée Annex
- Les annexes C à H définissent des fonctionnalités par domaine : système, temps réel, distribué, calcul numérique, haute fiabilité
- Les compilateurs doivent obtenir une certification indépendante pour chaque annexe
- La conformité à la norme est vérifiée par les tests ACATS de l’ACAA
- La structure normalisée d’Ada peut être utilisée directement pour la certification logicielle aéronautique DO-178C
- C et C++ peuvent eux aussi être certifiés, mais Ada y est structurellement mieux adapté
Influence d’Ada et décalage de perception
- Ada, en tant que langage porté par les pouvoirs publics, n’a pas retenu l’attention de la culture Silicon Valley
- Il contraste avec une culture préférant des syntaxes concises issues de C
- Les réussites d’Ada (aéronautique, ferroviaire, systèmes de défense) ont une faible visibilité précisément parce qu’elles n’échouent pas
- Un système très fiable ne génère ni polémiques ni incidents
- L’évolution des langages modernes converge vers des principes qu’Ada avait déjà formulés
- Séparation spécification-implémentation, vérification statique des types, concurrence au niveau du langage, sûreté fondée sur le contrat, etc.
- Ada est toujours utilisé dans des systèmes à haute fiabilité comme les avions, les chemins de fer ou les engins spatiaux, et demeure un « langage qui fonctionne correctement en silence »
1 commentaires
Avis Hacker News
J’aime Ada. Mais en parlant de gestion des types, je suis surpris que les langages de la famille ML (ML, SML, CML, Caml, OCaml, etc.) soient complètement passés sous silence
Ces langages prennent en charge les types structurels au niveau du compilateur. Le problème d’Ada, comme PL/I, PHP ou Perl, c’est que le langage lui-même était trop vaste et sa grammaire trop complexe. L’article présente cela comme un avantage, mais personnellement, je trouve que les extensions standard séparées en annexes étaient bien meilleures. Si le langage cœur avait été plus petit et orienté autour des annexes, il aurait sans doute été plus largement adopté
L’une des raisons pour lesquelles Ada a été boudé, c’est que les compilateurs coûtaient des dizaines de milliers de dollars. À l’époque où il n’existait ni compilateur gratuit ni open source, les autres langages étaient disponibles sans frais. Ça a été un facteur décisif
En lisant l’article, j’ai trouvé Ada intéressant, tout comme le texte lui-même, mais quelques erreurs factuelles m’ont sauté aux yeux. Par exemple, il affirmait que seul Ada séparait complètement implémentation et spécification, alors qu’en JavaScript aussi on peut définir des éléments privés avec les modules ES6. L’explication de la visibilité
privateen Java était également erronée. Ce genre d’erreurs nuit à la crédibilité du texteprivate, il est impossible d’accéder à ses champs internes depuis l’extérieur. En revanche, en JavaScript, on peut librement ajouter ou supprimer des propriétés à n’importe quel objet. Le niveau de protection à la compilation d’Ada est donc sans commune mesure avec celui de JSsetAccessible(true), on peut même modifier l’intérieur d’un StringDans l’ensemble, le texte était bon, mais la répétition continuelle de phrases du type « le langage X a acquis cette fonctionnalité après Ada » devenait lassante. Avec des exemples de code, cela aurait été bien plus convaincant
Ce compte Twitter a été créé en avril 2026 et n’indique pas d’auteur. Il a montré une productivité énorme sur une très courte période, et le fait que le nom de l’auteur ne soit pas affiché est intrigant
L’affirmation selon laquelle « tous les langages ont ajouté les sum types au cours des 20 dernières années, alors qu’Ada les avait dès le départ » est vraie, mais leur origine ne vient pas d’Ada. Le langage Hope ou NPL les avaient déjà avant
UNION, qui a ensuite évolué dans ALGOL 68, Hope, Miranda, etc. Leuniondu C est autre choseJ’ai tellement aimé l’article que j’espérais qu’il n’était pas écrit par une IA, mais le rythme de publication sur Twitter était si rapide que ça m’a rendu méfiant
L’US Air Force voulait à l’origine utiliser Ada, mais comme le développement a pris du retard, elle a utilisé JOVIAL. J’ai réalisé mon premier projet en JOVIAL en 1981, et à l’époque Ada n’en était encore qu’au stade des spécifications
Sur la page principale du site, on peut lire la phrase « ce n’est pas une position, c’est une proposition », et certains s’en servent pour affirmer qu’il s’agit d’un site écrit par IA
L’article disait que « le système de modules de JavaScript ne peut pas cacher la représentation interne d’un type comme Ada », mais en réalité, dans les modules JS, si quelque chose n’est pas exporté, c’est parfaitement caché. Je me demandais donc en quoi Ada était réellement meilleur sur ce point