#:g1: Lispとエディタ (4)

Posted 2015-07-05 23:23:28 GMT

Lispとエディタについて延々と続いていますが、今回は1970年代のMITをざっと眺めてみます。

1970年代初頭のMIT

まだ、Emacsも登場しておらず、エディタ方面ではTECOが充実していた時期だと思われます。
EmacsとTECO共通のLisp支援環境というと、LEDITや、LISPTがあるのですが、この時期に利用されていたかは残念ながら不明です。

プリティプリントのドキュメントは残っているのですが、Lispの書式については、この時代に習慣化したものが多いのかもしれません。
どちらかというとプリティプリントの出力形式が後のエディタの進化によって書法として定着するという、自動化→手動化の逆流ともいうべき流れが興味深いです。

主な所では、

ということなのですが、コメントの開始というのは行コメントのことで、セミコロン一つで開始する作法となっていますが、現在でもこれがメジャーな方式です。

また、セミコロン2つは、式についてのコメントで、これも現在と同じ。Goldsteinプリティプリンタでは、複数行に連続している場合、これをマージして詰めて整形するか、そのままにするか等が選択できたようです。

3つのセミコロンは、Goldsteinプリティプリンタでは、手を付けないでそのままにするという指示だったようです。

現在では、この使い分けはEmacs等のエディタがインデント付けをする際に基本としている作法ですが、プリティプリンタがそれ程使われなくなるにつれ役割がエディタに取り込まれた例なのかもしれません。

また、ページの幅が120桁だったりしてUnixの80桁主義からすると結構広いと思ったりしますが、この時代はディスプレイ端末を使っているとは限らず、テレタイプだったりします。
紙に印字される場合は120桁位が長度良かったりするというのもあったかもしれません。

Multics 方面

Multics MACLISP は、1974年に完成したようですが、David Moon氏による1974年のMACLISP Manualによると、まだMultics MACLISPにはLispエディタがないという記述があります。
ITSのアーカイブを眺めるとMoon氏作のエディタがありますが、Multicsの人達はこの辺りを使ったのかもしれません。
面白そうなので、ITSで動かして確認してみましたが、BBN-LISPのエディタとBinfordエディタを足して2で割ったような使い勝手の構造エディタです。
editf、editp、editv、editとあるので、どちらかというとBBN-LISPのエディタの影響が強いかもしれません。
このエディタでは検索のコマンドがありますが、Multics MACLISPにしか存在していない文字列の関数を利用していることから、ITSでは動かないようです。そうすると、やはりこれはMultics向けで、Lispエディタが無い状況をどうにかしようとしたのかなと推測しています。

LISPT

LISPTは、TECOとLISPを行き来するための仕組みです(後にEmacsでも利用可)。
Emacs登場より先なのかどうか不明なのですが、最終バージョンが708だったりするので結構古くからあった可能性は高いかなと思います。
使い方は、MACLISPから(lispt)関数を実行すると、サブのTECOジョブに切り換えられ、M-zを押すと、ファイル(バッファ)の最後の式がLISPに送られ評価されつつ、LISPに戻ってくる、というものです。
LISPから再度TECOに戻るにはC-M-Tを押します(マニュアルにはC-Tと書いてありますが…)。
LISPTは、MACLISP用ですが、MACSYMA用のmacstというのもあります。
1970年代初頭のMITの対話環境は、このようにエディタと処理系を行き来して、入力支援と履歴機能はエディタが担うという方式がメジャーだったのかもしれません。

Emacs 登場 (1976年)

ITS Emacsが登場するとすぐにLisp関係のコマンドは整備され、ほぼ現在使われているコマンドは網羅されているようです。
ここから約40年変わりないというのも凄い気もします。 ITS Emacsを触ってみれば分かるのですが、今のEmacsと操作感があまり変わらず、Lispコードの編集については、今の感覚そのままで書けます。

LEDIT

LEDITは、LISPTを若干改良したようなものです。
LISPTがファイル最後の1式をLISPに送るところを、M-zを実行した式をLISPに送るという風な改良がされていて、LISPに切り換えるには、C-x zを押します。再びエディタに戻るにはC-e spaceです(TWENEXはspaceが不要)。
REPLとエディタバッファが同じ画面で開けるということはなく、あいかわらず行き来するという操作感です。
PDP-10 MACLISPは大体1982年辺りを境に使われなくなりますが、PDP-10系の環境では、LEDIT以上のものが作られることはなかったようです。

Lispマシン方面

LISP Machine Progress Reportにはエディタについての記述もありますが、

主にスクリーンエディタの優位性が解説されています。しかし、そのスクリーンエディタとは基本的にEmacsのことのようです。
マウスが使えるというのが目新しい所でしょうか。
ここで述べられているエディタでは、エディタはLispのトップレベルのフロントエンドにすることが可能で、エディタ上で式を編集して、Lispに送り、結果がバッファに挿入される、ということです。
また、コマンドによって過去の入力が簡単に呼び出せるともあります。

しかし、このどちらもZWEI〜Zmacsで確認する所では標準では搭載されていないので上記は計画上の話だったのかもしれません。
大体の所は現在のEmacsのinferior-lisp modeのREPLの履歴機能みたいなものが想像できます。

EINE (1977年?)

LISP Machine Progress Reportと大体同時期に存在しているEINEですが、ドキュメントを眺めると意外にも後のZWEIより先進的だったりするようです。

ZWEI以降のエディタのLispモードの方式と違う所としては、

ということです。
一覧から選択するかバッファを切り換えて関数を編集し、編集が終わるとファイルが更新されるという方式だったようです。
MITのLispマシンのプロジェクト自体Altoに強い影響を受けていますが、Smalltalkにでも影響を受けたのでしょうか。

ZWEI (1978年)

EINEでは野心的な編集方式でしたが、どうやらZWEIから単なるEmacsになってしまいます。
色々やってみたけど、結局エディタは普通のEmacsで良いや、という感じだったのでしょうか。

対話環境については、LISP Machine Progress Reportで示唆されていたような、GNU Emacsのinferior-lispのようなものではなく、エディタバッファ上の式を評価すると、Piece of Paper(SymbolicsではTypeout Window)というオーバーレイウィンドウが上からずるずる出てきて、spaceを押すと引っ込む、というものになります。
これはmoreというページングシステムにも対応しているので画面サイズを越える長い出力にも対応しています。
デバッガもこのオーバーレイされた画面上で対話的に使うことになります。
このような方式のため、Lispマシンでは、REPLを常時表示させておき、そこに送信、というスタイルではなく、REPLを参照することなくEmacsのコード編集バッファ上のみで過ごすという感じになります。

SymbolicsではさらにTypeout windowはストリームになっていて過去の内容も参照可能です。

この方式を受け継いでいると思われる開発環境にはLispWorksのIDEがあり、結果が別のペインに表示されるものの思想としては大体似たものを感じます。

他に主なLisp開発支援機能としては、

等々、シンボル補完以外で現在のSLIMEにあるものは大抵あります。
カスタマイズもLispでコマンドを書けば良いので、割合に簡単に実装可能です。

Multics Emacs (1978年)

LISPで実装されたEmacsとしては、Multics Emacsも有名ですが、どんな環境だったのかは不明です。
コードが公開されているので、Lispモードを眺めてみましたが、

が用意されていたようです。
compile-function(C-M-c)というのが用意されているので眺めてみましたが、コンパイルする対象の式をバッファから抜き出してファイルに書き出し、それをコンパイルしてロードするという方法のようなので、今のSLIMEと同じようです。
結果はミニバッファに表示されていたようですが、長くなった場合等はどうなのかは不明です。
大体感覚としては、Emacs LispのLisp部分がMACLISPになったような感じかなと想像しています。

ldebugのほうは、Common Lispの対話デバッガのようなものがEmacs上で表示されるようなのでSLIME的な使い勝手だったのかもしれません。

Multics Emacs位の環境であれば、Lispを書く上で不自由することもそうそうないかなという印象です。

補完機能について

補完機能については、ITS Emacs、EINE、ZWEI、Multics EMACS等、ミニバッファでの補完機能があるようです。
編集バッファ上のシンボルの補完に関しては、ZWEIなどは、現在のEmacsと同じくabbrevモードがあるのでユーザーが辞書を作って登録する、という方法だったのかもしれません。
動的補完(dabbrev)については、1990年頃に実現され始めるようですが、当時のマシンリソースを考えるとabbrevモードが使えるだけでも先進的だったのかもしれません。

ツールの使われ方の変化(よりイメージ指向へ)

実はMIT Lisp文化方面では、1970年代のMACLISPからLispマシンへの世代交代に伴なって開発ツールの使われ方に変化が見られます。
MACLISP時代はコンピュータのリソースが限られていたこともあり、小さいツールを組み合せて使うというUnixのような考えが主流だったようです。
例えば、プリティプリンタ、コンパイラ、対話的なインタプリタ、エディタは、それぞれ別々に起動して使われていました。
これがLispマシンになると、Lispマシンの中から全部することになるので、全部がLispで書かれ、Lispの中で実行されるようになります。
Common Lispもこの流れの中にありますが、エディタこそ含まれていないものの、プリティプリンタも、コンパイラもLisp中に含まれ利用もLispの中からということになります。
これが小さいツールを組み合せて、それらが一つの環境を構成するようなOS(Unix等)とは相性が悪かったりして、現在ではCommon Lispの欠点の一つと考えられることも多いと思いますが、一応こういう背景があることは知って欲しいようなそうでもないような。

まとめ

眺めてみると、1976/7年のEmacs登場とLispマシンの登場あたりから数年で急激に進化するものの、そこから現在まで対して変化がないことが分かります。
例えば、素のScheme処理系をVimか何かで使うとなると、処理系REPL+エディタ+処理系に式を送信する機能、位になりますが、環境としては40年前の環境とまるで同じです。
SLIME位の環境でも、1970年代末には大体実現されているので35年位は大した変化なし、という所でしょうか。

次回は、1980年辺りを眺めてみたいと思います。


HTML generated by 3bmd in SBCL 1.2.13

comments powered by Disqus