#:g1: レトロLisp探検: NIL

Posted 2016-12-12 14:25:29 GMT

方言の系統

MACLISP

主要開発者

Jon L White、Glenn S. Burke、George J. Carrette、Christopher R. Eliot

登場時期

1979年

特徴

色々なアイデアが盛り込まれ、後のCommon Lispに多大な影響を残すが、それ自体はぱっとせず終わった方言(処理系)

後続への影響

Common Lisp

概要

NILは、New Implementation of Lisp もしくは、NIL is Lispの頭文字だそうですが、何にせよまあ洒落た名前ではあります。
(ちなみに、後にSchemeでTという処理系が出ます。)

1970年代後半には人工知能研究用のマシンとしてはPDP-10ではメモリの大きさ等に限界が来ていました。
Lispマシンのように専用機を開発する方向とは別に、当時新進気鋭のVAXのような汎用マシンで稼動する処理系を開発をする流れがありましたが、NILはこちらの方です。
とはいえ、NILには、VAXとS-1スーパーコンピューターで稼動するものがあります。

元は同じだったようですが、VAX NILの方がLispマシンのものをどんどん取り込んで行く方向に流れたので、いつしか、S-1の方はS-1 Lispとして別のものとされるようになったようです。以下、NILはVAXのもの、S-1 LispはS-1で稼動のものとします。

まず、S-1 Lispも論文ではS-1 Common LispとされるようにCommon Lispのベースになった処理系の一つですが、スパコンの開発とCommon Lispの開発が同時並行だったため、スパコンで力が入りがちな数値計算方面の関数はCommon Lispの関数がそのままハードウェアの基本命令として組込まれていたそうです。 floorceilingtruncateroundmodsqrtsincosexplog等々 しかし、そんなS-1 Lispですが、結局完成することはありませんでした。

そして、VAX NILの方ですが、そもそもMACLISPのプロジェクトに参加していた人はLispマシンプロジェクトに流れていってしまったので、多い時でも3、4名のプロジェクトだったといいます。

NILの当初の目標ですが

こんな感じでスタートしたNILでしたが、MITのLispマシンプロジェクトに比べ進捗は遅く、それなりのものをリリースしたのは1981年のことだったようです。

この頃Common Lisp策定が始まりましたが、Common Lispの仕様案は、Spice Lispの他にNILのマニュアルからもそのまま取り込んだ箇所があるとのこと。
Lisp Machine Manualからもかなりの量がCommon Lispの仕様の草稿に組込まれていますので、CLtL1は、これら3つのマニュアルに由来する部分がかなり多そうです。

NILのCommon Lispへの影響としては、レキシカルスコープの採用が良く言われます。
Schemeの影響のなのかなと思って記述がないか探してみましたが、それらしきものはなく、どうやら、コンパイルコードとインタプリタの動作の統一、スペシャル変数とローカル変数を上手い枠組みで扱う方法を考案した、クロージャーを使いたい、あたりが合さった結果のようです。

そして、NILとCommon Lispはお互いに影響し会い、いつの間にはNILは独自拡張のあるCommon Lispになってしまいました。
拡張された部分は、大体Lispマシン方面のユーティリティとFlavorsあたりで、MIT系のものは結局大体似た感じのものとなってしまいました。

ちなみに、NILの処理系は、1984年時点でメモリ7メガだったそうです。当時殆ど一人で開発していたGlenn S. Burke氏のVAXは8メガを搭載していて、ほぼシングルユーザーで利用していたそうです(当時としては恐らく非常に贅沢)が、それくらいのスペックでないと動作は重くて使えなかったようです。
(実際ベンチではDECのVAX LISPより遅いことが多いようです……。)

1984年になってもGCが付いてなかったそうですが、データ表現がコロコロ変わるので作る気にならないとのことで止まっていたとのこと。
最終的にはGCは実装されたのでしょうか(入手できる一番番号が大きい0.286のマニュアルでも未完と書いてある)

まとめ

Common Lispが作られるにあたってベースの一つとなり、そしてCommon Lispの一処理系になってしまったNIL。
もちろんNILのコードには#+NILという記述が使われていますが、現在、Common Lispでは、#+NILはコメントアウトに使う慣行があります。
(恐らく書いている人は#+CL:NIL位の気持ち、しかし実際は、#+:NILになっている)

NILのソースが発掘されVAXのエミュレータで動くようになって#+NILを書く日を夢見ております。

参考文献


HTML generated by 3bmd in LispWorks 7.0.0

comments powered by Disqus