振り返り(3)では並行(concurrent)プログラミングと並列(parallel)プログラミングの用語を導入しました。
続けて、並列/分散処理を記述するためのプログラミング技法を議論するためにもう一つの軸を導入します。
もう一つの軸
もう一つの軸とは以下の3つです。
- 可変共用(shared mutability)
- 可変分離(isolated mutability)
- 不変(immutability)
このあたりはスライドの以下のページにまとめています。
プログラミングの方針では、不変が最上で、不変が難しい場合は可変分離、避けたいのが可変共用となります。
いわゆるマルチスレッド・プログラミングというと可変共用のカテゴリになるわけですが、これが「避けたい」プログラミング・モデルというのが重要です。
可変分離や不変のプログラミング・モデルは(現時点の)Javaでは可能ではありますが、あまり相性がよくありません。逆に、関数型言語と相性のよいプログラミング・モデルです。この点から、関数型言語が並行/並列プログラミングに向いているのではないかと予測できるわけです。
可変分離は、Scalaもサポートしているアクターによって実現できます。
不変は、言うまでもなく純粋関数型のプログラミング・モデルの前提条件ですし、関数型プログラミングの核となる概念です。
合わせてどうなるか
さて、並行プログラミングと並列プログラミングの軸、可変共用、可変分離、不変の軸の2つの軸を導入しました。
この2つの軸は直交するので、それぞれの組合せが可能ですが、相性の良い組み合わせの候補と考えられるのが以下の2つです。
- 可変分離⇔並行プログラミング
- 不変⇔並列プログラミング
まず、並行プログラミングは同時に発生する事象から駆動される処理が同一リソースを更新したいということが問題の発端なので、「不変」(のみ)では対処することができません。アクターを用いた「可変分離」でこの問題に対処するのが一つの解になります。
一方、並列プログラミングは1つの処理を分割して複数のCPU /コアで同時実行することで処理性能を向上させることが基本になるので、「不変」による実装が可能です。より好ましいのは「不変」>「可変分離」ですから、不変と可変分離の両方の選択肢が取れるのであれば不変を選ぶのが得策ということになります。
0 件のコメント:
コメントを投稿