Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung”
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Simple string ::= " [ Nonempty String ]" Siehe Abschnitt 3.11.1<br />
Nonempty String ::= ASCII [ Nonempty String ]<br />
Digits ::= Digit [ Digits ]<br />
ASCII ::= Alle ASCII Symbole<br />
Letter ::= A | ... | Z | a | ... | z<br />
Digit ::= 0 | ... | 9<br />
4.4.7 Diskussion<br />
Mit den Ausdrücken sind wir auf dem niedrigsten Niveau <strong>der</strong> Sprache Eiffel angelangt. Unter diesem gibt es<br />
nur noch das Niveau von Sprachen, denen nicht einmal die meisten arithmetischen Operationen bekannt sind,<br />
und die noch näher an den wirklichen Fähigkeiten <strong>der</strong> Prozessoren orientiert sind. Diese Assemblersprachen<br />
sind einer <strong>der</strong> Schwerpunkte des zweiten Semesters.<br />
4.5 Systematische Implementierung von Routinen<br />
Bisher haben wir uns im wesentlichen mit den Sprachkonzepten, ihrem Verwendungszweck und den zugehörigen<br />
Verifikationsregeln befaßt und an Beispielen illustriert, wie man Programme nachträglich verifizieren kann.<br />
In den Beispielen 4.3.8 und 4.3.9 auf Seite 156 bzw. 161 haben wir versucht, die Implementierung einer einfachen<br />
Routine mit den besprochenen Hilfsmitteln systematisch zu entwickeln, um so den Korrektheitsbeweis<br />
zu erleichtern.<br />
Wir haben in diesen Beispielen bereits implizit eine Reihe von Prinzipien und Methoden angewandt, die auf<br />
Grundgedanken <strong>der</strong> Programmiermethodologie zurückgehen – allerdings ohne sie beson<strong>der</strong>s hervorzuheben.<br />
Wir wollen dies zum Abschluß dieses Semesters nachholen und kurz einige <strong>der</strong> wichtigsten Grundsätze <strong>der</strong><br />
systematischen Programmierung 43 ansprechen. Ausführlichere Abhandlungen zu diesem Thema findet man<br />
in [Dijkstra, 1976, Gries, 1981]. Für Interessierte beson<strong>der</strong>s zu empfehlen ist [Gries, 1981, Kapitel 13-18], wo<br />
man neben einer exzellenten Erklärung auch eine Vielfalt von Beispielen finden kann.<br />
4.5.1 Allgemeine Prinzipien<br />
Eines <strong>der</strong> größten Probleme bei <strong>der</strong> Programmierung ist, daß viele Programmierer keine klare Vorstellung<br />
davon haben, was Korrektheit wirklich bedeutet und wie man beweisen kann, daß ein Programm tatsächlich<br />
korrekt ist. Das Wort “Beweis” hat für die meisten einen unangenehmen Beigeschmack, bedeutet aber zunächst<br />
einmal nicht mehr als ein Argument, das den Leser von <strong>der</strong> Wahrheit eines Sachverhalts überzeugt. Dies<br />
verlangt im Prinzip we<strong>der</strong> einen Formalismus noch eine mathematischen Vorgehensweise. Daß die <strong>der</strong>zeit<br />
vorherrschende Methode, sich von <strong>der</strong> Korrektheit eines Programms zu überzeugen, jedoch unzureichend<br />
ist, zeigt die Tatsache, daß Programmierer einen Großteil ihrer Zeit damit zu verbringen, Fehler aus ihren<br />
Programmen zu eliminieren – und dies, obwohl sie von <strong>der</strong> Richtigkeit ihrer Ideen überzeugt waren.<br />
Ein Teil dieses Problems liegt darin begründet, daß Spezifikationen von Programmen oft zu wenig präzisiert<br />
werden und deshalb <strong>der</strong> Korrektheitsbegriff unklar bleibt. Ein zweiter Grund ist, daß Programmierer zu<br />
wenig mit Methoden vertraut sind, die – wie <strong>der</strong> in Abschnitt 4.2 und 4.3 vorgestellte Kalkül – eine präzise<br />
Beweisführung unterstützen und we<strong>der</strong> formale noch informale mathematische Beweise führen können.<br />
Gute und korrekte Programme können jedoch nur auf <strong>der</strong> Basis eines durch Vor- und Nachbedingungen<br />
geschlossenen Vertrages implementiert werden, wobei die Entwicklung <strong>der</strong> Implementierung niemals losgelöst<br />
von <strong>der</strong> Formulierung einer Beweisidee geschehen darf. Es ist einfach zu schwer, ein bereits existierendes<br />
43 Wenn im folgenden von Programmierung die Rede ist, dann ist mehr die Implementierung von Routinen gemeint und weniger<br />
<strong>der</strong> Entwurf <strong>der</strong> Klassenstruktur, den wir in Sektion 4.1 besprochen hatten.