Article de reference

SPARK (langage de programmation)

{{cite web|url=http://www.adacore.com/uploads/technical-papers/Ada2012_Rational_Introducion.pdf|title=Ada2012 Rationale|website=adacore.com|access-date=5 May 2018|url-status=liv...

langage de programmation informatique formellement défini, basé sur le langage Ada , destiné au développement de logiciels à haute intégrité utilisés dans des systèmes où un fonctionnement prévisible et hautement fiable est essentiel. Il facilite le développement d'applications exigeant sûreté, sécurité ou intégrité des données. Il est particulièrement utilisé dans le domaine de l'informatique temps réel et des systèmes embarqués, où les questions de criticité et de sécurité informatique sont primordiales.

À l'origine, il existait trois versions de SPARK (SPARK83, SPARK95, SPARK2005), basées respectivement sur Ada 83, Ada 95 et Ada 2005.

Une quatrième version, SPARK 2014, basée sur Ada 2012, a été publiée le 30 avril 2014. SPARK 2014 est une refonte complète du langage et prend en charge les outils de vérification logicielle .

Le langage SPARK est un sous-ensemble bien défini du langage Ada qui utilise des contrats pour décrire la spécification des composants sous une forme adaptée à la vérification statique et dynamique. SPARK est également conçu pour éliminer toutes les constructions du langage susceptibles d'entraîner un comportement imprévisible.

Dans SPARK83/95/2005, les contrats sont encodés dans des commentaires Ada et sont donc ignorés par tout compilateur Ada standard, mais sont traités par l' examinateur SPARK et ses outils associés. Ces versions antérieures se concentrent sur la vérification statique des contrats.

À l'inverse, SPARK 2014 utilise la syntaxe intégrée des aspects d'Ada 2012 pour exprimer les contrats, les intégrant ainsi au cœur du langage. L'outil principal de SPARK 2014 (GNATprove) repose sur l' infrastructure GNAT/GCC et réutilise la quasi-totalité de l'interface GNAT Ada 2012.

compilateur Ada . Ces objectifs sont atteints en partie en omettant certaines fonctionnalités problématiques d'Ada (comme le traitement parallèle illimité ) et en partie en introduisant des contrats qui formalisent les intentions et les exigences du concepteur d'application pour certains composants du programme.

La combinaison de ces approches permet à SPARK d'atteindre ses objectifs de conception, qui sont :

Un membre du personnel de Praxis a déclaré : « Notre taux de défauts avec Spark est au moins 10 fois, parfois 100 fois inférieur à celui créé avec d'autres langages. »

Exemples de contrats

Considérez la spécification du sous-programme Ada ci-dessous :

procédure Incrémenter (X : entrée sortie Type_Compteur);

En Ada pur, cela pourrait incrémenter la variable Xde un ou de mille ; ou cela pourrait définir un compteur global Xet renvoyer la valeur originale du compteurX ; ou cela pourrait ne rien faire avec X.

Avec SPARK 2014, des contrats sont ajoutés au code pour fournir davantage d'informations sur le fonctionnement d'un sous-programme. Par exemple, la spécification ci-dessus peut être modifiée comme suit :

procédure Incrémenter (X : entrée sortie Type_Compteur)  avec Global => null , Dépend => (X => X);

Cela précise que la Incrementprocédure n'utilise aucune variable globale (ni mise à jour ni lecture) et que le seul élément de données utilisé pour calculer la nouvelle valeur de Xest Xseul.

La spécification peut également être rédigée comme suit :

procédure Incrémenter (X : type_compteur d'entrée/sortie )  avec Global => (Entrée/Sortie => Compteur), Dépend => (Nombre => (Nombre, X), X => null);

Ceci spécifie que Incrementla variable globale sera utilisée Countdans le même package que Increment, que la valeur exportée de Countdépend des valeurs importées de Countet X, et que la valeur exportée de Xne dépend d'aucune variable et sera dérivée uniquement de données constantes.

Si GNATprove est ensuite exécuté sur la spécification et le corps correspondant d'un sous-programme, il analysera ce dernier afin de construire un modèle du flux d'informations. Ce modèle sera ensuite comparé aux annotations et toute divergence sera signalée à l'utilisateur.

Ces spécifications peuvent être étendues en précisant diverses propriétés qui doivent être vérifiées lors de l'appel d'un sous-programme ( préconditions ) ou qui le seront une fois l'exécution du sous-programme terminée ( postconditions ). Par exemple :

procédure Incrémentation (X : entrée sortie Type_Compteur)  avec Global => null, Dépend => (X => X), Pré => X < Counter_Type'Dernier, Post => X = X'Ancien + 1;

Ceci précise non seulement que Xest dérivé de lui-même, mais aussi qu'avant Incrementl'appel, Xdoit être strictement inférieur à la dernière valeur possible de son type (pour garantir que le résultat ne déborde jamais ) et qu'après, Xsera égal à la valeur initiale Xplus un.

Conditions de vérification

GNATprove peut également générer un ensemble de conditions de vérification (CV). Celles-ci servent à déterminer si certaines propriétés sont vérifiées pour un sous-programme donné. Au minimum, GNATprove génère des CV pour s'assurer qu'aucune erreur d'exécution ne peut se produire au sein d'un sous-programme, par exemple :

  • Indice de tableau hors limites
  • violation de plage de type
  • division par zéro
  • débordement numérique

Si une postcondition ou toute autre assertion est ajoutée à un sous-programme, GNATprove générera également des VC qui exigent que l'utilisateur démontre que ces propriétés sont vérifiées pour tous les chemins possibles à travers le sous-programme.

En interne, GNATprove utilise le langage intermédiaire Why3 et le générateur de VC , ainsi que les démonstrateurs de théorèmes CVC4 , Z3 et Alt-Ergo pour résoudre les VC. L'utilisation d'autres démonstrateurs (y compris des vérificateurs de preuves interactifs) est également possible grâce à d'autres composants de la suite d'outils Why3.

Histoire

Les origines de cette technologie remontent à 1987, avec des travaux menés à l' Université de Southampton . La première version de SPARK (basée sur Ada 83) a été développée au sein de cette université, avec le soutien du ministère britannique de la Défense , par Bernard Carré et Trevor Jennings. Le nom SPARK est dérivé de SPADE Ada Kernel , en référence au sous-ensemble SPADE du langage de programmation Pascal .

Par la suite, le langage a été progressivement étendu et perfectionné, d'abord par Program Validation Limited, puis par Praxis Critical Systems Limited. En 2004, Praxis Critical Systems Limited est devenue Praxis High Integrity Systems Limited, et les travaux sur SPARK se sont poursuivis. En janvier 2010, la société est devenue Altran Praxis .

Début 2009, Praxis a formé un partenariat avec AdaCore et a publié SPARK Pro sous les termes de la licence GPL. Cette publication a été suivie en juin 2009 par la sortie de SPARK GPL Edition 2009, destinée aux communautés du logiciel libre et open source (FOSS) et du monde universitaire.

En janvier 2013, Altran-Praxis a changé de nom pour devenir Altran, qui est devenu Capgemini Engineering en avril 2021 (suite à la fusion d'Altran avec Capgemini ).

La première version Pro de SPARK 2014 a été annoncée le 30 avril 2014 et a été rapidement suivie par l'édition GPL de SPARK 2014, destinée aux communautés FLOSS et académiques.

applications industrielles

SPARK a été utilisé dans de nombreuses applications industrielles concrètes. Son intégration le plus tôt possible dans le processus de conception est généralement considérée comme donnant les résultats les plus favorables.

Systèmes liés à la sécurité

SPARK a été utilisé dans plusieurs systèmes critiques de sécurité de haut niveau, couvrant l'aviation commerciale (le système d'instrumentation des limites opérationnelles des navires/hélicoptères, les moteurs à réaction de la série Rolls-Royce Trent , le Lockheed Martin C130J ), l'aviation militaire ( EuroFighter Typhoon , Harrier GR9 , AerMacchi M346 ), la gestion du trafic aérien ( système UK dispositif d'assistance ventriculaire LifeFlow ) et les applications spatiales (le projet CubeSat du Vermont Technical College ).

En ce qui concerne les processus d'approbation nécessaires pour de tels systèmes, SPARK a été utilisé pour certifier selon la norme de défense britannique (DEFSTAN) 00-55, ainsi que selon les normes DO-178B niveau A et ITSEC E6.

Systèmes liés à la sécurité

SPARK a également été utilisé dans le développement de systèmes sécurisés. Parmi ses utilisateurs figurent Rockwell Collins (solutions interdomaines Turnstile et SecureOne), le développement de l' autorité de certification MULTOS originale , le démonstrateur Genode . Un autre exemple est la mise en œuvre d'une autorité de certification sécurisée pour la carte à valeur stockée produite par Mondex International , où la notation Z a servi de précurseur au codage en SPARK

En août 2010, Rod Chapman, ingénieur principal chez Altran Praxis, a implémenté Skein , l'un des candidats pour SHA-3 , en SPARK. Après une optimisation minutieuse, il est parvenu à ce que la version SPARK soit seulement 5 à 10 % plus lente que l'implémentation en C. Des améliorations ultérieures apportées à l'interface Ada dans GCC (implémentées par Eric Botcazou d'AdaCore) ont comblé l'écart, le code SPARK atteignant désormais exactement les mêmes performances que le code C.

NVIDIA a également adopté SPARK pour la mise en œuvre de micrologiciels critiques pour la sécurité . Fort de ce succès, l'entreprise a étendu l'utilisation de SPARK à d'autres projets liés aux micrologiciels et a mis en place des formations internes à l'utilisation de cette technologie.

En 2020, Rod Chapman a réimplémenté la bibliothèque cryptographique

Plus d articles de Worldlex Wiki

Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.

Explorer l index