22.08.2013 Aufrufe

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung”

MEHR ANZEIGEN
WENIGER ANZEIGEN

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.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!