Posted 2020-12-28 22:07:24 GMT
いつものようにCommon Lisp情報を求めてインターネットを徘徊していたのですが、ECLのマニュアルににCRSというのがあるのが気になって調べてみました。
ECL is based on a Common Runtime Support (CRS) which provides basic facilities for memory management, dynamic loading and dumping of binary images, support for multiple threads of execution.
ECLのマニュアルの説明では、CRSは、メモリ管理やスレッド等の実行時に必要なものがモジュール化されたものという感じですが、CRSはECLとも独立した存在のようで、CRSについて別途論文も書かれていました。
こちらの論文を読むと、CRSとはCを中間言語として、実行時に必要な言語機能をモジュール化したり、データ形式を統一したものだったようで、CRSを基盤にCや、Lisp、Prologの環境が構築可能で、それぞれの言語が双方向に呼び出し可能な仕組みだったようです。
;;; Prolog機能を使ったCommon Lispのコード例
(defun reverse (x y)
(trail-mark)
(or (and (get-nil x) ;reverse([],[]).
(get-nil y)
(success))
(trail-restore)
(let (x1 x2 (y2 (make-variable)))
(and
(get-cons x)
(unify-variable x1)
(unify-variable x2)
(goals
(reverse x2 y2) ; :- reverse(X2,Y2),
(concat y2 (list x1) y)))))
(trail-unmark))
この論文の後ろの方に出てくるCommon Lispの処理系はECLではなく、Delphi Common Lisp(DCL)というECLの作者であるAttardi先生が1985年に起業したイタリアのベンチャーが販売していた商用処理系なのですが、古いECLのソースを確認すると、ECLは元々はこのDCLのCLOS部やCRS部分がECoLispとしてGPLライセンスで公開されたもののようです。
ECoLisp(Embeddable Common Lispの略)の略でECLとしていたものが、いつのまにかEmbeddable Common Lispの略でECLになったらしいのですが、別にECoLispのままでも良かったような……。
This is ECoLisp (ECL), an Embeddable Common Lisp implementationCopyright (c) 1990, 1991, 1993 Giuseppe Attardi
Authors:
KCL: Taiichi Yuasa and Masami Hagiya
Dynamic loader: William F. Schelter
Conservative GC: William F. Schelter
Top-level, trace, stepper: Giuseppe Attardi
Compiler: Giuseppe Attardi
CLOS: Giuseppe Attardi with excepts from PCL by Gregor Kiczales
Multithread: Giuseppe Attardi, Stefano Diomedi, Tito Flagella
Unification: Giuseppe Attardi, Mauro Gaspari
なお、現状資料が見当たらないので推測に過ぎませんが、KCLにマルチスレッドやCLOS、X11のGUIを付けて商用化されたものがDCLで、ECLは、それをCRSとAKCLをベースに構築しなおしたものなのかなと考えています。
ECoLisp 0.12をSunOSのエミュレータでビルドして確認してみましたが、この頃までは、CRS部はまだ独立していますが、既にユニフィケーション部はほぼ残骸だけとなり、上記のLispからProlog機能を使うようなコードは書けなくなっています。
CLOS部もPortable CommonLoops(PCL)とは独立の実装で、class-prototype
の代わりに、先にmetaclass
クラスを作っておくという独自方式でしたが、徐々にAMOP準拠に書き換えられた様子。
とはいえ、まだ結構な量が健在です。
折角面白い機能であったCRSとProlog連携でしたが、どうも1990年代中盤には、ECLのコードからも削除されつつあり利用できなくなっていたようです。残念!
Poplogも共通の言語基盤を通して、Common LispとProlog、ML、Pop-11が連携しますが、あまりこういうのは流行らないのでしょうか。割合に面白いと思うのですが……。
なお、今回始めて知りましたが、Attardi先生は、元々はHewitt先生の元でアクター理論を研究していた方だったようです。
Delphi Common Lispも1980年代中後半にCLOSとX11上のGUI、マルチスレッド機能が使えたワークステーション上の処理系ということで大分時代を先取りしていたようですね。
■
HTML generated by 3bmd in LispWorks 7.0.0