11.5.5 : Ada



Il est extrêmement difficile d'écrire du code C ou C++ correct. Les occasions abondent, lorsqu'on utilise ces langages, d'effectuer une opération invalide au comportement indéfini comme le débordement d'un entier signé, l'accès au-delà des bornes d'un tableau, ou l'utilisation d'un pointeur vers une région mémoire déjà libérée. Ce comportement indéfini conduit à un résultat laissé à la discrétion du compilateur, du matériel, et du système d'exploitation, qui peut être désastreux ou invisible selon les circonstances d'exécution. La validation de code écrit dans ces langages est donc très complexe.

La famille Pascal, dont le langage Ada hérite, tente de résoudre ce problème en fournissant des briques de bases plus faciles à utiliser correctement et plus difficiles à utiliser de façon incorrecte, grâce à une conception plus rigoureuse et à un niveau extrême de vérification du programme par le compilateur. Ce faisant, Ada tente également d'offrir une grande généralité et un vocabulaire d'abstraction étendu.

Pour atteindre ces objectifs, le langage fournit un système de type d'autant plus riche qu'il est au centre de la conception des programmes en Ada, mais qui met plus souvent l'accent sur la vérification d'erreur à la compilation au détriment parfois du confort d'écriture du code. Ainsi, les programmeurs sont par exemple encouragés à définir des types entiers ou flottants incompatibles entre eux, bien que correspondant aux mêmes types machine, afin que ce soit une erreur de compilation d'utiliser par exemple des miles là où des kilomètres sont attendus. Et le code générique doit spécifier clairement quelles sortes de données qu'il attend en entrée, ce qui le rend plus robuste mais aussi plus difficile à écrire.

Le langage se place à un niveau d'abstraction intermédiaire entre le C/++ et les langages plus haut niveau comme Python et Java. Il décourage fortement l'utilisation des pointeurs (bien que ceux-ci soient présents), et il fournit en standard des abstractions très complexes comme un support standard de la programmation concurrente avec des algorithmes d'ordonnancement et primitives de synchronisation élaborées. En revanche, sa bibliothèque standard fournit un jeu de fonctionnalités comparable à celle du C++, et la programmation idiomatique en Ada implique un souci similaire de considérations machine comme l'allocation mémoire ou la dichotomie pile/tas, ce qui peut être une bonne chose quand on souhaite obtenir de bonnes performances.

Héritage du Pascal, le langage Ada possède une syntaxe relativement verbeuse et riche en mots-clés, qui sera inhabituelle pour les programmeurs habitués à la syntaxe C. Bien qu'il soit parfois utilisé dans des situations d'enseignement, son usage à grande échelle reste cantonné à des domaines d'application bien précis comme les systèmes militaires et critiques. Par conséquent, et du fait qu'il est également relativement difficile de l'interfacer avec C ou les autres langages en général, Ada souffre comme Fortran d'un grave manque de bibliothèques tierce partie. Hélas, contrairement à Fortran, il ne bénéficie pas non plus d'une large communauté d'utilisateurs pour des tâches de calcul.

Par conséquent, bien qu'il ait pu constituer un bien meilleur substrat que le C++ pour les tâches d'informatique scientifique bas niveau, du fait de son accent sur le parallélisme, sa plus grande ergonomie pour le non-expert, et son support complet des tableaux à N dimensions de taille fixe comme bornée, il reste difficile de recommander de lancer aujourd'hui une activité de prospective sur une plus grande utilisation d'Ada à l'IN2P3.

Ada est généralement compilé statiquement vers des binaires natifs.