Question

J'ai lu que le compilateur peut appliquer la dbc au moment de la compilation .. Comment le fait-il?

Était-ce utile?

La solution

Pour autant que je sache, le langage DbC statique le plus puissant qui ait été utilisé à ce jour est le numéro de spécification de Microsoft Research . Il utilise un puissant outil d'analyse statique appelé Boogie , qui utilise à son tour un puissant testeur Theorem Prover / Constraint Solver appelé < a href = "http://Research.Microsoft.Com/projects/z3/" rel = "noreferrer"> Z3 pour prouver le respect ou la violation des contrats au moment de la conception.

Si le prouveur de théorie peut prouver qu'un contrat sera toujours violé, il s'agit d'une erreur de compilation. Si le prouveur de théorie peut prouver qu'un contrat ne sera jamais , il s'agit d'une optimisation: les contrôles de contrat sont supprimés de la DLL finale.

Comme le souligne Charlie Martin, prouver les contrats en général équivaut à résoudre le problème de l'arrêt du processus et n'est donc pas possible. Il y aura donc beaucoup de cas où le prouveur de théorème ne pourra ni prouver ni infirmer le contrat. Dans ce cas, une vérification à l'exécution est émise, comme dans d'autres systèmes de contrat moins puissants.

Veuillez noter que Spec # n'est plus en cours de développement. Le moteur de contrat a été extrait dans une bibliothèque appelée Contrats de code pour .NET , qui en fera partie. de .NET 4.0 / Visual Studio 2010. Toutefois, les contrats ne prendront en charge aucune langue.

Autres conseils

Le compilateur peut utiliser la l'analyse statique pour examiner votre programme et déterminer s'il le fait. bonne chose. Comme exemple simple, le code suivant peut essayer de prendre la racine carrée d’un nombre négatif (C ++):

double x;
cin >> x;
cout << sqrt(x) << endl;

Si le compilateur sait que sqrt ne doit jamais être appelé avec un nombre négatif, il peut signaler ce problème en tant que problème car il sait que la lecture à partir de l'entrée utilisateur pourrait renvoyer un nombre négatif. Par contre, si vous faites cela:

double x;
cin >> x;
if (x >= 0) {
    cout << sqrt(x) << endl;
} else {
    cout << "Can't take square root of negative number" << endl;
}

alors le compilateur peut dire que ce code n'appellera jamais sqrt avec un nombre négatif.

Design by Contract est un terme très abstrait, car il peut exister de nombreux formalismes de spécification avec différents pouvoirs d’expression. De plus, il existe actuellement une limite aux capacités d'analyse statique pour vérifier et appliquer les spécifications. C'est l'un des domaines de recherche universitaire et industrielle les plus actifs en informatique.

En pratique, vous utiliserez probablement un sous-ensemble de contrats et de vérifications, qui dépend de la langue que vous utilisez et des plug-ins ou programmes que vous installez.

En règle générale, l'analyse statique tente de créer un modèle de contrat et un modèle du programme réel, puis de les comparer. Par exemple, si le contrat ne vous permet pas d'appeler une fonction lorsqu'un objet se trouve dans l'état S, il tentera de déterminer si, dans une séquence d'appels, vous pouvez vous retrouver dans l'état S.

Quel compilateur et quelle langue? Eiffel peut le faire dans une certaine mesure. Mais rappelez-vous que pour appliquer complètement la conception par contrat, il faudrait pouvoir résoudre le problème de l'arrêt (preuve: supposons que vous disposiez d'un compilateur capable de le faire. Ensuite, le compilateur devrait pouvoir identifier une fonction arbitraire avec une vraie condition de sortie qui ne peut pas atteindre la condition de sortie à cause d'une boucle infinie ou d'une récursion infinie. Elle se réduit donc à un arrêt.)

On entend généralement par là que si vous avez un appel

  foo(a);

et ailleurs, définissez

  function foo(a:int) is
     assert 0 < a && a < 128
     ...
  end

alors le compilateur peut vérifier que a va effectivement être dans l'intervalle ouvert (0..128).

Certaines langues telles que le D ont un temps de compilation raisonnablement puissant et une vérification des conditions de temps de compilation (pour D assert statique (boolCond, msg); , IIRC C / C ++ peut utiliser #if et pragma ou #error )

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top