LISP 誕生から Smalltalk 誕生までは何年?


History of LISP [McCarthy78] の冒頭に、こんなふうな記述があります。

1. Introduction.

This paper concentrates on the development of the basic ideas and distinguishes two periods - Summer 1956 through Summer 1958 when most of the key ideas were developed (some of which were implemented in the FORTRAN based FLPL), and Fall 1958 through 1962 when the programming language was implemented and applied to problems of artificial intelligence. After 1962, the development of LISP became multi-stranded, and different ideas were pursued in different places.

LISP の前身である FLPL(Fortran List Processing Language)でマッカーシーのアイデア[MacCarthy58] が試されたのが 1958 年の夏頃。このころの LISP と似たような状態(car や cdr が実装されたばかり)が Smalltalk ではどうかというと、ちょうどメッセージングで 3 + 4 が実行できるかどうかが検証されたころ…ということになりましょうか。該当する記述は The Early History of Smalltalk では、こんなふうにあります。ちょっと長めですが、引用してみましょう。

It turned out to be more difficult than I had first thought for three reasons. First, I wanted the program to be more like McCarthy's second non-recursive interpreter--the one implemented as a loop that tried to resemble the original 709 implementation of Steve Russell as much as possible. It was more "real". Second, the intertwining of the "parsing" with message receipt--the evaluation of paremters which was handled separately in LISP--required that my object-oriented interpreter re-enter itself "sooner" (in fact, much sooner) than LISP required. And, finally, I was still not clear how send and receive should work with each other.

The first few versions had flaws that were soundly criticized by the group. But by morning 8 or so, a version appeared that seemed to work (see Appendix III for a sketch of how the interpreter was designed). The major differences from the official Smalltalk-72 of a little bit later were that in the first version symbols were byte-coded and the reeiving of return of return-values from a send was symmetric--that is, reciept could be like parameter binding--this was particular useful for the return of multiple values. for various reasons, this was abandoned in favor of a more expression-oriented functional return style.

Of course, I had gone to considerable pains to avoid doing any "real work" for the bet, but I felt I had proved my point. This had been an interesting holiday from our official "iconic programming" pursuits, and I thought that would be the end of it. Much to my surprise, only a few days later, Dan Ingalls shoed me the scheme working on the NOVA. He had coded it up (in BASIC!), added a lot of details, such as a token scanner, a list maker, etc., and there it was--running. As he liked to say: "You just do it and it's done."

It evaluted 3+4 v e r y s l o w l y (it was "glacial", as Butler liked to say) but the answer always came out 7. Well, there was nothing to do but keep going. Dan loved to bootstrap on a system that "always ran," and over the next ten years he made at least 80 major releases of various flavors of Smalltalk.

これは 1972 年の秋(関連:id:sumim:20050225#c)。ですから LISP 誕生から Smalltalk 誕生までは 14 年から 15 年とするのが順当でしょうね。ぜんぜん関係ないですが、Ruby の誕生日は 1993 年 2 月 24 日だそうですから、LISP からは約 35 年、Smalltalk からは切りのいいところで約 20 年とするのが妥当なようです。なんにせよ、Smalltalk-80 が 1981 年に Byte 誌に発表された時点にはもう、すでに“死んだ言語”だったわけですから(超新星みたいやね…w)、これを起点にする手はありません。

ときに、先のマッカーシーの文献は、いろいろと面白いことが書いてあります。最初の LISP には car、cdr のほかに cpr、ctr、それに cwr なんてのもあったようです。それぞれ、address、decrement、prefix、tag というパート、そしてそれらが収められた word、各々の内容を参照するための関数でした。

The first problem was how to do list structure in the IBM 704. This computer has a 36 bit word, and two 15 bit parts, called the address and decrement, were distinguished by special instructions for moving their contents to and from the 15 bit index registers. The address of the machine was 15 bits, so it was clear that list structure should use 15 bit pointers. Therefore, it was natural to consider the word as divided into 4 parts, the address part, the decrement part, the prefix part and the tag part. The last two were three bits each and separated from each other by the decrement so that they could not be easily combined into a single six bit pair.