50 votes

Il y a aucune preuve réelle-les langues du monde? (scala?)

J'ai été enseigné au sujet de systèmes formels à l'université, mais j'ai été déçu de la façon dont ils ne semblent pas être utilisé dans le monde réel.

J'aime l'idée d'être en mesure de savoir que certains de code (objet, la fonction, peu importe) des œuvres, et non par des essais, mais par la preuve.

Je suis sûr que nous sommes tous familiers avec les parallèles qui n'existent pas entre génie physique et génie logiciel (acier se comporte de manière prévisible, le logiciel peut rien faire qui sait!), et j'aimerais savoir si il y a des langues que l'on peut utiliser dans le monde réel (demande un framework web trop demander?)

J'ai entendu des choses intéressantes sur la testabilité des langages fonctionnels comme la scala.

Comme logiciel, ingénieurs quelles options avons-nous?

35voto

aioobe Points 158466

Oui, il y a des langues conçu pour écrire prouvable bon logiciel. Certains sont même utilisés dans l'industrie. Spark Ada est probablement l'exemple le plus frappant. J'ai parlé à quelques personnes, à la Praxis Critique Systems Limited, qui l'a utilisé pour l'exécution de code sur Boings (pour le moteur de suivi) et il semble assez agréable. (Ici est un excellent résumé / description de la langue.) Cette langue et d'accompagnement de la preuve utilise la deuxième technique décrite ci-dessous (il n'a même pas permettre l'allocation de mémoire dynamique).


Mon impression et de l'expérience est qu'il y a deux techniques pour l'écriture correcte du logiciel:

  • Technique 1: Écrire le logiciel dans une langue que vous êtes à l'aise avec (C, C++ ou Java par exemple). Prendre une spécification formelle d'une telle langue, et de prouver votre programme correct.

    Si votre ambition est d'être 100% correct (ce qui est le plus souvent une exigence dans l'automobile / industrie aérospatiale) vous seriez passé peu de temps de programmation, et plus de temps à prouver.

  • Technique 2: Écrire le logiciel de manière un peu plus maladroit de la langue (certains sous-ensembles de Ada ou version remaniée de OCaml par exemple) et d'écriture de la preuve de correction en cours de route. De programmation et de prouver va main dans la main (le Curry-Howard correspondance même assimile complètement!)

    Dans ces scénarios, vous aurez toujours se retrouver avec un programme correct. (Un bug seront garantis pour être ancrée dans le cahier des charges.) Vous serez susceptibles de passer plus de temps sur la programmation mais d'un autre côté, vous êtes la preuve correcte le long du chemin.

Notez que les deux approches repose sur le fait que vous avez une spécification formelle à la main (sinon comment voulez-vous dire ce qui est correct / incorrect comportement), et un permis de définir formellement la sémantique de la langue (sinon comment voulez-vous être en mesure de dire que le comportement de votre programme).

Voici quelques exemples de démarches formelles. Si c'est le "monde réel" ou pas, ça dépend à qui vous demandez :-)

Je ne connais qu'une "prouvable correcte" web-la langue de l'application: UR. Un Ur-programme qui "passe par le compilateur" est la garantie de ne pas:

  • Souffrent de toutes sortes de code attaques par injection de
  • Retour HTML non valide
  • Contiennent des morts intra-application liens
  • Avoir des décalages entre les formulaires HTML et les champs attendus par leurs maîtres
  • Inclure le code côté client que les hypothèses incorrectes sur la "AJAX"des services de style que le serveur web distant fournit
  • Tentative non valide requêtes SQL
  • L'utilisation abusive de regroupement ou désordonnancement dans la communication avec les bases de données SQL ou entre les navigateurs et les serveurs web

23voto

Daniel Spiewak Points 30706

Afin de répondre à cette question, vous avez vraiment besoin de définir ce que vous entendez par "prouvable". Comme Ricky l'a souligné, n'importe quelle langue avec un système de type est une langue avec un système de preuves qui s'exécute chaque fois que vous compilez votre programme. Ces systèmes d'épreuves sont presque toujours malheureusement impuissant — répondre à des questions comme String vs Int et en évitant des questions comme "est la liste triée?" — mais ils sont la preuve des systèmes d'aucun-le-moins.

Malheureusement, le plus sophistiqué de votre preuve objectifs, plus il est difficile de travailler avec un système qui permet de vérifier vos preuves. Cela dégénère assez rapidement dans l'indécidabilité lorsque l'on considère la taille de la classe de problèmes qui sont indécidable sur des Machines de Turing. Bien sûr, vous pouvez théoriquement faire des choses de base comme le prouve la justesse de votre algorithme de tri, mais rien de plus que cela va être de marcher sur de la glace très fine.

Même pour prouver quelque chose de simple comme la correction d'un algorithme de tri nécessite un niveau relativement sophistiqué système de preuves. (remarque: puisque nous avons déjà établi que les systèmes de type sont une preuve de système intégré dans la langue, je vais vous parler de choses en termes de théorie des types, plutôt que d'en agitant mes mains encore plus vigoureusement) je suis assez certain qu'une preuve de correction sur la liste du tri aurait besoin de certains types de charge, sinon vous n'avez aucune façon de référencer les valeurs relatives au niveau du type. Cela commence tout de suite à la rupture dans les domaines de la théorie des types qui ont été montré pour être indécidable. Ainsi, alors que vous pourriez être en mesure de prouver la justesse de votre liste algorithme de tri, la seule façon de le faire serait d'utiliser un système qui vous permettra également d'exprimer les preuves dont il ne peut pas vérifier. Personnellement, je trouve cela très troublant.

Il y a aussi la facilité d'utilisation, aspect auquel je faisais allusion plus haut. Le plus sophistiqué de votre type de système, le moins agréable à l'utilisation. Ce n'est pas une règle dure et rapide, mais je pense que c'est vrai pour la plupart. Et comme avec tout système formel, vous trouverez souvent que le fait d'exprimer la preuve, c'est plus de travail (et de plus en plus enclins à faire des erreurs) que la création de la mise en œuvre en premier lieu.

Avec tout ça de la manière, il est intéressant de noter que la Scala du type de système (comme Haskell) est Turing Complet, ce qui signifie que vous pouvez théoriquement l'utiliser pour prouver tout decidable de propriété sur votre code, à condition que vous avez écrit votre code de telle façon qu'il se prête à de telles épreuves. Haskell est presque certainement un meilleur langage pour ce que Java (depuis le niveau du type de programmation en Haskell est similaire à Prolog, tandis que le type de programmation au niveau de la Scala est de plus en plus semblables à SML). Je ne conseille pas que vous utilisez Scala ou Haskell type de systèmes dans cette voie (de preuves formelles de l'algorithmique de justesse), mais l'option est théoriquement disponible.

Tout à fait, je pense que la raison pour laquelle vous n'avez pas vu systèmes formels dans le "monde réel" provient du fait que la preuve formelle de systèmes ont cédé à l'impitoyable tyrannie du pragmatisme. Comme je l'ai mentionné, il y a donc beaucoup d'efforts impliqués dans l'élaboration de votre exactitude des preuves que ce n'est presque jamais la peine. L'industrie a décidé il y a longtemps qu'il était plus facile de créer ad hoc sur les tests qu'il était de passer par toute sorte d'analyse formelle des processus de raisonnement.

10voto

Ricky Clarkson Points 1724

Langages à typage prouver l'absence de certaines catégories de la faute. Le plus avancé, le système de type, le plus de défauts qu'ils peuvent prouver l'absence d'.

Pour preuve que l'ensemble d'un programme fonctionne, oui, vous faites un pas à l'extérieur des limites de la vie ordinaire des langues, où les mathématiques et la programmation rencontrer les uns les autres, se serrent la main, puis passez à parler à l'aide de symboles grecs au sujet de la façon dont les programmeurs ne peuvent pas gérer les symboles grecs. C'est sur la Σ de toute façon.

10voto

Charlie Martin Points 62306

Vous vous posez une question que beaucoup d'entre nous avons demandé au fil des ans. Je ne sais pas que j'ai une bonne réponse, mais voici quelques éléments:

  • Il y a bien compris les langues avec la possibilité d'être prouvé en usage aujourd'hui; Lisp via ACL2 est l'un, et bien sûr Régime a bien compris la définition formelle ainsi.

  • un certain nombre de systèmes ont essayé d'utiliser des langages fonctionnels purs, ou presque pur, comme Haskell. Il y a un peu juste de méthodes formelles de travail en Haskell.

  • Remontant à plus de 20 ans, il y avait une courte durée chose pour l'utilisation de la main-preuve d'un langage formel qui a ensuite été rigoureusement traduit dans un langage compilé. Quelques exemples d'IBM Logiciel de salle Blanche, ACL, Tzigane, et de Rose de Calcul Logique, John McHugh et de mon travail sur la confiance compilation de C, et de mon propre travail sur la main-preuve pour les systèmes de programmation. Ces tous obtenu une certaine attention, mais aucun d'eux de plus en pratique.

Une question intéressante à poser, je pense, ce serait des conditions suffisantes pour obtenir une approche formelle dans la pratique? J'aimerais entendre quelques suggestions.

4voto

sholsapp Points 2915

Vous pouvez étudier purement fonctionnels langages comme Haskell, qui sont utilisés lors de l'un de vos exigences est provability.

C' est un plaisir de lire si vous êtes intéressés au sujet des langages de programmation fonctionnelle pure et langages de programmation fonctionnelle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X