I/O mit unique types in Clean



next up previous
Next: Monadisches I/O Up: Exkurs: I/O in Previous: I/O als Dialog

I/O mit unique types in Clean

Für die Programmiersprache Clean [NSvP91] wurde eine andere Methode zur Einbindung von I/O Operationen in das funktionale Paradigma gewählt. Der Grundgedanke hierbei ist: wird eine I/O Operation als Funktion betrachtet, so hängt ihr Wert neben den offensichtlichen explizit angegebenen Argumenten (wie zB den Dateinamen der zu lesenden Datei) auch noch von dem Status des gesammten I/O Systems ab. Dieser wird als Umgebung bezeichnet. Die Umgebung mujetzt den I/O Funktionen als Parameter übergeben werden. Der Wert einer I/O Funktion ist dann eine neue Umgebung.
Ein Clean-Programm ist eine Funktion vom Typ WORLD -> WORLD wobei WORLD gerade eine Umgebung beschreibt. Der Typ WORLD ist dabei noch strukturiert in eine Events-Umgebung (die den Status von Tastatur, Maus etc angibt) und eine Files-Umgebung, welche wiederum in einzelne files strukturiert ist. Diese Umgebungen können mit vordefinierten Funktionen aus einer WORLD geöffnet werden, dann als Parameter zu I/O-Zwecken gebraucht werden und schliewieder im veränderten Status geschlossen werden.
Mit diesem Prinzip des enviroment passings ist das Problem der referentiellen Transparenz gelöst.
Es mujetzt noch die Sequenzialisierung der einzelnen I/O Operationen sichergestellt werden. Wird dieses nicht, so kann es im Ausdruck
F file -> (FWriteC 'a' file, FWriteC 'b' file);
dazu führen, dader erste oder der zweite Teil des Ergebnispaares zuerst evaluiert wird, was dann zu unterschiedlichen Ergebnissen führte, aber beides nicht zu dem wahrscheinlich erwarteten zwei verschiedenen files in dem Ergebnispaar.
Das Problem ist hier, daauch eine Datei nur einmal in der Umgebung vorhanden ist und, wenn sie denn mehrfach in einem Ausdruck gebraucht wird, geshared auf dieselbe Datei verwiesen wird. Ein Objekt, auf dem destruktive Updates gemacht werden, darf aber nicht gemeinsam genutzt werden. Um dieses zu unterbinden wurde in Clean das Konzept der unique types[] eingeführt. Man kann beliebige Typen als unique erklären, womit man ausdrückt, daein Objekt dieses Types nur einmal zur Zeit referenziert werden darf. Funktionen, die wie FWriteC destruktiv ein Objekt verändern, müssen von diesem Objekt einen als unique erklärten Typ verlangen.
Um nun den korrekten Gebrauch von unique attributierten Objekten zu gewährleisten, ist im Kompilierer noch ein weiterer Test eingebaut, der kontrolliert, dain keiner Funktion ein unique attributiertes Objekt mehrfach referenziert wird.
Das Konzept der unique types soll verwandt sein mit den linear types auf Lambda-Ausdrücken. []
Als Kritik an dem Konzept in Clean wird angeführt, dain Kompilierern bereits benutzte Codeoptimierungsverfahren eine weiterhin konsisternte Bernutzung der unique attributierten Objekte nicht gewährleisten.


next up previous
Next: Monadisches I/O Up: Exkurs: I/O in Previous: I/O als Dialog



Sven Eric Panitz
Mi., 01. Nov. 1995, 12:12:54