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.
daher nur für Beweise von Routinen benutzt werden, die keine gemeinsam genutzten Objekte verän<strong>der</strong>n, in<br />
denen also keine zwei Größen auf dasselbe Objekt verweisen (was man ggf. separat “beweist”). 17 Für die volle<br />
Referenzsemantik gibt es bis heute keine brauchbare Verifikationstechnik, da sie erheblich komplizierter ist. 18<br />
4.3 Strukturierung von Routinen<br />
Wir wollen in diesem Abschnitt nun endlich die Programmstrukturen besprechen, die Sie bei <strong>der</strong> Implementierung<br />
von Eiffel-Routinen benötigen. Wir werden dazu zunächst die einzelnen Sprachkonzepte zusammen<br />
mit den zugehörigen Verifikationsregeln, also das Handwerkzeug, vorstellen und erst im Anschluß daran eine<br />
genauere Sprachbeschreibung geben. Am Ende dieser Sektion wollen wir dann die Methodik <strong>der</strong> Implementierung<br />
und Verifikation von Routinen anhand von Beispielen illustrieren.<br />
Eiffel ist eine prozedurale Sprache, in <strong>der</strong> Daten durch Anweisungen verarbeitet werden. Die Form dieser<br />
Anweisungen ist nicht an<strong>der</strong>s als in an<strong>der</strong>en Programmiersprachen. Nur Schleifen sind etwas ungewöhnlich,<br />
da hier zusätzliche Zusicherungen eingefügt werden dürfen, die angeben, was sich während eines Schleifendurchlaufs<br />
verän<strong>der</strong>t und was nicht. Die folgenden Anweisungsarten gehören zum Sprachumfang von Eiffel<br />
• Zuweisung<br />
• Routinenaufruf (qualified call)<br />
• Zusammengesetzte Anweisungen<br />
• Bedingte Anweisung und Fallunterscheidung (if, inspect)<br />
• Schleife (loop)<br />
• Überprüfung während eines Programmablaufs (check)<br />
• Ausnahmebehandlung (rescue und retry)<br />
• Anweisungen, die nur im DEBUG Modus mitbenutzt werden (debug)<br />
4.3.1 Wertzuweisung<br />
Die Wertzuweisung haben wir bereits mehrfach benutzt, da man ohne sie kein sinnvolles Programm schreiben<br />
kann. Ein Programm in einer imperativen Sprache beschreibt eine Folge von Zustandstransformationen (o<strong>der</strong><br />
Speicherverän<strong>der</strong>ungen). Die einzige Möglichkeit, einen Zustand direkt zu verän<strong>der</strong>n, bietet die Zuweisung<br />
von Werten an einen Speicherplatz, also an eine Größe, die den Namen eines Speicherplatz kennzeichnet.<br />
Die Wertzuweisung wird immer dann benutzt, wenn ein Wert für spätere Zwecke im aktuellen Programmablauf<br />
zwischengelagert werden soll. Der Wert wird unter einem Namen im Speicher eingetragen.Sollen Werte von<br />
einem Programmablauf zum nächsten aufgehoben werden, so müssen sie auf einem externen Speicher (Platte,<br />
Diskette o<strong>der</strong> Band) ausgelagert werden. Die Syntax <strong>der</strong> Wertzuweisung ist einfach<br />
entity := Ausdruck<br />
wobei entity eine Größe (siehe Definition 3.3.3 auf Seite 73) und Ausdruck ein Ausdruck (siehe Sektion 4.4)<br />
ist. Man beachte jedoch, daß Zuweisungen an formale Routinenargumente verboten sind (dies werden wir im<br />
nächsten Abschnitt ausführlicher diskutieren).<br />
17 Zum Glück tritt <strong>der</strong> Fall, daß innerhalb einer Routine zwei Größen auf dasselbe Objekt verweisen, recht selten auf. Meist ist es<br />
so, daß verschiedene Routinen Größen benutzen, die auf ein und dasselbe Objekt referenzieren, und diese Routinen hintereinan<strong>der</strong><br />
ausgeführt werden. Dann liegt aber eine klare Trennung vor und die Verifikationsmechanismen sind wie<strong>der</strong> anwendbar.<br />
18 Es gibt den Vorschlag, jede Referenzvereinbarung vom Typ T in eine Deklaration expanded ARRAY[expanded T] zu übersetzen.<br />
Eine Erzeugung bedeutet dann ein weiteres Element in diesem Feld und eine Referenz einen Feldindex. Wir werden diesen<br />
Weg aber nicht beschreiten, da die Komplexität dieser Beweisführung weit über den Anspruch einer Einführung hinausführt.