Future パターン

future, promise, delay とは、プログラミング言語における並列処理のデザインパターン。何らかの処理を別のスレッドで処理させる際、その処理結果の取得を必要になるところまで後回しにする手法。処理をパイプライン化させる。1977年に考案され、現在ではほとんどのプログラミング言語で利用可能。
概要.
カール・ヒューイットは、2つの点で future の方が promise よりも適した用語であるとしている。第一に promise（約束）は必ずしも将来の時点のことを意味しないため、future（未来）よりも曖昧である。第二に promise は単なる言語表現だが、future は現物（actuals）に対する先物（futures）という意味もある（つまり、実際の物に対する代用品）。
future という構文が最初に紹介されたのは1977年、とカール・ヒューイットの論文でのことであった。一方 promise という用語は、1976年にとデビッド・ワイズが提案し、最終的にピーター・ヒバードが呼んだものである。future (promise) の使用により、分散システムにおける遅延を劇的に減少させることができる。例えばアクターモデルのようにメッセージのパイプライン化が可能であり、これをやでは promise pipelining と呼ぶ。
パイプライン化.
一般的なRPCで次のような式を考える。
 t3 := (x.a()).c(y.b())
これは、次のように展開できる。
 t1 := x.a(); t2 := y.b(); t3 := t1.c(t2)
これを解釈すると、codice_1 および codice_2 の値が定まらないと codice_3 の値は計算できない。future を使うとこの式が次のように表される。
 t3 := "future" ("future" x.a()).c("future" y.b())
これを展開すると次のようになる。
 t1 := "future" x.a(); t2 := "future" y.b(); t3 := "future" t1.c(t2)
このようにすると codice_3 は即座に計算される。ただし、codice_3 から情報を得ようとすると待たされる。
実装.
future構文は MultiLisp や Act1 といったプログラミング言語で実装された。並行論理プログラミング言語における論理変数もよく似ている。これは当初 Prolog with Freeze や IC Prolog で使われ、Relational Language、Concurrent Prolog、PARLOG、GHC、KL1、Strand、Vulcan、Janus、Mozart/Oz、Flow Java、Alice といった言語で真の並行性プリミティブとなった。Concurrent ML のような単一代入規則型データフロー言語の I-var は並行論理変数とよく似ている。
future による遅延最小化のようなパイプライン化技法はまずアクターモデルで生み出され、1988年にバーバラ・リスコフが再発明し、1989年ごろにはザナドゥ計画でも再発明されている。
future, promise, 並行論理変数, データフロー変数, I-var をサポートする言語:
加えて、promise pipelining をサポートする言語:
非標準ライブラリによる実装: