先物とは?それは遅延評価と関係があります。
7 に答える
ウィキペディアに先物に関する記事があります。つまり、まだ知られていない値を使用する方法です。その後、必要に応じて値を計算し (遅延評価)、必要に応じてメインの計算と同時に計算することができます。
C++ の例を次に示します。
2 つの数値の合計を計算するとします。典型的な熱心な実装のいずれかを使用できます。
int add(int i, int j) { return i + j; }
// first calculate both Nth_prime results then pass them to add
int sum = add(Nth_prime(4), Nth_prime(2));
または、C++ 11 の を使用して先物を使用することもできます。std::async
これは を返しますstd::future
。この場合、add
関数は、まだ計算されていない値を使用しようとした場合にのみブロックされます (純粋に遅延した代替手段を作成することもできます)。
int add(future<int> i, future<int> j) { return i.get() + j.get(); }
int sum = add(async(launch::async, [](){ return Nth_prime(4); }),
async(launch::async, [](){ return Nth_prime(2); }));
Future を作成すると、実際の値の計算を開始する新しいバックグラウンド スレッドが開始されます。未来の値を要求すると、スレッドが計算を完了するまでブロックされます。これは、いくつかの値を並行して生成する必要があり、すべてを手動で追跡したくない場合に非常に便利です。
Ruby、またはScala、future、および遅延評価については、 lazy.rbを参照してください。
それらはおそらくスレッドを使用する任意の言語で実装できますが、C のような低水準言語では、高水準の関数型言語よりも明らかに難しいでしょう。
誰もが遅延計算の目的で先物について言及しています。ただし、宣伝されていない別の用途は、一般的な IO の Future の使用です。特に、ファイルの読み込みやネットワーク データの待機に役立ちます。
Future は遅延計算をカプセル化し、遅延評価を非遅延言語に押し込むために一般的に使用されます。フューチャが初めて評価されるときに、それを評価するために必要なコードが実行され、フューチャが結果に置き換えられます。
future が置き換えられるため、後続の評価でコードが再度実行されることはなく、単純に結果が得られます。
このブログ投稿では、未来を自分で実装する方法の例とともに、非常に詳細な説明を提供しています。私は本当にそれをお勧めします:)
Wiki の記事では、Futures の概要がよくわかります。この概念は、一般に並行システムで使用され、まだ計算されているかどうかに関係なく、さらに計算が進行中かどうかに関係なく、値に対する計算をスケジューリングします。
記事から:
Future は、その値を計算する特定のスレッドに関連付けられています。この計算は、未来が作成されたときに積極的に開始することも、その値が最初に必要になったときに遅延して開始することもできます。
この記事では言及されていませんが、先物はモナドであるため、将来値に関する関数をモナドに投影して、将来値が利用可能になったときにそれらを適用し、その関数の結果を表す別の未来を生成することができます.
Future は、特定の設計パターン、特にリアルタイム パターン (たとえば、メソッドの実行からメソッドの呼び出しを分離する ActiveObject パターン) でも使用されます。future は、完了した実行を待機するように設定されています。マルチスレッド環境からシングルスレッド環境と通信する必要がある場合によく見られます。ハードウェアの一部がスレッド化をカーネルでサポートしていない場合があり、この場合はフューチャーが使用されます。一見したところ、どのようにコミュニケーションをとるかは明らかではありませんが、驚くべきことに未来はそれをかなり簡単にします。私は少しのC#コードを持っています。掘り出して投稿します。