Prozeduraufrufe
Vorgänge
Es ist eine Tatsache der Erfahrung, daß in der Welt etwas passiert. Veränderungen gehen im Laufe der Zeit vor sich.
Eine einzelne Veränderung, ein bestimmter Ablauf, wird Vorgang oder Prozeß genannt. Wichtig ist, daß eindeutig bestimmt und abgegrenzt ist, welcher Vorgang gemeint ist.
Der Start der Apollo 11 begann beispielsweise am 20. Juli 1969 um 8.32 EST und endete einige Minuten später mit dem Eintritt in die Erdumlaufbahn. Dies war ein ganz bestimmter Vorgang.
Operationen
Verschiedene Vorgänge können Gemeinsamkeiten haben.
Der Start der Apollo 10 begann am 18. Mai 1969 um 11.49 EST. Es ist offensichtlich ein anderer Vorgang als der Start der Apollo 11. Dennoch ist beiden Vorgängen etwas gemein: Es handelt sich um Apollo -Starts. Solch eine Klasse von Vorgängen ist eine Operation.
Eine Operation ist die Veränderung eines Zustandes nach einer bestimmten Regel. Eine Operation kann dann in mehreren Vorgängen verwirklicht (inkarniert ) werden. Ein Vorgang ist also eine einzelne Durchführung einer Operation.
Operation und Vorgang [UML, static structure diagram]
.-------------. .-------------.
| Operation | 1 * | Vorgang |
| |----------------| |
| | | |
'-------------' '-------------'
Der Start der Apollo 11 war eine Inkarnation der Operation Apollo -Start.
Eine Operation kann durch vorausgesetzte Eigenschaften ihres Vorzustandes und zugesicherte Eigenschaften des von ihr bewirkten Nachzustandes beschrieben werden.
Operation
vorausgesetzter Vorzustand vorher |
| |
V |
.---------------. |
| Operation | |
| | |
'---------------' |
| |
V |
bewirkter Nachzustand nachher V Zeit
Beim Raketenstart ist der Vorzustand unter anderem dadurch gekennzeichnet, daß die Rakete sich auf der Startrampe befindet und mit ausreichend Treibstoff betankt ist. Der bewirkte Nachzustand ist es, daß die Rakete sich in einer Erdumlaufbahn befindet. Zu Vor- und Nachzustand gehören auch Invarianten der Operation: Die oberste Stufe der Rakete soll vor wie nach dem Start intakt sein.
Anleitung
Zur Durchführung einer Operation ist ein Operationsanleitung dienlich, die erklärt, wie eine Operation durchgeführt wird. Kochrezepte sind ein Beispiel für solch eine Operationsanleitung.
Prozeduren
Eine Prozedur ist eine benannte Operationsanleitung. Sie erlaubt es also, ohne die Notwendigkeit weiterer Erklärungen nur durch Verwendung des Namens zu einer bestimmte Operation anzuleiten.
Prozedur [UML, static structure diagram]
.-------------. .-------------.
| Prozedur | 1 1 | Name |
| |<>--------| |
| | | |
| | '-------------'
| |
| | .-------------.
| | 1 1 | Operations- |
| |<>--------| anleitung |
| | | |
'-------------' '-------------'
Beim Militär verwendet man beispielsweise bestimmte Kommands, wie das Kommando „abzählen!“, um eine ganz bestimmte für dieses Kommando festgelegte Operation zu verlangen. Hierbei ist es wichtig, daß der Name „Abzählen“ einmal durch eine Anleitung für diese Operation erklärt wurde, so daß bei späterer Verwendung die Operation nicht mehr erklärt werden muß, sondern die Nennung des Namens ausreicht.
Durch die Vereinbarung des Namens „Abzählen“ für diese Operation wurde eine Prozedur geschaffen.
Durch die Verwendung des Namens „Abzählen“ durch einen Kommandierenden kann jeweils eine Durchführung dieser Operation (ein Vorgang) hervorgerufen werden.
Beispiel
- Kartoffel-Lauch-Auflauf
- Backofen, Auflaufform, 1000 g Lauch, 1000 g Kartoffeln, 200 g Schimmelkäse, 200 g Creme fraiche, Salz, Pfeffer.
- Lauch und die Kartoffeln putzen, klein schneiden, salzen, pfeffern und in die Form geben. Schimmelkäse mit Creme fraiche und Pfeffer vermischen und darüber geben. Bei 200 °C für 50 Minuten backen.
Übungsfrage Was ist der Name obenstehender Prozedur? Was ist der vorausgesetzte Vorzustand und was der bewirkte Nachzustand?
Prozeduraufrufe
Ein Befehl in einem Programm, der verlangt, daß eine bestimmte Prozedur ausgeführt wird, ist ein Prozeduraufruf. Der Aufruf einer Prozedur führt zu einer Durchführung ihrer Operation, also einem Vorgang (Prozeß).
Ein Prozeduraufruf wird in vielen Sprachen ähnlich geschrieben wie ein Funktionsausdruck. Leider führt dies dazu, daß Prozeduren und Funktionen leicht verwechselt werden können. Deshalb sollte man besonders darauf achten, den Unterschied trotzdem zu verstehen.
Soll beispielsweise die Ausgabe eines Zeilenendes ausgeführt werden, so kann dies in einigen Programmiersprachen durch die Anweisung "println();" verlangt werden.
Beispiel eines Prozeduraufrufs
println();
Dabei verlangen die runden Klammern "()" die Ausführung der zuvor angegebenen Prozedur "println" und das Semikolon ";" schließt die Anweisung ab.
Wirkprozeduren
Man kann eine Prozedur also mit der Absicht aufrufen, eine bestimmte Wirkung, eine Veränderung, hervorzurufen. Solch eine Prozedur wird Wirkprozedur oder Aktor genannt. (Andere Typen von Prozeduren werden in anderen Lektionen vorgestellt.)
Eine Funktion ließe sich für diesen Zweck nicht einsetzen, da ein Funktionsausdruck immer nur einen bestimmten Wert bezeichnet. Ein Funktionsausdruck hat aber nie eine Wirkung.
Standardprozeduren
In vielen Programmiersprachen gibt es vordefinierte Standardprozeduren. Diese kann man mit den Gerichten einer Gaststätte vergleichen, die in der Speisekarte aufgelistet sind. Der Gast weiß, daß diese Gerichte als „Standardgerichte“ verfügbar sind.
Es folgen einige Arten von Standardprozeduren:
- Prozeduren zum Ausgeben von Daten
- Prozeduren zum Sortieren von Tabellen
- Prozeduren zum Zurücksetzen von Fehlerzuständen
- Prozeduren zum Initialisieren von Pseudozufallszahlengeneratoren
- Prozeduren zum Kopieren oder Ausfüllen von Speicherbereichen
- Prozeduren zum Einstellen von Objekten
Prozeduren und Funktionen
Ein Funktionsausdruck, wie der Ausdruck "cos( 0 )", bezeichnet einen bestimmten Wert. Der Wert ist durch die Funktion "cos" und das Argument "0" bestimmt. Die Zeit spielt dabei keine Rolle. Ein Funktionsausdruck ist ein strukturierter Name für einen bestimmten Wert.
Der Ausdruck "cos( 0 )" [Kompassdiagramm]
.---------------. Funktionswert =
Argument | cos | Kosinus des Arguments
0 ------------------>| |-----------------------> 1
Gleitkommazahl '---------------' Gleitkommazahl
Im Kompaßdiagramm wird die durch eine Funktion gebildete Zuordnung waagerecht von links nach rechts geschrieben. Die Zeit kommt dabei nicht vor. Solch eine Schreibweise beschreibt also keinen zeitlichen Ablauf, sondern nur eine Beziehung zwischen verschiedenen Werten (Die Beziehung lautet in Worten: „1 ist der Kosinus von 0.“).
Ein Prozeduraufruf hingegen, wie der Aufruf "println();", bewirkt einen bestimmten Vorgang gemäß der durch den Namen der Prozedur bestimmten Operation. Eine Prozedur erledigt eine Operation und verändert dabei den Zustand von Objekten. Durch Prozeduraufrufe gestartete Vorgänge laufen in der Zeit zwischen einem „Vorher“ und einem „Nachher“ ab. Hier spielt die Zeit also eine Rolle.
Die Prozedur "println" [Kompassdiagramm]
Vorzustand: betriebsbereites Zeit
Ausgabegerät in bestimmter Zeile Z | vorher
| |
V |
.---------------. |
| println | |
| | |
'---------------' |
| |
V |
Nachzustand: betriebsbereites | nachher
Ausgabegerät am Anfang der |
nächsten Zeile (Z + 1) V
In Kompaßdiagramm wird die durch eine Prozedur bewirkte Zustandsveränderung senkrecht von oben nach unten geschrieben. Die senkrechte Richtung entspricht dabei einem zeitlichen Ablauf.
Funktionen in Sprachen der C-Familie
Verwirrenderweise werden Prozeduren in manchen Sprachen in der Form von Funktionen geschrieben. Das führt dazu, daß sie dann von vielen Programmierern auch als „Funktion“ bezeichnet werden. Dieser Text bemüht sich trotzdem um eine terminologisch klare Differenzierung zwischen den Begriffen „Prozedur“ und „Funktion“. Der Leser wird aber in anderen Texten zu solchen Sprachen feststellen, daß dort Prozeduren oft als „Funktion“ bezeichnet werden. Das liegt daran, daß bei Prozedurdefinitionen in Sprachen der C-Familie im Programmtext nicht ausdrücklich die Kennzeichnung "procedure" verwendet wird und Prozedurdefinitionen dort wie eine Funktionsdefinition geschrieben werden.
Prozeduren und Objekte
Prozeduren und Objekte treten fast immer zusammen auf. Eine Prozedur verändert in der Regel den Zustand eines Objektes in irgendeiner Weise. Objekte haben kaum Sinn, wenn es nicht irgendwelche Prozeduren gibt, die sie verändern können.
Ausdrücke in Programmen
Ein Programm einer prozeduralen Sprache besteht zunächst aus Anweisungen. Ein Prozeduraufruf kann beispielsweise eine solche Anweisung sein.
Ausdrücke sind keine Anweisung. Ausdrücke bezeichnen nur einen bestimmten Wert. Ein alleinstehender Ausdruck kann in prozeduralen Sprachen nicht verwendet werden, weil es nicht festgelegt ist, was mit dem Wert des Ausdrucks gemacht werden soll. Dies halten wir als eine wichtige Regel fest:
Ein Ausdruck tritt in prozeduralen Sprachen als Teil einer Anweisung auf, die festlegt, was mit dem Wert des Ausdrucks gemacht werden soll.
Angewendet auf Prozeduraufrufe und Funktionsausdrücke bedeutet dies, daß ein Funktionsausdruck in der Regel immer als Teil einer umfassenderen Anweisung auftritt. Ein Prozeduraufruf hingegen stellt bereits für sich alleine eine Anweisung dar. (Unter Umständen muß ihm noch eine Semikolon folgen.)