#:g1: アクターモデルとPLASMAとSmalltalk-72の関係を雑に探る

Posted 2021-11-28 20:07:35 GMT

Smalltalk-72の解説動画を観ていて、PLASMAの論文で解説されていた謎のSmalltalkは、Smalltalk-72のことだったんだなあ、と合点がいったのですが、そういえば、アクターモデルとPLASMAとメッセージ送信とSmalltalk-72の関係って結局どういうことになっていたのか気になったので調べてみました。

調べてみたといっても、主にアクターモデル側のPLASMAの論文に書いてあることを確認しただけなので雑です。

PLASMA陣営から俯瞰したSmalltalkとの関係については、「A PLASMA PRIMER」に“HISTORICAL PERSPECTIVE - Relationship between PLASMA and SMALLTALK”として約5ページに渡っての解説が詳しいかと思いますが、ざっくりまとめてしまうと

ということみたいです。

とりわけ、1972年11月のMITでのアラン・ケイのセミナーでの“intentional definitions of data structures”とメッセージ送信という概念の影響は大きかった故に詳しく解説があるのだと思いますが、ヒューイットはそれまでの自身の研究(Planner等)からデータの側にゴール(手続き)を埋め込むアイデアであると即座に理解したようです。
この背景としては、当時のAI研究周辺では、1960年代あたりから、知識表現について宣言的(=データ)か、手続き的な表現か、の論争があったのですが、ミンスキーのフレーム理論もオブジェクト指向も1970年代は、これらの中間的アプローチと考えられたりしたようです。

さて、メッセージ送信のアイデアはともかく、Smalltalk-72の実装については、メッセージ送信が、トークンストリームをベースとしているため、ヒューイットは、Conniverの“possibility lists”と同じく大域的な副作用があることを問題とし、アクターモデルでは大域的な副作用は排除することで並列処理が可能なように一般化したようです。この辺りは急に実装ベースの話をしているなという印象。

また、関数でデータを表す(オブジェクト)ことについても、それまで検討はしたことがあったものの、効率が悪すぎて使い物にならないと誤解していたのを払拭することにもなったようです。
上述のリストにあるように、以前から関数でデータを表現するというのは、ReynoldsのGEDANKENのような先達の研究がありますが、メッセージ送信で、関数呼び出し、コルーチン、継続等を表現することも可能ということと合せると、データも手続きもアクターというプリミティブで全部表現できるということになります。

メッセージ送信をプリミティブにしても良さそうですが、メッセージ自体もアクターということなので万物の計算プリミティブとしてアクターを据えることに成功した、ということなのでしょう(多分)

アラン・ケイのオブジェクト指向モデルと初期アクターモデルの対比

Smalltalk-72と初期のアクターモデルとの対比となると、対象のレベルがずれてしまうので、レベルを合せて比較してみました。

目的

アクター
アクターという概念で計算をモデル化する
OO
children of all agesのためのDynabookのためのプログラミングモデル

構成される総体

アクター
アクター
OO
ネットワークで接続されたコンピューター的なもの(身体と細胞)

最小の要素

アクター
アクター
OO
コンピューター(細胞)とメッセージ

モデルの(参照)実装

アクター
PLASMA
OO
Smalltalk-72

まとめ

The Early History Of Smalltalkによると、アラン・ケイは最小の構成単位として関数やデータに分ける必然性はあるだろうかと問うて、多数の自立するネットワーク化された計算細胞のようなものを考えたようですが、ヒューイットは関数やデータを更に分解して、結局似たようなモデルを作ったのは面白いなと思いました。

また、この文献によると、LISPが関数と特殊形式というプリミティブに分けるのではなく、全部FEXPRという特殊な関数にしたらどういうことになるかを考えたのが、Smalltalkを考える材料になったとありますが、全面的にFEXPRで構成するということは、関数が個別に渡された引数をevalするということです。FEXPR→オブジェクト、引数→メッセージということかと思いますが、上述のPLASMAの文献にも、その辺りに相当することが書いてあり、Smalltalk-72では、トークンのストリームで実現しているところをPLASMAでは拡張性がある記述が可能、との説明があります。

[eval ≡
  (=> [=the-expression using =the-environment]
      (the-expression <= (eval: the-environment)))]

この辺りも交流があったのか、似たようなことを考えていて似たような結論になったのかは分かりませんが面白いと思いました。

ちなみに、Schemeの学習教材などに、なんでもλというプリミティブに還元してみせるという例が良く出てくるのですが、なんでもアクターというプリミティブで表現するという路線を継承したのかなと思わなくもありません。
(クロージャーでOOPみたいな話は何周もして元の話に戻った気がしないでもない)

1970年代から、並行計算モデルとして耳にするようになった最近まで、還元主義としてのアクターモデルの方は、あまり一般的には受け入れられているようには見えないのですが、λの方はそこそこ一般的になったことを考えると不思議です。
関数より細かく分解するというのは受け入れ難いことだったのでしょうか。


HTML generated by 3bmd in LispWorks 7.0.0

comments powered by Disqus