08.10.2013 Aufrufe

Download (1405Kb)

Download (1405Kb)

Download (1405Kb)

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

50 KAPITEL 4. DIE STANDARDSEMANTIKEN<br />

Übereinstimmung werden in [Manna74], [Vui74], [Vui74b], [Nivat75], [Dow&Se76], [Ber&Lévy77],<br />

[ADJ77], [Gue81], [Loe&Sie87], [Cou90], [Ind93] und [Ind94] untersucht.<br />

Da unsere Programme mit Pattern aufgrund der Pattern auf den linken Regelseiten keine Funktionsschemata<br />

sind, greifen wir bei den Reduktionssemantiken, wir wir schon gesehen haben,<br />

hauptsächlich auf den Kalkül der Termersetzungssysteme zurück. Schon [O’Do77] verwendet Termersetzungssysteme<br />

als Grundlage operationeller Semantiken funktionaler Programmiersprachen.<br />

Aus den beiden Blickwinkeln — der Funktionsschemata und der Termersetzungssysteme — ergeben<br />

sich widersprüchliche Einordnungen der Hilfsfunktionen der Programme mit Hilfsfunktionen.<br />

Aus Sicht der Funktionsschemata sind sie — da unabhängig vom konkreten Programm — Teil<br />

des Basisdatentyps und damit den Konstruktoren gleichgestellt. Andererseits existieren für sie Termersetzungsregeln<br />

genauso wie für die übrigen Funktionen, und beide werden bei der Reduktion<br />

gleich behandelt. Da wir der Einfachheit halber meistens Programme mit Hilfsfunktionen als spezielle<br />

Programme mit Pattern auffassen, neigen wir mehr dem letzteren Standpunkt zu. Wir wollen<br />

trotzdem nicht vergessen, daß Hilfsoperationen eine Sonderstellung zwischen den Konstruktoroperationen<br />

und den Funktionsoperationen einnehmen.<br />

Schließlich wollen wir noch auf die Beziehung zu algebraischen Spezifikationen hinweisen, für die<br />

[Wir90] eine ausführliche Übersicht darstellt, und die in [Broy&Wir82], [Broy&Wir83], [Gut77],<br />

[Gut&Hor78] und [Thiel84] behandelt werden. Unsere Programme sind ausführbare Spezifikationen.<br />

Daher übernehmen wir von algebraischen Spezifikationen den Standpunkt, ein Programm als<br />

die Spezifikation eines Datentyps, einer Algebra aufzufassen. Der Kalkül der Funktionsschemata<br />

verwendet nämlich nur die Operation eines ausgezeichneten Funktionssymbols als Semantik, wie<br />

wir schon in der Einleitung erwähnten. Die hierarchische Spezifikation eines Datentyps auf der<br />

Grundlage eines anderen Basisdatentyps ist eines der Hauptanliegen der Theorie der algebraischen<br />

Spezifikationen. In Kapitel 6 werden wir unsere Semantiken noch einmal vom Standpunkt der<br />

algebraischen Spezifikationen betrachten und untersuchen.<br />

Nach unseren Überlegungen zur Semantik unserer Programme in 3.3 sind wir jetzt auf der Suche<br />

nach (invarianten) Grundtermsemantiken für unsere Programme, insbesondere solchen, die<br />

auf (deterministischen) Reduktionsstrategien beruhen. Im Zusammenhang mit höheren Programmiersprachen<br />

fällt oft der Begriff des Auswertungsmechanismus. Dieser beschreibt, wie in einer<br />

höheren Programmiersprache die Parameterübergabe an Funktionen oder Prozeduren erfolgt. Für<br />

funktionale Programmiersprachen sind die beiden unterschiedlichen Auswertungsmechanismen<br />

call-by-value (cbv) und call-by-name (cbn) bekannt, und sie stehen in engem Zusammenhang<br />

mit bestimmten Reduktionsstrategien.<br />

Der cbv-Auswertungsmechanismus wertet erst die Argumente einer Funktion vollständig aus, bevor<br />

die Funktion selber ausgeführt wird. Dies ist der Auswertungsmechanismus der meisten imperativen<br />

Programmiersprachen. Dagegen erfolgt bei dem cbn-Auswertungsmechanismus der Funktionsaufruf<br />

direkt; die unausgewerteten Argumente werden in den Funktionskörper hineinkopiert.<br />

Die Argumente werden erst ausgewertet, wenn sie wirklich benötigt werden. Das folgende Beispiel<br />

verdeutlicht die beiden Auswertungsmechanismen.<br />

Beispiel 4.1 Call-by-value und call-by-name<br />

Call-by-value Auswertung:<br />

head(liste1) −−→<br />

P<br />

liste1 → []:liste1<br />

head(x:xs) → x<br />

head([] : liste1) −−→<br />

P<br />

head([] : [] : liste1) −−→<br />

P<br />

. . .

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!