Oz/Mozart, CTMの補足
2008-01-02


ASAHIネット([URL]のjouwa/salonからホットコーナー([URL] )に転載したものから。
---
[URL]
Erlang, Oz/Mozart, Prolog, 単一化
で書くといった補足。
 プログラミング言語Ozについては、
[URL]プログラミング言語)
[URL]
をどうぞ。日本語は英語の翻訳みたいですね。英語のほうがコードも少し載っ
てます。
 Ozの実装Mozartについては、これもたびたび紹介しているけど、
[URL]
The Mozart Programming System
をどうぞ。
 CTMこと、
[URL]
セイフ・ハリディ, ピーター・ヴァン・ロイ, 羽永洋訳「コンピュータプログ
ラミングの概念・技法・モデル」
の補足については、今回探したら、CTMの超超超ダイジェストのような資料が
ありました。
[URL]
How to say a lot with few words
をどうぞ。
 その他CTMのことは、ウェブやブログにつけている検索窓に CTM を入れて検
索してください。

 さて、
[URL]
Erlang, Oz/Mozart, Prolog, 単一化
で書いたのは、単一化の話でしたが、ほかにも面白い機能があります。

L = [1 2 X]

と書くと、フツーのプログラミング言語だと、Xが未束縛で値が決まっていな
いと、これはエラーになります。でも、Ozではエラーではありません。
 これは、部分値というもので、Ozでは値が完全に決まってない値が扱えるよ
うになっています。
 なぜ、そんなことを許すかというと、Ozのもつ並列・並行機能と関係があり
ます。
 Erlangは並列・並行プログラミングがやりやすいように、粒度の細かい、軽
量スレッドがありますが、Ozにもあります。そしてErlangとは違って、データ
フロー変数というものによって、非常に簡単にスレッド間の同期が取れるよう
になっているのです。
 Ozの変数はデータフロー変数でもあって、この例の場合、Xがデータフロー
変数になっています。
 [1 2 X]で、Xに値が入ってないという不完全な状態が部分値ですが、他のス
レッドがXに値を入れればいいので、L = [1 2 X]をエラーにしないのです。そ
して、Xに値が入るまでこれを実行したスレッドは待ち状態になって、値が入
ったら実行を再開するということで、同期が取れるようになっています。
 たとえば、Ozの実装実行環境であるMozartで

declare L X in
thread {Delay 10000} X=99 end
{Browse start}
L = [1 2 X]
{Browse L}

とやると、Oz Browserという画面には、まず、startという文字列が表示され、
その次に、最初はLの値として、{1 2 X]が表示されます。そして、10秒後
(10000ミリ秒後)に、Lの値が[1 2 99]と変わります。
 この例では、Xに値が入るまで、メインのスレッドは待ち状態になります。
そして、thread文によって生成された別のスレッドが10秒後にX=99を実行する
と同期が取れて、待ち状態が解除されます。
 こういうことができるように、L = [1 2 X]という不完全な値(部分値)の代
入を許しているわけです。

 言語がサポートするかライブラリがいいかという話を前もしましたが、これ
も言語がサポートすることで、非常に書きやすいものになっている例です。
 関連して、プログラミング言語Dの資料に、
[URL]
言語の機能 vs ライブラリによる実装
というのがありました。ご参考までに。

 余談。

続きを読む


コメント(全1件)
コメントをする


記事を書く
powered by ASAHIネット