Pourquoi utiliser le langage Ada pour programmer votre système



Le langage de programmation Ada est né au milieu des années 1970 lorsque le département américain de la Défense et le ministère britannique de la Défense ont décidé de remplacer des centaines de langages de programmation spécialisés pour les systèmes informatiques embarqués, qui étaient de plus en plus utilisés dans les projets militaires. Le langage Ada a été développé de telle manière qu'il était le seul langage capable de travailler sur tous ces systèmes embarqués, et en même temps d'assurer la fiabilité et les performances à un niveau pas pire que les systèmes spécialisés.

Après la mise à jour de 1995, le langage a été adapté aux systèmes à usage général, en ajoutant une programmation orientée objet, sans perdre de vue les valeurs clés - fiabilité, facilité de support et efficacité. Aujourd'hui, les logiciels écrits en Ada constituent la base non seulement des équipements militaires, mais aussi des projets commerciaux dans le domaine de l'avionique et des systèmes de contrôle du trafic aérien. Le code Ada contrôle des missiles tels que Arian 4 et 5, de nombreux satellites et d'innombrables autres systèmes dans lesquels de petites interruptions peuvent avoir de graves conséquences.

Peut-être qu'Ada peut être utilisé dans votre prochain projet intégré.

Planification de la qualité militaire


Pour sélectionner un nouveau langage de programmation, le ministère de la Défense a constitué un « groupe de travail sur les langages d'ordre élevé (HOLWG)], composé d'experts militaires et scientifiques dont la tâche était de compiler une liste de requêtes et de sélectionner les langues candidates. En conséquence, le soi-disant " Demandes de Stillman ":

Les principaux points des demandes étaient les suivants:

  • Un workflow polyvalent flexible qui s'adapte aux besoins des applications informatiques embarquées.
  • Fiabilité Le langage devrait faciliter la conception et le développement de programmes fiables.
  • Facilité de support. Le code doit être lisible et les solutions logicielles claires.
  • Facilité de production de code efficace. Il devrait être possible d'identifier facilement les conceptions inefficaces.
  • Pas de complexité inutile. La structure sémantique doit être cohérente et minimiser le nombre de concepts.
  • Indépendance vis-à-vis de la voiture. La langue ne doit être liée à aucun détail du système d'exploitation ou du matériel.
  • Définition complète. Toutes les parties du langage doivent être définies de manière complète et explicite.

Le rapport concluait avec l'opinion que la première ligne de défense contre les problèmes logiciels est d'empêcher les programmeurs de faire des erreurs. En éliminant la possibilité de faire une erreur subtile, par exemple, par des conversions de types implicites ou d'autres constructions dangereuses, nous rendons automatiquement le code plus sûr et le rendons plus facile à maintenir.

Le groupe a conclu que, bien que parmi les langues existantes à l'époque, aucune ne convenait aux besoins du Ministère de la défense, il était tout à fait réaliste de créer une nouvelle langue qui conviendrait à toutes ces questions. Quatre designers l'ont fait. Le processus de sélection intermédiaire a sélectionné les deux méthodes de travail les plus appropriées et, par conséquent, une seule langue a remporté le concours et a reçu le nom " Ada ".



Protection par défaut intégrée


Le système de type en enfer n'est pas seulement strict - il est parfois appelé super-strict car il ne permet aucune conversion de type implicite. Prenons, par exemple, cet extrait de code C:

typedef uint32_t myInt; myInt foo = 42; uint32_t bar = foo; 

Ceci est un code valide; il compilera, démarrera et produira un résultat évident indiquant la réponse à la question principale de la vie, de l'univers et de tout cela. En enfer, cela ne fonctionnera pas:

 type MyInt is Integer; foo: MyInt; bar: Integer; foo := 42; bar := foo; 

Le compilateur générera une erreur, car Integer et MyInt ne sont pas la même chose. Le principal avantage de cette approche est que si le programmeur modifie ensuite la définition de type, des milliers de conversions de types implicites dans la base de code ne feront pas exploser le programme. Au lieu de cela, les types doivent être explicitement castés - cela favorise un bon code, empêchant la confusion des types qui sont "assez similaires".

Tout programmeur coincé dans un marais à partir d'un mélange de définitions standard des types C, Linux et Win32 peut apprécier le manque de besoin de fouiller à travers d'innombrables pages de documentation et de code mal formaté pour comprendre quel typedef ou macro contient une véritable définition de quelque chose qui ne ce qui a empêché la compilation ou exploré pendant le débogage.



Ada ajoute des couches de protection supplémentaires lors des vérifications lors des étapes de compilation et de lancement. Dans Ada, le programmeur doit spécifier explicitement les instructions de fermeture pour les blocs et les limites dans lesquelles la valeur de la variable doit tenir. Ada ne définit pas de types standard comme int ou float, mais oblige le programmeur à créer des types avec une plage spécifique dès le début. Cela est également vrai pour les chaînes - à l'exception des chaînes illimitées, toutes les chaînes ont une longueur fixe.

Au stade de l'opération, vous pouvez vérifier les erreurs telles que l'accès incorrect à la mémoire, les débordements de tampon, le dépassement des limites définies, les erreurs ± 1, l'accès à la baie. Ils peuvent ensuite être traités en toute sécurité, au lieu de supprimer l'ensemble de l'application.

Ada implémente un modèle de types de référence au lieu de pointeurs de bas niveau. Chaque type de référence est traité par le pool de mémoire, soit par défaut, soit par un programmeur spécifique, si nécessaire, pour fonctionner avec des implémentations de mémoire NUMA plus exotiques. Un programmeur n'a jamais à accéder directement à la mémoire, il doit utiliser un gestionnaire de pool de mémoire.

Enfin, le compilateur ou le programme lors de l'exécution décide comment transmettre les données vers ou depuis la fonction. Et bien qu'il soit nécessaire d'indiquer le sens de transmission de chaque paramètre («in», «out» ou «in out»), la décision finale quant à la transmission des données via des registres, des tas ou par référence est prise par le compilateur ou le programme au moment de l'exécution, mais pas un programmeur. Cela évite les problèmes de débordement de pile.

Le profil Ravenscar et le dialecte SPARK sont des sous-ensembles d'Ada, ce dernier se concentrant sur les contrats. Au fil du temps, les caractéristiques de ces sous-ensembles ont été transférées à la spécification de la langue principale.

Programmation Ada aujourd'hui


ANSI a établi la spécification Ada 83 en 1983. Puis l'Intel 80286 vient de sortir et le Motorola 68000 n'a que quatre ans. C'était l'aube des ordinateurs personnels, ainsi qu'une transition maladroite des années 1970 aux années 80, lorsque la popularité des microcontrôleurs a commencé à croître. Imaginez le microcontrôleur Intel 8051 et sa superbe EPROM 4 Ko et 128 Go de RAM.



Les microcontrôleurs populaires aujourd'hui sont beaucoup plus puissants que ceux de 1983. Vous pouvez prendre n'importe quel ARM, AVR, RISC-V, etc. (ou kit Lego Mindstorms NXT) et commencez à développer pour cela en utilisant les mêmes outils basés sur C. Il n'est pas surprenant que le populaire compilateur GNAT Ada soit basé sur GCC. Des outils basés sur LLVM sont également en cours de développement dans le cadre du projet DragonEgg.

Il existe deux versions des outils Ada basés sur GCC. L'option AdaCore est prise en charge commercialement, mais a ses propres caractéristiques. L'option Free Software Foundation est naturellement gratuite et ses fonctionnalités sont comparables à celles d'AdaCore.

Pour un démarrage facile, utilisez soit l'IDE GNAT Programming Studio (GPS), qui est fourni avec AdaCore (une copie sur Github ), ou écrivez le code dans un éditeur de texte et compilez-le manuellement, ou en utilisant Makefiles. La boîte à outils ici est un peu plus compliquée que celle de C ou C ++, mais le développement est facilité par l'utilitaire gnatmake, qui inclut tous les outils, et fonctionne approximativement comme GCC.



Un exemple d'un petit projet non trivial dans Ada écrit par votre humble serviteur comme analyseur d'arguments en ligne de commande. Vous y trouverez le Makefile situé dans le dossier ada / project, où les dossiers sont définis où vous pouvez trouver les fichiers de spécifications de package (.ads) et les packages eux-mêmes (.adb).

Ces fichiers correspondent à peu près aux fichiers avec des en-têtes et du code C et C ++, mais ils présentent également des différences importantes. Contrairement à C, Ada n'a pas de préprocesseur et elle ne combine pas le code et les en-têtes pour créer des fichiers compilés. Au lieu de cela, il existe un lien vers le nom du package spécifié dans la spécification. Le nom du fichier .ads ne doit pas non plus correspondre au nom du package. Cela donne une grande flexibilité et évite les problèmes courants en C avec dépendance cyclique ou la nécessité de lier les en-têtes dans un ordre spécifique.

Où aller ensuite


Après avoir téléchargé la boîte à outils GNAT, démarré le GPS ou Vim / Emacs, et pendant un moment en regardant le curseur clignotant sur une page vierge, vous pouvez penser par où commencer. Heureusement, nous avons récemment couvert un projet basé sur Ada utilisant le noyau PicoRV32 RISC-V. Il utilise le populaire CPLD ICE40LP8K, qui est pris en charge par des FPGA open source tels que Yosys.



En termes de documentation, il existe des articles d'introduction pour les débutants conçus pour les développeurs Java et C ++, une référence AdaCore , une référence WikiBooks et, bien sûr, la documentation Programmation dans Ada 2012 . Ce sont peut-être les références les plus complètes, à l'exception du manuel de référence linguistique (LRM) Ada 2012 de 945 pages.

Le langage Ada, quoique assez rare pour les amateurs de programmation, est un langage complètement ouvert avec des outils de développement fiables avec un support commercial, et est utilisé pour créer des logiciels pour tout, des missiles balistiques intercontinentaux et du F-15 au firmware de dispositifs médicaux. Bien que ce soit un langage assez compliqué, si vous allez au-delà des limites de base, il devrait certainement être inclus dans la liste des langues que vous avez déjà utilisées dans vos projets - même pour rendre votre CV plus cool.

Source: https://habr.com/ru/post/fr469671/


All Articles