BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース データフローでのRuby向け宣言型並列性

データフローでのRuby向け宣言型並列性

原文(投稿日:2009/5/4)へのリンク

Rubyの一部は関数型プログラミング技法に影響を受けた。そのときRubyプログラマは、ErlangやHaskellから技法を導入したり、これらの言語へのブリッジ(Erlectricity(リンク)など)を作成した。

Oz言語から単一化(リンク)の概念をインポートすることで、Larry Diehl氏(リンク)は、宣言型並列モデルをRubyにもたらす。Oz(リンク)は、マルチパラダイムプログラミング言語である。主に、関数型の(lazyおよびeager 評価)、分散および並列プログラミング言語として知られているが、同時に制約型、論理型、手続き型、オブジェクト指向のプログラミングをサポートする。

プロセッサコア数が増加している観点から、Larry氏はRubyで宣言型並列モデルを利用したかった。その利点(リンク)は以下のとおりである。

  • プログラムが実行することを簡単に推論できる。
  • 単純だが強力な並列が可能。

これを達成するため、Larry氏は「コンピュータプログラミングの概念・技法・モデル」(PDF)で説明されているような、Dataflowスレッドの振る舞いの概念を使用している。

操作がまだバインドされていない変数を使用しようとしたら、どうなるか?純粋に感覚の観点では、操作が単純に待機するなら良いことであろう。おそらく他の いくつかのスレッドは変数をバインドすると、操作は継続する。この品のある振る舞いは、データフローとして知られている。

また、このOz方法を実現するために、氏は統一を使用している。

統一という考えは、統一アルゴリズムにより自動で解決可能な論理方程式によって、値を記述することである。

現実的には、これは以下のように書き換えられる(プロジェクトサイトから)。

# Local variables
include Dataflow

local do |x, y, z|
  # notice how the order automatically gets resolved
  Thread.new { unify y, x + 2 }
  Thread.new { unify z, y + 3 }
  Thread.new { unify x, 1 }
  z #=> 6
end

ローカルまたは宣言型(インスタンス変数)で、新たな変数を作成し、バインドする。

Ozポート(リンク)の例(非決定性の振る舞い)またはErlang-ish Actors(リンク)が提供される。

Brian Morearty氏は、いくつかの興味深いデバッグパフォーマンスやDataflow使用のメモリの問題(リンク)に取り組んでいる。Larry Diehl氏がBrian氏のブログで指摘している(リンク)

 

グリーンスレッドとネイティブスレッドプールの実装のため、このライブラリがJRubyをMRI以上に輝かせる、ということを述べておきたい。

 

この記事に星をつける

おすすめ度
スタイル

BT