Future パターン

並行プログラミングにおいて、計算が未完了であるために初めは不明な結果の代わりとなるオブジェクトを指す(このようなオブジェクトは、進行中または未開始の計算の最終結果を表現す

future, promise, delay とは、プログラミング言語における並列処理デザインパターン。何らかの処理を別のスレッドで処理させる際、その処理結果の取得を必要になるところまで後回しにする手法。処理をパイプライン化させる。1977年に考案され、現在ではほとんどのプログラミング言語で利用可能。

概要

編集

カール・ヒューイットは、2つの点で future の方が promise よりも適した用語であるとしている。第一に promise(約束)は必ずしも将来の時点のことを意味しないため、future(未来)よりも曖昧である。第二に promise は単なる言語表現だが、future は現物(actuals)に対する先物(futures)という意味もある(つまり、実際の物に対する代用品)。

future という構文が最初に紹介されたのは1977年ヘンリー・ベイカー英語版カール・ヒューイットの論文でのことであった。一方 promise という用語は、1976年にダニエル・P・フリードマン英語版とデビッド・ワイズが提案し、最終的にピーター・ヒバードが呼んだものである。future (promise) の使用により、分散システムにおける遅延を劇的に減少させることができる。例えばアクターモデルのようにメッセージのパイプライン化が可能であり、これをE言語英語版Alice ML英語版では promise pipelining と呼ぶ[1]

パイプライン化

編集

一般的なRPCで次のような式を考える。

t3 := (x.a()).c(y.b())

これは、次のように展開できる。

t1 := x.a(); t2 := y.b(); t3 := t1.c(t2)

これを解釈すると、t1 および t2 の値が定まらないと t3 の値は計算できない。future を使うとこの式が次のように表される。

t3 := future (future x.a()).c(future y.b())

これを展開すると次のようになる。

t1 := future x.a(); t2 := future y.b(); t3 := future t1.c(t2)

このようにすると t3 は即座に計算される。ただし、t3 から情報を得ようとすると待たされる。

実装

編集

future構文は MultiLisp や Act1 といったプログラミング言語で実装された。並行論理プログラミング言語における論理変数もよく似ている。これは当初 Prolog with Freeze や IC Prolog で使われ、Relational Language、Concurrent PrologPARLOGGHCKL1Strand、Vulcan、Janus、Mozart/Oz、Flow Java、Alice といった言語で真の並行性プリミティブとなった。Concurrent ML のような単一代入規則型データフロー言語の I-var は並行論理変数とよく似ている。

future による遅延最小化のようなパイプライン化技法はまずアクターモデルで生み出され、1988年にバーバラ・リスコフが再発明し、1989年ごろにはザナドゥ計画でも再発明されている。

future, promise, 並行論理変数, データフロー変数, I-var をサポートする言語:

加えて、promise pipelining をサポートする言語:

非標準ライブラリによる実装:

参考文献

編集
  • Henry Baker and Carl Hewitt The Incremental Garbage Collection of Processes Proceeding of the Symposium on Artificial Intelligence Programming Languages. SIGPLAN Notices 12, August 1977.
  • Henry Lieberman. Thinking About Lots of Things at Once without Getting Confused: Parallelism in Act 1 MIT AI memo 626. May 1981.
  • Henry Lieberman. A Preview of Act 1 MIT AI memo 625. June 1981.

脚注

編集
  1. ^ Kenjiro Taura, Satoshi Matsuoka, and Akinori Yonezawa (1994). "ABCL/f: A Future-Based Polymorphic Typed Concurrent Object-Oriented Language -- Its Design and Implementation.". In Proceedings of the DIMACS workshop on Specification of Parallel Algorithms, number 18 in Dimacs Series in Discrete Mathematics and Theoretical Computer Science. American Mathematical Society. pp. 275–292.
  2. ^ Future class - dart:async library - Dart API”. 2021年6月17日閲覧。
  3. ^ Completer class - dart:async library - Dart API”. 2021年6月17日閲覧。
  4. ^ Asynchronous programming: futures, async, await”. 2021年6月17日閲覧。
  5. ^ Steve Dekorte (2006, 2007, 2008). “Io, The Programming Language”. 2008年5月5日閲覧。
  6. ^ Rich Hickey (2009年). “changes.txt at 1.1.x from richhickey's clojure”. 2013年4月14日閲覧。
  7. ^ Seif Haridi; Nils Franzen. “Tutorial of Oz”. MOzart Global User Library. 12 April 2011閲覧。
  8. ^ Parallelism with Futures”. PLT. 02 March 2012閲覧。
  9. ^ asyncfutures”. nim-lang.org. 2021年6月12日閲覧。
  10. ^ Boost.Future
  11. ^ Boost.Promise
  12. ^ Task Parallelism (Concurrency Runtime) | Microsoft Docs

関連項目

編集

外部リンク

編集