2016-10-28 3 views
1

In Mostly Adequate Guide drbooleanは、「宣言型コーディングは並列コンピューティングに適しています」と仮定しています。次の例を参考にしてください:宣言型コーディングでは、それ自体が並列コンピューティングに役立ちます

// imperative 
var authenticate = function(form) { 
    var user = toUser(form); 
    return logIn(user); 
}; 

// declarative 
var authenticate = compose(logIn, toUser); 

私は、構成が右から左に保存されていると考えました。したがって、宣言的なコーディングは、並列コンピューティングの目的のために何を提供しますか?

答えて

1

私はご注文について同意します。少なくとも、authenticateの例では保存する必要があります。

宣言的なパラダイムになる可能性のある機能に関して、それはすべてモジュール性に関するものです。あなたが最初の例(車1)に、より良い、それを見ることができます:

ここ
// imperative 
var makes = []; 
for (var i = 0; i < cars.length; i++) { 
    makes.push(cars[i].make); 
} 

// declarative 
var makes = cars.map(function(car) { return car.make; }); 

、宣言型のバージョンが不可欠バージョンでは、あなただけのいくつかのコードを持っていながら、非同期で実行することができ、別の関数で書かれています残りのコードと混在しています。

宣言的な設計では、異なるプロセスでラップされたいくつかの部分を簡単に取得できます。

1

私は、この文の直前に例としてcomposeを使用することによって、この時点でガイドが誤解を招くようなものだと思います。 composeの場合

composeを使用しながらも、それはそれの出力に依存するため、toUserはまだ、logIn前に実行する必要がありますので、宣言型のスタイルは、並列コンピューティングを可能にしません!

私はmapの例がこれを説明するのに良いと思います。 forループを段階的に実行する必要がありますが、次のステップがどのように見えるか分からないので、前のステップを実行していない場合は、実際にすべてのステップを実行することはできません一度。一方、mapを使用している場合は、コレクションの各項目で実行される純粋な関数を与えます。この関数はアトミックアクションであり、その実行はその前後の関数の実行に依存しません。したがって、それらを一度にすべて並列に実行することができます。

しかし、このガイドにも記載されていますが、あなたの引用から除外された重要な追加点は、関数が純粋でなければならないということです。つまり、データ構造が変更されません。 "on on"ではなく新しいものを返す)。このための良い例は、次のようになります。

// impure 
var impureSquared = function (list) { 
    for (var i = 0; i < list.length; i++) { 
    list[i] = list[i] * list[i]; 
    } 
} 

// pure 
var pureSquared = function (list) { 
    return list.map(function (item) { 
    return item * item; 
    } 
} 

あなたが並列に2つのスレッドで同じデータ構造上の不純な機能を実行したい場合、データ構造が変更されているので、あなたはおそらく、あなたが期待する結果を得ないだろう各スレッドでこの関数によって2回、実行されます。一方でpure関数を使って同じことをするならば、両方のスレッドは互いに干渉することなく期待される結果を得るでしょう。

アトミックアクションを実行する純粋な関数の概念は、実際には宣言型プログラミングよりも並列実行にとって重要だと思います。宣言的なスタイルでコーディングしている間に、ちょうどそのようなことが起こります。

すべてのことが言われて、私はそれはあなたが並列コンピューティングについて話すとき、話をし、実際の言語ではありませんので、一般的にjavascriptのは、シングルスレッドの言語であることを、追加する必要があります;)

+0

は、だから、その実装を意味するものではありませんJavaScriptのマップの中には、イテラブル内のすべての要素の並列実行が含まれますが、並列計算とは呼ばれません。 –

+1

いいえ!申し訳ありませんが、これが混乱していた場合、私は少し物事をクリアしようとします。 まず、Javascriptは一般的にシングルスレッド言語であることを知っておく必要があります(特定のケースでは例外あり)。したがって、何をどのように、あるいはどのようにコードするにしても、それは本当に並行して何も実行することはありません。 – jdepoix

+0

私が説明したコンセプトはどんな言語にも当てはまりますが、あなたが 'map'を使うからといって、それはあなたもパラレルで実行するという意味ではありません!また、 "伝統的な" for-loopを使用することは、必ずしも物事を並行して実行することができないということを意味するものではありません。これらの原則を適用すれば、コードを並行して実行するほうがずっと簡単です。なぜなら、突然並行するときには、さらに多くのことを考慮する必要がないからです。基本的には、スケーリングの有無にかかわらず、理論的にはスケールが良くなります。 – jdepoix

関連する問題