言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Ruby + Linda = Rinda http://www.druby.org/ilikeruby/d208.html

Linda について話題に出たが、論文を読むだけじゃさっぱり分からないので、Ruby の実装を試してみた。Ruby に最初から入ってるみたいで試すのはめっちゃ簡単だった。

まずサーバー。個人サーバーの languagegame.org を使って実験した(豆知識: fedora では irb は別パッケージなので、sudo yum install irb しよう)。

$ irb -r rinda/tuplespace --simple-prompt
>> DRb.start_service('druby://languagegame.org:12345', Rinda::TupleSpace.new)
=> #<DRb::DRbServer:0xb7f49e3c ...
>> puts DRb.uri
druby://languagegame.org:12345
=> nil
>> DRb.thread.join

ぱっと眺めた感じ。Linda とはデータベースの事を言うようだった。なので、手元のマシン(kanabun) で接続して、"hello world" と書き込んでみる。使える操作には次の物がある。

  • write データの追加
  • take データを削除して取り出し。
  • read データを残して取り出し。
(kanabun)
$ irb -r drb --simple-prompt
>> DRb.start_service
=> #<DRb::DRbServer:0x7ff61b8c ...
>> $ts = DRbObject.new_with_uri('druby://languagegame.org:12345')
=> #<DRb::DRbObject:0x7ff5dbf4 @ref=nil, @uri="druby://languagegame.org:12345">
>> $ts.write(["hello world"])
=> #<DRb::DRbObject:0x10022aa0 @ref=-604364348, @uri="druby://languagegame.org:1

で、それを他のマシン(tinlizzie) で読む。読むとデータは無くなる。

(tinlizzie)
$ irb -r drb --simple-prompt
>> DRb.start_service
=> #<DRb::DRbServer:0xb7e8a4b0 ...
>> $ts = DRbObject.new_with_uri('druby://languagegame.org:12345')
=> #<DRb::DRbObject:0xb7ef6624 @ref=nil, @uri="druby://languagegame.org:12345">
>> $ts.take([nil])
=> ["hello world"]

何となくわかった。データベースと違う所は、読むとデータが消える事、値の取り出し(take) がブロックする事と、一度に一行だけ読み込む事。

ブロックするという性質を使って、遠くのマシンで動く関数を作る事が出来る。普通の関数と違って、値をどう返すかまで考えないといけない。例えば今の時刻を答える仕組みには、"time?" と聞いて、"time!" と答えると言う事にする。

#!/usr/bin/ruby
require 'drb'

DRb.start_service
$ts = DRbObject.new_with_uri('druby://languagegame.org:12345')

loop do
  $ts.take(["time?"])
  $ts.write(["time!", Time.now])
end
(kanabun)
>> $ts.write(["time?"])
=> #<DRb::DRbObject:0x7ff1d8c4 @ref=-604617178, ...
>> $ts.take(["time!", nil])
=> ["time!", Wed Feb 20 14:35:45 -0800 2008]

"time?" と聞いた後に他の人が割り込んで "time!" を横取りしたらどうなるのだろうという疑問がぬぐえないが、その辺はまた勉強して行こう。

考察

Wikipedia からのリンク http://www.caip.rutgers.edu/~virajb/readinglist/coordinationlang.pdf に、『プログラミング言語は計算を行う部品と通信を行う部品を分けて考えるべきである』という意見がある。それは、今風に言うと、『副作用の無い部品とある部品を分けて考えるべきである』と同じ意味では無いだろうか?そうすると、Linda も私のオブジェクト指向関数型言語大統一構想で大きな意味を持つ。つまり、状態が関係する部分を Linda で、計算が関係する部分を非正格関数型言語で書くというのはどうだろうか?と妄想が膨らむ。