Ada et SPARK (qui est un Ada dialecte avec quelques crochets pour statique de vérification) sont utilisés dans l'aéronautique, des cercles pour la construction de haute fiabilité des logiciels tels que les systèmes avioniques. Il y a quelque chose d'un écosystème de code de vérification de l'outillage pour ces langues, bien que cette technologie existe aussi pour les plus traditionnels des langues.
Erlang a été conçu à partir du sol pour l'écriture à haute fiabilité code des télécommunications. Il est conçu pour faciliter la séparation de préoccupations pour le recouvrement d'erreur (c'est à dire le sous-système de génération de l'erreur est différente de la sous-système qui gère l'erreur). Il peut également être soumis à des preuves formelles, bien que cette fonctionnalité n'a pas vraiment déplacé loin du milieu de la recherche.
Les langages fonctionnels comme Haskell peut être soumis à des preuves formelles par des systèmes automatisés en raison de la nature déclarative de la langue. Ce code permet à des effets secondaires à être contenues dans monadique fonctions. Pour une exactitude formelle, la preuve le reste du code ne peut être assumé de ne rien faire, mais ce qui est spécifié.
Cependant, ces langues sont des ordures et la collecte des ordures est transparent pour le code, il ne peut donc pas être motivé à propos de cette manière. Les ordures collectées langues ne sont normalement pas suffisamment prévisible pour des applications temps-réel dur, bien qu'il y est un organisme de recherche en cours dans le temps délimité différentiels ramasseurs d'ordures.
Eiffel et ses descendants ont un support intégré pour une technique appelée la Conception Par Contrat qui fournit un solide mécanisme d'exécution pour l'intégration des pré - et post - vérifie les invariants. Alors que Eiffel n'a jamais vraiment pris, le développement de haute fiabilité logiciel a tendance à se composent de tirer des chèques et des gestionnaires pour des modes de défaillance, avant de avant de en train d'écrire la fonctionnalité.
Bien que le C et le C++ n'ont pas été spécifiquement conçus pour ce type d'application, ils sont largement utilisés pour les systèmes embarqués et logiciels critiques, pour plusieurs raisons. Les principales propriétés de la note de contrôle sur la gestion de la mémoire (ce qui permet de vous éviter d'avoir à collecter les ordures, par exemple), simple, bien débuggé d'exécution de base des bibliothèques et de la maturité de l'outil de support. Beaucoup de intégré à l'outil de développement des chaînes en usage aujourd'hui ont d'abord été développés dans les années 1980 et 1990, lorsqu'il s'agissait de la technologie actuelle et à venir de la culture Unix qui a été répandue à l'époque, de sorte que ces outils restent populaires pour ce genre de travail.
Alors que manuel de gestion de la mémoire code doit être soigneusement vérifié pour éviter des erreurs, il autorise un certain degré de contrôle sur l'application des temps de réponse qui n'est pas disponible avec les langues qui dépendent de la collecte des ordures. Le coeur des bibliothèques des langages C et C++ sont relativement simples, mature et bien entendu, de sorte qu'ils sont parmi les plus stables des plates-formes disponibles. La plupart, si pas tous les outils d'analyse statique utilisé pour Ada également soutenir le C et le C++, et il existe de nombreux autres outils disponibles pour les C de. Il y a également plusieurs largement utilisé C/C++ en fonction de l'outil de chaînes; la plupart des chaînes d'outils utilisés pour Ada viennent également dans des versions qui prennent en charge C et/ou C++.
Méthodes formelles telles que la Sémantique Axiomatique (PDF), Z Notation
ou de Communiquer des Processus Séquentiels permettent au programme de la logique mathématiquement vérifié, et sont souvent utilisés dans la conception de la sécurité des logiciels critiques où l'application est assez simple à appliquer (généralement intégrés des systèmes de contrôle). Par exemple, un de mes anciens professeurs n'formelle de la preuve de correction d'un système de signalisation pour les chemins de fer allemands réseau.
Le principal inconvénient des méthodes formelles est leur tendance à croître de façon exponentielle dans la complexité du système sous-jacent d'être prouvé. Cela signifie qu'il existe un risque important d'erreurs dans la preuve, de sorte qu'ils sont pratiquement limitées à assez simples applications. Les méthodes formelles sont très largement utilisés pour la vérification du matériel, l'exactitude matérielle des bugs sont très coûteuses à réparer, en particulier sur des produits de masse. Depuis le Pentium FDIV bug, méthodes formelles ont gagné beaucoup d'attention, et ont été utilisés pour vérifier l'exactitude de la FPU sur tous les processeurs Intel depuis le Pentium Pro.
De nombreuses autres langues ont été utilisées pour développer très fiable logiciel. Beaucoup de recherches ont été faites sur le sujet. On peut raisonnablement faire valoir que la méthodologie est plus important que la plate-forme même si il y a des principes tels que la simplicité et la sélection et le contrôle des dépendances qui pourrait empêcher l'utilisation de certaines plates-formes.
Comme plusieurs autres l'ont mentionné, certains O/S plates-formes ont des caractéristiques afin de promouvoir la fiabilité et les comportements prévisibles, telles que les timers de chiens de garde et de la garantie interruption de temps de réponse. La simplicité est également un grand facteur de fiabilité, et de nombreux RT systèmes sont volontairement très simple et compact. QNX (le seul O/S, que je connais bien, ayant déjà travaillé avec un béton système basé sur lui) est très petite, et tient sur une seule disquette. Pour des raisons similaires, les gens qui font OpenBSD - qui est connu pour sa sécurité robuste et approfondie de l'audit de code - aussi sortir de leur façon de garder un système simple.
EDIT: Cette publication a quelques liens vers de bons articles à propos de la sécurité des logiciels critiques, notamment Ici et Ici. Accessoires de S. Lott et Adam Davis pour la source. L'histoire de la THERAC-25 est un peu un classique dans ce domaine.