22.08.2013 Aufrufe

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

einen Rechner überprüft werden kann. 11 Beweisen ist <strong>der</strong>zeit jedoch noch sehr kostspielig, da es – wie für<br />

die Erzeugung von Implementierungen – keine allgemeingültigen Verfahren gibt, mit denen Beweise durchgeführt<br />

werden können (dies ist schon ist aus theoretischen Gründen grundsätzlich unmöglich). Auch mangelt<br />

es an Werkzeugen, die eine präzise Beweisführung angemessen unterstützen. Bisher erfor<strong>der</strong>t es immer noch<br />

eine Menge Training und einen hohen intellektuellen Aufwand, <strong>der</strong> für manche Produkte einfach zu teuer<br />

ist. Trotzdem sollte man immer wie<strong>der</strong> versuchen, wenigstens die sicherheitsrelevanten Teile eines Systems zu<br />

beweisen (z.B. daß <strong>der</strong> Zugang zum Password nur in <strong>der</strong> geplanten Form möglich ist).<br />

Neben <strong>der</strong> Korrektheitsgarantie gibt es aber auch noch einen an<strong>der</strong>en Grund, Programme zu beweisen. Es<br />

ist ein Spiel von hohem intellektuellen Reiz, das zudem auch die “Ästhetik” von Algorithmen begreifbar<br />

macht. Bei guten Programmen fällt es leicht, einen Korrektheitsbeweis zu führen: die wesentlichen Ideen sind<br />

leicht zu erkennen und die Struktur ist durchschaubar. Das Führen des Beweises birgt den Schlüssel zu einem<br />

Verständnis, das weit über das “es funktioniert” hinausgeht. Wer selbst Programme beweist, beginnt die<br />

Methodik zu erfassen, die bei <strong>der</strong> Implementierung implizit im Raume stand, und wird verstehen, in welchem<br />

Rahmen sich diese Methodik auf die Lösung an<strong>der</strong>er Probleme übertragen lassen. 12 Gewöhnt man sich an,<br />

bei <strong>der</strong> Implementierung gleichzeitig auch schon an einen möglichen Korrektheitsbeweis zu denken, so wird<br />

dies die Qualität des erstellten Programms erheblich steigern. Es empfiehlt sich fast, einen Beweis simultan<br />

zu <strong>der</strong> Implementierung zu erstellen. Auf Methoden einer <strong>der</strong>artigen Form <strong>der</strong> Programmerstellung werden<br />

wir im letzten Abschnitt dieses Kapitels ein wenig eingehen.<br />

Wie bereits erwähnt, gibt es keine allgemeine Methodik des Beweisens. Wir können daher in diesem Skript<br />

nicht genau beschreiben, wie man Beweise führen kann, son<strong>der</strong>n nur einige vage Leitlinien angeben, Beweise<br />

an Beispielen demonstrieren, und versuchen, Sie dabei nicht in einer Flut von Formeln ersticken zu lassen,<br />

was wegen <strong>der</strong> Komplexität solcher Beweise lei<strong>der</strong> leicht geschieht. Wichtig ist daher, daß Sie selber Beweise<br />

entwickeln und dies an kleinen und mittleren Beispielen trainieren. Erst hierdurch kommt die oben erwähnte<br />

Ästhetik von Programmen wirklich zutage. Als weitere Anregung sind die Bücher von Dijkstra “A Discipline<br />

of Programming” [Dijkstra, 1976] und Gries “The Science of Programming” [Gries, 1981] sehr zu empfehlen.<br />

4.2.1 Korrektheit von Routinen und Klassen<br />

Zum Beweis <strong>der</strong> Korrektheit einer Routine gehen wir aus von dem vereinbarten Kontrakt, also <strong>der</strong> Vorbedingung<br />

pre, die zu Beginn des Anweisungsteils zu finden ist, und <strong>der</strong> Nachbedingung post, die am Ende<br />

Gültigkeit haben soll. Um nun nachzuweisen, daß für jede akzeptable Eingabe beim Verlassen <strong>der</strong> Routine<br />

die Nachbedingung gilt, versuchen wir, Aussagen darüber zu treffen, welcher Zustand nach je<strong>der</strong> einzelnen<br />

Anweisung erreicht ist, und dies schrittweise zu beweisen. Diese schreiben wir “zwischen” die einzelnen Anweisungen.<br />

Die Implementierung wird also ergänzt um logische Bestandteile, die nicht zur Programmiersprache<br />

Eiffel gehören. 13<br />

11 Die Realität ist lei<strong>der</strong> noch nicht soweit: Es fehlt noch an <strong>der</strong> Qualifikation <strong>der</strong> Systementwickler, Beweise mit akzeptablen<br />

Aufwand durchzuführen, an praktikablen Programmiersprachen, für die ein Beweiskalkül existiert, und schließlich an akzeptierten<br />

Beweisprüfern. Trotzdem ist das Ziel des Programmbeweisens aus gesellschaftlichen und Umwelt-Gründen notwendig.<br />

Lei<strong>der</strong> gibt ein Programmbeweis nur die Aussage, daß das Programm auf einer fiktiven mathematischen Maschine (<strong>der</strong> Semantikdefinition<br />

<strong>der</strong> Programmiersprache) korrekt läuft, aber nicht, daß sich das übersetzte Programm im Rahmen eines Betriebssystem<br />

auf einer realen Hardware sich korrekt verhält. Daher sind neben <strong>der</strong> mathematischen Methode des Programmbeweisens<br />

auch die Stichprobenverfahren <strong>der</strong> statistischen Qualitätsprüfung notwendig. Diese werden Tests genannt.<br />

Ein Beweis ohne systematisches Testen gibt keine hohe Sicherheit. Systematisches Testen allein gibt nur eine schwache Wahrscheinlichkeitsaussage<br />

über die Zuverlässigkeit. Testen ist jedoch für die an<strong>der</strong>en Qualitätsmerkmale <strong>der</strong> Angemessenheit des<br />

Produkts, wie Effizienz, Benutzerfreundlichkeit usw. unbedingt erfor<strong>der</strong>lich.<br />

12 Aus dem Versuch, Korrektheitsbeweise zu systematisieren, haben sich sogar erste Systeme ergeben, die einfache Programme<br />

automatisch aus ihren Vor- und Nachbedingungen synthetisieren können. Ohne eine Analyse von Programmen in Form eines<br />

Korrektheitsbeweises kann man eine Antwort auf die Frage “wie implementiere ich zuverlässige Programme” wohl kaum finden.<br />

13 Da <strong>der</strong> Beweis jedoch eine Aussage über das Programm ist, die nur für die Überprüfung, nicht aber für den Ablauf des<br />

Programms relevant ist, gehören diese Bestandteile nicht zum eigentlichen Programm und könnten, wenn man sie unbedingt in<br />

den Programmtext integrieren möchte, bestenfalls als Kommentare aufgenommen werden.

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!