Closure (Funktion)
In der Informatik ist eine Schließung eine Funktion, die eine eigene Umgebung hat. In dieser Umgebung gibt es mindestens eine gebundene Variable (ein Name, der einen Wert hat, z.B. eine Zahl). Die Umgebung der Schließung hält die gebundenen Variablen zwischen den Verwendungen der Schließung im Speicher.
Peter J. Landin gab dieser Idee 1964 die Namensschließung. Die Programmiersprache Scheme machte Schließungen nach 1975 populär. Viele Programmiersprachen, die nach dieser Zeit entwickelt wurden, haben Schließungen.
Anonyme Funktionen (Funktionen ohne Namen) werden manchmal fälschlicherweise als Schließungen bezeichnet. Die meisten Sprachen, die anonyme Funktionen haben, haben auch Schließungen. Eine anonyme Funktion ist auch eine Schließung, wenn sie eine eigene Umgebung mit mindestens einer gebundenen Variablen hat. Eine anonyme Funktion ohne eigene Umgebung ist keine Schließung. Eine benannte Schließung ist keine anonyme Schließung.
Verschlüsse und erstklassige Funktionen
Werte können Zahlen oder eine andere Art von Daten sein, wie z.B. Buchstaben, oder Datenstrukturen, die aus einfacheren Teilen bestehen. In den Regeln einer Programmiersprache sind die erstklassigen Werte Werte, die an Funktionen gegeben, von Funktionen zurückgegeben und an einen Variablennamen gebunden werden können. Funktionen, die andere Funktionen annehmen oder zurückgeben, werden als Funktionen höherer Ordnung bezeichnet. Die meisten Sprachen, die Funktionen als erstklassige Werte haben, haben auch Funktionen und Schließungen höherer Ordnung.
Sehen Sie sich zum Beispiel die folgende Schemafunktion an:
In diesem Beispiel ist
der Lambda-Ausdruck (Lambda (Buch) (>= (Buch-Verkaufs-Buch)-Schwelle))
Teil der Funktion Bestseller-Bücher.
Wenn die Funktion ausgeführt wird, muss Scheme den Wert des Lambda machen. Dies geschieht, indem es einen Abschluss mit dem Code für das Lambda und einen Verweis auf die Schwellenwertvariable macht, die eine freie Variable innerhalb des Lambda ist. (Eine freie Variable ist ein Name, der nicht an einen Wert gebunden ist).
Die Filterfunktion führt dann den Abschluss für jedes Buch in der Liste aus, um die Bücher auszuwählen, die zurückgegeben werden sollen. Da der Abschluss selbst einen Verweis auf einen Schwellenwert
hat, kann der Abschluss diesen Wert jedes Mal verwenden, wenn der Filter
den Abschluss ausführt. Die Filterfunktion
selbst kann in eine völlig separate Datei geschrieben werden.
Hier ist das gleiche Beispiel in ECMAScript (JavaScript) umgeschrieben, einer anderen populären Sprache mit Unterstützung für Schließungen:
ECMAScript verwendet hier das Wort function anstelle von lambda
und die Methode Array.filter anstelle der
Filterfunktion, aber ansonsten macht der Code das Gleiche auf die gleiche Weise.
Eine Funktion kann einen Abschluss erstellen und zurückgeben. Das folgende Beispiel ist eine Funktion, die eine Funktion zurückgibt.
Im Schema:
In ECMAScript:
Die Abschlussumgebung behält die gebundenen Variablen f
und dx
bei, nachdem die umschließende Funktion (Ableitung
) zurückgekehrt ist. In Sprachen ohne Closures würden diese Werte verloren gehen, nachdem die umschließende Funktion zurückkehrt. In Sprachen mit Closures muss eine gebundene Variable so lange im Speicher gehalten werden, wie jede Closure-Funktion sie hat.
Eine Schließung muss nicht durch eine anonyme Funktion gebildet werden. Die Programmiersprache Python beispielsweise unterstützt anonyme Funktionen nur begrenzt, verfügt aber über Abschlüsse. Eine Möglichkeit, das obige ECMAScript-Beispiel in Python zu implementieren, wäre zum Beispiel
In diesem Beispiel bildet die Funktion namens Gradient zusammen mit den Variablen f und dx einen Abschluss. Die äußere umschließende Funktion namens Ableitung gibt diese Schließung zurück. In diesem Fall würde auch eine anonyme Funktion funktionieren.
Python muss stattdessen oft benannte Funktionen verwenden, weil seine Lambda-Ausdrücke nur andere Ausdrücke (Code, der einen Wert zurückgibt) und keine Anweisungen (Code, der Effekte, aber keinen Wert hat) enthalten dürfen. In anderen Sprachen, wie z.B. Scheme, gibt jedoch jeder Code einen Wert zurück; in Scheme ist alles ein Ausdruck.
Verwendung von Verschlüssen
Verschlüsse haben viele Verwendungsmöglichkeiten:
- Entwickler von Software-Bibliotheken können den Benutzern die Möglichkeit geben, das Verhalten anzupassen, indem sie Schließungen als Argumente an wichtige Funktionen übergeben. Beispielsweise kann eine Funktion, die Werte sortiert, ein Schließungsargument akzeptieren, das die zu sortierenden Werte nach einem benutzerdefinierten Kriterium vergleicht.
- Da Schließungen die Auswertung verzögern, d.h. sie "tun" nichts, bis sie aufgerufen werden, können sie zur Definition von Kontrollstrukturen verwendet werden. Beispielsweise werden alle Standard-Kontrollstrukturen von Smalltalk, einschließlich Verzweigungen (if/then/else) und Schleifen (while und for), mit Objekten definiert, deren Methoden Schließungen akzeptieren. Benutzer können problemlos auch ihre eigenen Kontrollstrukturen definieren.
- Es können mehrere Funktionen erzeugt werden, die sich über der gleichen Umgebung schließen, so dass sie privat kommunizieren können, indem sie diese Umgebung verändern (in Sprachen, die eine Zuweisung ermöglichen).
Im Schema
- Verschlüsse können zur Implementierung von Objektsystemen verwendet werden.
Hinweis: Einige Referenten bezeichnen jede Datenstruktur, die eine lexikalische Umgebung bindet, als Abschluss, aber der Begriff bezieht sich in der Regel speziell auf Funktionen.
Fragen und Antworten
F: Was ist ein Abschluss in der Informatik?
A: Ein Closure ist eine Funktion, die eine eigene Umgebung hat.
F: Was enthält die Umgebung einer Closure?
A: Die Umgebung einer Closure enthält mindestens eine gebundene Variable.
F: Wer gab der Idee der Closure ihren Namen?
A: Peter J. Landin gab dem Konzept der Closures 1964 seinen Namen.
F: Welche Programmiersprache hat Closures nach 1975 populär gemacht?
A: Die Programmiersprache Scheme hat Closures nach 1975 populär gemacht.
F: Sind anonyme Funktionen und Closures das Gleiche?
A: Anonyme Funktionen werden manchmal fälschlicherweise als Closures bezeichnet, aber nicht alle anonymen Funktionen sind Closures.
F: Was macht eine anonyme Funktion zu einer Closure?
A: Eine anonyme Funktion ist eine Closure, wenn sie eine eigene Umgebung mit mindestens einer gebundenen Variablen hat.
F: Ist eine benannte Schließung anonym?
A: Nein, eine benannte Schließung ist nicht anonym.