<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Future_%28Programmierung%29</id>
	<title>Future (Programmierung) - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Future_%28Programmierung%29"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Future_(Programmierung)&amp;action=history"/>
	<updated>2026-05-30T05:58:00Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Future_(Programmierung)&amp;diff=426769&amp;oldid=prev</id>
		<title>imported&gt;InkoBot: Bot: Ersetze hartkodierte Farbangabe durch Farbklasse</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Future_(Programmierung)&amp;diff=426769&amp;oldid=prev"/>
		<updated>2025-03-06T17:44:16Z</updated>

		<summary type="html">&lt;p&gt;Bot: Ersetze hartkodierte Farbangabe durch Farbklasse&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Ein &amp;#039;&amp;#039;&amp;#039;Future&amp;#039;&amp;#039;&amp;#039; ([[Englische Sprache|engl.]] ‚Zukunft‘) oder ein &amp;#039;&amp;#039;&amp;#039;Promise&amp;#039;&amp;#039;&amp;#039; (engl. ‚Versprechen‘) bezeichnet in der [[Programmierung]] einen Platzhalter (&amp;#039;&amp;#039;[[Stellvertreter (Entwurfsmuster)|Proxy]]&amp;#039;&amp;#039;) für ein Ergebnis, das noch nicht bekannt ist, meist weil seine Berechnung noch nicht abgeschlossen ist.&lt;br /&gt;
&lt;br /&gt;
Ein Future ist meist das Ergebnis eines [[Asynchrone Kommunikation|asynchronen]] Aufrufs einer Funktion oder einer Methode und kann verwendet werden, um auf das Ergebnis zuzugreifen, sobald es verfügbar ist. Diese Art der Programmierung erlaubt eine weitgehend transparente [[Parallele Programmierung|Parallelisierung]] [[Nebenläufigkeit|nebenläufiger]] [[Prozess (Informatik)|Prozesse]]. Das Konzept der Futures wurde 1977 in einem Artikel von [[Henry G. Baker]] und [[Carl Hewitt]] vorgestellt.&lt;br /&gt;
&lt;br /&gt;
Eine zentrale Idee der Programmierung mit Futures ist, dass Futures als Argumente an andere Prozeduraufrufe weitergereicht werden können. Die Auswertung dieses Aufrufs kann dann schon beginnen, bevor das Ergebnis des Futures selbst verfügbar ist. Das erlaubt ein maximales Maß an Parallelismus. Erfolgt der neue Aufruf wiederum asynchron, so spricht man auch von &amp;#039;&amp;#039;Pipelining&amp;#039;&amp;#039; der Futures. Pipelining kann insbesondere in verteilten Anwendungen benutzt werden, um die Latenzzeiten von [[Interprozesskommunikation]] zu minimieren.&lt;br /&gt;
&lt;br /&gt;
== Funktion ==&lt;br /&gt;
Futures sind ein Konstrukt zur asynchronen [[Interprozesskommunikation]]. Konzeptionell bietet ein Future eine &amp;#039;&amp;#039;get&amp;#039;&amp;#039;- oder &amp;#039;&amp;#039;join&amp;#039;&amp;#039;-Funktion, die so lange blockiert, bis das Ergebnis vorliegt, und dieses dann zurückliefert. Je nach Implementierung kann die Wartezeit mittels [[Timeout (Netzwerktechnik)|Timeout]] beschränkt werden oder durch zusätzliche Funktionen eine Abfrage des aktuellen Status erfolgen.&lt;br /&gt;
&lt;br /&gt;
Sind Futures direkt in die [[Programmiersprache]] integriert, so ist häufig nur ein &amp;#039;&amp;#039;asynchroner [[Zuweisung]]soperator&amp;#039;&amp;#039; definiert, zum Beispiel &amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;x @= &amp;#039;&amp;#039;Ausdruck&amp;#039;&amp;#039;&amp;lt;/span&amp;gt; in &amp;#039;&amp;#039;[[Flow Java]]&amp;#039;&amp;#039;, einer an [[Java (Programmiersprache)|Java]] angelehnten experimentellen Programmiersprache. Dies bedeutet: Starte einen Prozess zum Berechnen des Ausdrucks, der rechts des Operators steht, und weise der Variable &amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;x&amp;lt;/span&amp;gt; ein Future für das Ergebnis zu. Wird danach auf die Variable &amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;x&amp;lt;/span&amp;gt; zugegriffen, so wird an dieser Stelle so lange gewartet, bis das Ergebnis vorliegt.&lt;br /&gt;
&lt;br /&gt;
Programmiersprachen und [[Programmbibliothek]]en, die &amp;#039;&amp;#039;Futures&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;Promises&amp;#039;&amp;#039; unterstützen sind [[CORBA]] (mit &amp;#039;&amp;#039;Asynchronous Method Invocation (AMI)&amp;#039;&amp;#039;), und – ab Version 5 – [[Java (Programmiersprache)|Java]] mittels &amp;#039;&amp;#039;Concurrency Utilities&amp;#039;&amp;#039;, einer Klassenbibliothek für Nebenläufigkeit. [[JavaScript]] stellt diese Konstrukte seit [[ECMAScript]] 6 bereit (wenngleich derzeit noch in eingeschränkter Form.)&amp;lt;ref&amp;gt;{{Internetquelle |url=https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise |titel=Promise |werk=MDN |hrsg=Mozilla Foundation |zugriff=2014-10-31 |sprache=en}}&amp;lt;/ref&amp;gt; [[Rust (Programmiersprache)|Rust]] stellt ebenfalls &amp;#039;&amp;#039;Futures&amp;#039;&amp;#039; zur Verfügung. Auch für [[C++]] stehen verschiedene Bibliotheken zur Verfügung, die wohl bekannteste von ihnen ist [[Boost (C++-Bibliothek)|Boost]]. Im Standard [[C++11]] sind Nebenläufigkeit und Futures ebenfalls in der [[C++-Standardbibliothek|Standardbibliothek]] verfügbar. Weitere Programmiersprachen mit Unterstützung für &amp;#039;&amp;#039;Futures&amp;#039;&amp;#039; und &amp;#039;&amp;#039;Promises&amp;#039;&amp;#039; sind [[io (Programmiersprache)|Io]], [[Oz (Programmiersprache)|Oz]], [[Scheme]], [[Smalltalk (Programmiersprache)|Smalltalk]] und [[Scala (Programmiersprache)|Scala]].&lt;br /&gt;
&lt;br /&gt;
In [[C-Sharp|C# 5.0]] und [[Visual Basic .NET|Visual Basic 2013]] werden Futures über async und await implizit verwendet.&amp;lt;ref&amp;gt;{{Internetquelle |url=http://msdn.microsoft.com/en-us/library/windows/apps/hh464924.aspx |titel=Asynchronous programming (Windows Store apps) |werk=MSDN |hrsg=Microsoft |zugriff=2014-02-22 |sprache=en}}&amp;lt;/ref&amp;gt; Eine entsprechende Future-Klasse ist hierbei in den [[Parallel Extensions]] definiert und kann somit auch in älteren Versionen und anderen Programmiersprachen verwendet werden. Eine solche kann bei Bedarf allerdings auch selbst implementiert werden.&amp;lt;ref&amp;gt;{{Internetquelle |url=http://msdn.microsoft.com/en-us/library/ff963556.aspx |titel=Futures |werk=MSDN, Parallel Programming with Microsoft .NET |sprache=en |hrsg=Microsoft |zugriff=2014-02-22}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{Internetquelle |url=http://dvanderboom.wordpress.com/2008/07/03/concurrency-with-futures/ |titel=Concurrency &amp;amp; Coordination With Futures in C# |autor=Dan Vanderboom |datum=2008-07-03 |werk=Critical Development |zugriff=2014-02-22 |sprache=en}}&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;{{Internetquelle |url=https://bitbucket.org/mattkotsenas/c-promises/overview |werk=BitBucket |autor=Matt Kotsenas at. al. |zugriff=2014-02-23 |titel=C# Promises |sprache=en}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aufbau ==&lt;br /&gt;
Ein Future ist eine [[Monade (Informatik)|Monade]] mit einem zugehörigen [[Resolver (Informatik)|Resolver]], welcher dem Future einen Wert zuweist. Das Future kann sich in einem von drei Zuständen befinden:&lt;br /&gt;
* erfüllt (englisch: &amp;#039;&amp;#039;{{lang|en|promise kept}}&amp;#039;&amp;#039;)&lt;br /&gt;
* gebrochen (englisch: &amp;#039;&amp;#039;{{lang|en|promise broken}}&amp;#039;&amp;#039;)&lt;br /&gt;
* wartend (englisch: &amp;#039;&amp;#039;{{lang|en|promise pending}}&amp;#039;&amp;#039;)&lt;br /&gt;
Wenn der Wert vom Resolver zugewiesen und damit bekannt ist, generiert das Future ein [[Ereignis (Programmierung)|Ereignis]] für welche [[Rückruffunktion]]en registriert werden.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
Der folgende [[Pseudocode]] zeigt die Verwendung von Futures mittels des asynchronen Zuweisungsoperators &amp;lt;span style=&amp;quot;font-family:monospace;&amp;quot;&amp;gt;@=&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 var x @= berechneX();   &amp;#039;&amp;#039;// Beginne Berechnung von x&amp;#039;&amp;#039;&lt;br /&gt;
 var y @= berechneY();   &amp;#039;&amp;#039;// Beginne Berechnung von y&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 var z = berechneZ();    &amp;#039;&amp;#039;// Vollständige Berechnung von z&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
 var ergebnis= x + y + z;  &amp;#039;&amp;#039;// Benutze x, y und z.&amp;#039;&amp;#039;&lt;br /&gt;
                       &amp;#039;&amp;#039;// Hier muss dann eventuell auf die Berechnung&amp;#039;&amp;#039;&lt;br /&gt;
                       &amp;#039;&amp;#039;// von x und y gewartet werden.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Daraus ergibt sich folgende Parallelisierung:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Haupt-Thread&lt;br /&gt;
! X-Thread&lt;br /&gt;
! Y-Thread&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;starte&amp;#039;&amp;#039; berechneX()&lt;br /&gt;
| class=&amp;quot;hintergrundfarbe-basis&amp;quot; | &amp;amp;nbsp;&lt;br /&gt;
| class=&amp;quot;hintergrundfarbe-basis&amp;quot; rowspan=&amp;quot;2&amp;quot; | &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;starte&amp;#039;&amp;#039; berechneY()&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; style=&amp;quot;vertical-align:center;&amp;quot; | berechneX()&lt;br /&gt;
|-&lt;br /&gt;
| berechneZ()&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; style=&amp;quot;vertical-align:center;&amp;quot; | berechneY()&lt;br /&gt;
|-&lt;br /&gt;
| class=&amp;quot;hintergrundfarbe-basis&amp;quot; rowspan=&amp;quot;2&amp;quot; | &amp;#039;&amp;#039;warte&amp;#039;&amp;#039; auf x und y&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;2&amp;quot; class=&amp;quot;hintergrundfarbe-basis&amp;quot; | &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| berechne ergebnis&lt;br /&gt;
| class=&amp;quot;hintergrundfarbe-basis&amp;quot; | &amp;amp;nbsp;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Aufteilung der Berechnung auf mehrere [[Thread (Informatik)|Threads]] kann Berechnungen deutlich beschleunigen, wenn mehrere [[Hauptprozessor]]en (oder [[Prozessorkern]]e) zur Verfügung stehen, oder wenn die einzelnen Berechnungen den Hauptprozessor nicht auslasten, weil sie etwa viel Zeit mit dem Warten auf [[Peripheriegerät]]e verbringen.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
*Henry G. Baker and Carl Hewitt: &amp;#039;&amp;#039;The Incremental Garbage Collection of Processes.&amp;#039;&amp;#039; Proceeding of the Symposium on Artificial Intelligence Programming Languages. SIGPLAN Notices 12. August 1977.&lt;br /&gt;
*Henry Lieberman: &amp;#039;&amp;#039;Thinking About Lots of Things at Once without Getting Confused: Parallelism in Act 1.&amp;#039;&amp;#039; MIT AI memo 626. Mai 1981.&lt;br /&gt;
*Henry Lieberman: &amp;#039;&amp;#039;A Preview of Act 1.&amp;#039;&amp;#039; MIT AI memo 625. Juni 1981.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [http://c2.com/cgi/wiki?PromisePipelining PromisePipelining] auf dem [http://c2.com/cgi/wiki?FrontPage C2 wiki] (englisch)&lt;br /&gt;
* {{Internetquelle |url=http://channel9.msdn.com/Shows/Going+Deep/Hewitt-Meijer-and-Szyperski-The-Actor-Model-everything-you-wanted-to-know-but-were-afraid-to-ask |titel=Hewitt, Meijer and Szyperski: The Actor Model (everything you wanted to know, but were afraid to ask) |datum=2012-04-09 |autor=[[Carl Hewitt]], [[Erik Meijer (Informatiker)|Erik Meijer]], [[Clemens Szyperski]] |zugriff=2014-02-22 |sprache=en |hrsg=Microsoft |werk=Channel 9}}&lt;br /&gt;
* {{YouTube | id=w9hHHvhZ_HY | title=Vortrag von Mark S. Miller: &amp;#039;&amp;#039;Secure Distributed Programming with Object-capabilities in JavaScript&amp;#039;&amp;#039;}} (englisch)&lt;br /&gt;
* {{YouTube | id=oBqeDYETXME | title=Vortrag von Mark S. Miller: &amp;#039;&amp;#039;Bringing Object-orientation to Security Programming&amp;#039;&amp;#039;}} (englisch)&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Parallelverarbeitung]]&lt;br /&gt;
[[Kategorie:Entwurfsmuster]]&lt;/div&gt;</summary>
		<author><name>imported&gt;InkoBot</name></author>
	</entry>
</feed>