Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
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.