ブライアン・カーニハンとELIZA

Brian Kernighan and ELIZA


2020/02/12
藤田昭人


レギュラースタイルのブログは久しぶりですが…

年明けより ELIZA 本の執筆を本格化しています。 そこで悩ましいことが1つ。書籍執筆と並行してブログが書けるのか?という問題です。 もちろん「ブログは書籍の草稿」と宣言しているので、ネタが被るのは全然OKのはずなんですがね。 いざ書いてみると「あまりネタバレしてもなぁ…」と助平心がムクムクしてしまうのが問題なのです。

当初はプライベート・プロジェクトとして進めてるELIZA実装のトピックを幾つか書くつもりだったのですが…どうやらあまり需要が無いような。 で「どうしたもんかなぁ…」と考えているところに飛び込んで来たのは "UNIX A History and a Memoir" の存在。 当然『Unix考古学』の著者としては無視できるはずもなく、すかさず原書を購入したのですが…すっかりマイブームとなっております。

で…

(本気で訳し始めるとELIZA本が書けなくなるので)原書をパラパラめくっていると "ELIZA" の文字が飛び込んできました。 そこで、すかさず「ブログで1本ぐらいかけるな!!」とほとんど思いつきだけで書き始めたのが本稿です。


ブライアン・カーニハンについて

僕と同世代のUnixオタクの皆様には今更な話ですが…

今日では研究版と称される最初のUnixケン・トンプソンデニス・リッチー が 開発したとされてますが、 Unixの開発を行ったAT&Tの ベル研 にはUnixを開発する研究グループが存在し、 他にも優秀な研究者や開発者が在籍していました。

ブライアン・カーニハン もその一人で、グループ随一の論客だと僕は認識しています。 例えば『パスカルが私の好きな言語ではない理由』とかね。

www.lysator.liu.se

初めてみた時「嫌いなことをいちいち書いて公言せんでも良かろう」と思ったものです *1

カーニハン以外のこの種の(非常にクレバーな)論客はと言うと バトラー・ランプソン しか僕は知らないのですが、 ランプソンが情報工学全般の広範囲で非常に画期的な(かつ今日実用化されている)技術に関する論文を量産していたのに対し、 カーニハンは 『ソフトウェア作法』("Software Tools")、 『プログラミング言語C』("The C Programming Language")、 『プログラム書法』("The Elements of Programming Style")、 『UNIXプログラミング環境』("The Unix Programming Environment")、 『プログラミング言語AWK』("The AWK Programming Language")*2 といったUnix関連の有名な書籍をたくさん書いてます。 カーニハンはランプソンよりも幾分、教育者としてのイメージが僕には強いです。


"UNIX A History and a Memoir" について

この書籍は Kindle Direct Publishing を使ってカーニハン自身が Kindle Book を作成したようです(2019年10月公開)。 なので本書に関する出版社のホームページなどは見当たりません。 下記のカーニハン自身のホームページがその代わりのようです。

www.cs.princeton.edu

といってもあるのは ERRATA (と Kindle Edition への苦情)ぐらい *3

ともあれ…

"In memoriam DMR" との追悼の辞から始まる本書は Unix の開発者たちの私的な内容も含まれてます。 ちなみに、この DMR とはデニス・リッチーのことです。 こと Unix に関してはデニス・リッチーもドキュメントやメモランダムをたくさん残しています*4。これまた僕の印象ですが、リッチーのドキュメントは 研究版 Unix の開発グループのスポークスマン的な立場で書かれたものが多いのですが、 カーニハンのドキュメントはもう少し自由な立場で歯に衣を着せぬ物言い…というイメージがあります。 もっとも本書は、もしリッチーが存命であれば彼自身が書きそうな内容に読めます。


1.3 ベル研(BTL)でのブライアン・カーニハン(BWK)【抜粋】

本書は Kindle Book なので次の Amazon の書籍のページに行けばプレビュー が読めます。

https://www.amazon.co.jp/UNIX-History-Memoir-Brian-Kernighan/dp/1695978552/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=11X3OGG5R0K98&keywords=unix+a+history+and+a+memoir&qid=1581492080&sprefix=UNIX+%2Caps%2C261&sr=8-1

カーニハンが ELIZA について語っている箇所(P.9〜P.10)は そっくりプレビュー に収められているので、抜粋して翻訳してみました。 "1.3 BWK at BTL" の途中からです。このセクションの冒頭では 1964年に学部を卒業した後、大学院に進学するまでの数ヶ月間 インターンとしてインペリアル・オイル("Imperial Oil", 現エクソン)で 働いたことが語られています。それが「苛立たしい夏」の経験です。

I also tried to get Fortran programs running on Imperial’s IBM 7010, since I sort of knew Fortran, certainly better than I knew Cobol, and Fortran would have been better suited for data analysis. It was only after weeks of fighting JCL, IBM’s Job Control Language, that I deduced that there was no Fortran compiler on the 7010, but the JCL error messages were so inscrutable that no one else had figured that out either.

また、Fortranの知識がCobolよりも豊富で、しかもFortranがデータ解析に適しているインペリアルのIBM7010でFortranのプログラムを動作させようとしました。JCL(IBMのJob Control Language)との数週間にわたる格闘の末に、私は7010にはFortranコンパイラがないと推論しましたが、JCLのエラー・メッセージは非常に不可解で他の誰もがそれを理解できませんでした。

カーニハンがJCLと格闘したのは1964年ですが、その20年後の1984年の僕も同じようにJCLと格闘して、 彼と同じように苛立たしい半年間を過ごしました。なので、ここの記述には非常に共感します。

When I returned to school for my senior year after this somewhat frustrating summer, I was still strongly interested in computing. There were no formal courses on computer science, but I did write my senior thesis on artificial intelligence, a hot topic at the time. Theorem provers, programs to play chess and checkers, and machine translation of natural languages all seemed like they were within reach, just requiring a bit of programming.

このやや苛立たしい夏の後、4回生のために学校に戻ったとき、私はまだコンピュータに強い興味を持っていました。コンピュータサイエンスの正式なコースはありませんでしたが、当時話題になっていた人工知能に関する卒業論文を書きました。定理証明、チェスやチェッカーをプレイするためのプログラム、自然言語機械翻訳は、すべて手の届く範囲にあるように見えたのですが、ほんの少しのプログラミングが必要でした。

この「当時話題になっていた人工知能に関する卒業論文を書いた」との記述は、 今現在、機械学習を使った卒業研究テーマに没頭している学部生や修士学生のみなさんと相通じるのではありませんか? 「定理証明、チェスやチェッカーをプレイするためのプログラム、自然言語機械翻訳は、すべて手の届く範囲にあるように見えた」とか 「ほんの少しのプログラミングが必要」との楽観的な見通しは特に(笑)

After graduating in 1964, I had no clue what to do next, so like many students I put off the decision by going to graduate school. I applied to half a dozen schools in the United States (not common among Canadians at the time), and by good luck was accepted by several, including MIT and Princeton. Princeton said that the normal time to complete a PhD was three years, while MIT said it would probably take seven years. Princeton offered a full fellowship; MIT said I would have to be a research assistant for 30 hours a week. The decision seemed pretty clear-cut, and a good friend, Al Aho, who had been a year ahead of me at Toronto, was already at Princeton, so off I went. It turned out to be an incredibly fortunate choice.

1964年に卒業した後、私は次に何をしたらいいのか分からず、多くの学生と同じように、大学院に行くことにしました。私はアメリカの六ダースほどの学校(当時のカナダ人には一般的ではなかった)に応募しましたが、幸運にもMITやプリンストンなど数校に合格しました。プリンストンによると、博士号を取得するには通常3年かかるが、マサチューセッツ工科大学 (MIT) では7年はかかるだろうといいます。MITは私は週に30時間研究助手をしなければならないと言いましたが、プリンストンは完全な奨学金を提供しました。決断はかなり明確だったようで、トロントで私より1年先にいた親友の Al Aho が、すでにプリンストンにいたので、私は出発しました。それは信じられないほど幸運な選択でした。

この「卒業した後、何をしたらいいかわからず、大学院に行くことにした」も不思議に現在と符合しているようでクスッと来ますね。 でもMITやプリンストンに合格してることから、カーニハンは学業は優秀だったんでしょうねぇ。 結局「楽して学位が取れる」というのが決断の理由だった(笑)

しかし、MITとプリンストンを両天秤にかけられる人って…

In 1966, I got lucky again, with a summer internship at MIT, thanks in part to the fact that another Princeton grad student, Lee Varian, had done a great job there in 1965. I spent the summer using CTSS, the Compatible Time-Sharing System, writing programs in MAD (Michigan Algorithm Decoder, a dialect of Algol 58) to build tools for a new operating system called Multics, which we’ll come to in Chapter 2. (Multics was originally spelled MULTICS, but the lower-case version is less visually jarring; as with UNIX versus Unix and some other all-caps words, I'll use the nicer-looking form even though it’s not historically accurate.)

1966年、私は再びマサチューセッツ工科大学で夏のインターンシップを経験するという幸運に恵まれました。これはプリンストン大学の大学院生である Lee Varian が 1965 年に同大学で素晴らしい仕事をしたことが一因です。私はこの夏、CTSS(Compatible Time-Sharing System)を使用して、MAD(Michigan Algorithm Decoder、Algol58 の方言)でプログラムを作成し、Multics という新しいオペレーティングシステムのツールを構築しました。これについては第2章で説明します(Multics は元々 MULTICS と綴られていましたが、小文字バージョンの方が視覚的に不快感が少ないです。歴史的には正確ではありませんが、UNIX vs Unix や、その他のすべて大文字の単語と同様に、見栄えの良い形式を使用します)。

カーニハンの院生としての最初のインターンシップはMITで、なんと学生の頃から Multics の開発に参加していたんですねぇ。 ここで登場する CTSSMAD) は ELIZA の開発環境でもあります。 1969年あたりに Multics の学内リリースが始まるまでは、 このCTSS+MADがMIT学内の標準的なプログラミング環境だったのでしょうか? *5

My nominal boss at MIT was Professor Fernando Corbato, “Corby” to everyone, a wonderful gentleman, the creator of CTSS, and the person in charge of Multics. Corby won the Turing Award in 1990 for his fundamental work on time-sharing systems. He died in July 2019 at the age of 93.

MITでの名目上の上司は、フェルナンド・コルバト教授でした。誰もが “Corby” と呼び、素晴らしい紳士であり、CTSSの作成者であり、Multicsの責任者です。 Corbyは、1990年に、タイムシェアリングシステムに関する基本的な研究でチューリング賞を受賞しました。彼は2019年7月に93歳で亡くなりました。

In addition to leading the design and implementation of CTSS and Multics, Corby was the inventor of passwords for computer access. There had been little need for such a thing with batch computing. but some security mechanism was necessary to protect private files on a time-sharing computer with a shared file system.

Corby は、CTSS と Multics の設計と実装をリードしただけでなく、コンピュータアクセス用のパスワードの発明者でもあります。バッチ・コンピューティングでは、このようなことはほとんど必要なかったのですが、共有ファイルシステムを持つタイムシェアリングコンピュータ上のプライベート・ファイルを保護するには、いくつかのセキュリティメカニズムが必要でした。

I still remember both of the short pronounceable passwords that were automatically generated for me while I was at MIT in the summer of 1966. Two passwords were needed, not one, because one day during ne summer a mixup caused the file that stored the passwords to be exchange with the file that held the login message of the day. Since passwords were stored unencrypted, everyone who logged in got to see everyone else's passwords.

1966年の夏にMITにいたときに自動生成された短い発音可能なパスワードを今でも覚えています。初夏のある日に混乱が起こり、パスワードを保存したファイルがその日のログインメッセージを保存したファイルと交換されたため、パスワードは一つではなく二つ必要でした。パスワードは暗号化されずに保存されていたため、ログインした全員が他の全員のパスワードを見ることができました。

今日のアカウントの概念を発明したのも Multics だったのですねぇ。 しかし「パスワードは暗号化されずに保存されていたため、ログインした全員が他の全員のパスワードを見ることができた」とは…

My office, which I remember as being unshared, belonged to Professor Joseph Weizenbaum, but he was away for the summer. Early in 1966, Weizenbaum had published a description of Eliza, a program that simulated a dialog with a Rogerian psychologist. Eliza was one of the first attempts at using natural language to interact with a computer. It was surprisingly effective, at least when first encountered, and I enjoyed showing it off to visitors. There are plenty of Eliza simulators on the web today; it’s still entertaining to play with them for a few minutes, though their weaknesses quickly become evident.

私の研究室はジョゼフ・ワイゼンバウム教授のものであったことを覚えていますが、彼は夏の間不在であったのでオフィスを共有していたわけではありません。1966年初頭、ワイゼンバウムはElizaについての論文を発表しました。Elizaとは、ロジャース学派の心理学者との対話をシミュレートしたプログラムです。Elizaは自然言語を使ってコンピュータと対話する最初の試みの1つでした。少なくとも最初に出会ったときは驚くほど効果的で、訪問者に見せるのも楽しかったものです。今日、ウェブ上にはたくさんのElizaシミュレーターがあります。相手の弱点はすぐに明らかになりますが、数分間一緒にプレーするのは楽しいです。

なんとカーニハンはワイゼンバウムの夏季休暇の際の研究室の留守番役をしてたのですね。 この時点で既に ELIZA は人気の自然言語処理ソフトウェア(=ゲーム)であり、 ワイゼンバウムが不在でも訪問客が跡を立たず、代わりに若きカーニハンがデモをしていたということですか。

ELIZA: Please tell me what’s been bothering you.
YOU:   I’m trying to write a book about Unix.
ELIZA: Is it because you are trying to write a book about unix that you came to me?
YOU: Yes.
ELIZA: You are sure.
YOU: Yes.
ELIZA: You seem to be quite positive.
YOU: Yes.
ELIZA: I see.

ELIZA: 何が気になっているのか教えてください。
YOU:   Unixについての本を書こうとしています。
ELIZA: unixについての本を書こうとしているから私のところに来たの?
YOU:   はい。
ELIZA: 本当に?
YOU:   はい。
ELIZA: あなたはとても前向きなようですね。
YOU:   はい。
ELIZA: わかりました。

これ、デフォルトのスクリプトで動くんだろうか?

In the summer of 1967, I got the ultimate piece of good luck: an internship at Bell Labs in Murray Hill, in the Computing Science Research Center, working for Doug Mcllroy (Figure 1.4). Doug suggested that I explore some problem in evaluating memory allocators, one of his long-term interests. In the best intern tradition, I bumbled around and eventually did something completely different, creating a library of functions that made it convenient to do list processing in Fortran programs. I spent the summer writing tight assembly language for the then-current big computer at Murray Hill, a GE 635, which was in effect a cleaned-up and more orderly IBM 7094, but also a simpler version of the GE 645 that had been specially designed for Multics. That’s pretty much the last time I wrote assembly language. but even though what I was doing was fundamentally misguided. it was a blast and it hooked me completely on programming.

1967年の夏、私は最高の幸運に恵まれました。Murray Hillにある Bell Labs の Computing Science Research Center でのインターンシップで、Doug Mcllroy (図1.4) のために働いた。Dougは、彼の長期的な関心の1つであるメモリアロケーターを評価する際に、いくつかの問題を検討することを提案してくれました。インターンとしては最高のやり方で、いろいろと試してみましたが、最終的にはまったく違うことをして、Fortranプログラムでリスト処理をするのに便利な関数のライブラリーを作りました。私は夏を過ごして、当時現在の大きなコンピュータ、マレー・ヒルのきついアセンブリ言語を書いて過ごした頃、GE635は事実上片付けられ、より整然としたIBM7094でしたが、Multicsのために特別に設計されたGE645のもっと単純なバージョンもありました。私がアセンブリ言語を書いたのはこれが最後ですが、私がやっていたことは根本的に見当違いでした。これはすごいことで、私はすっかりプログラミングに夢中になってしまいました。

この「Fortranプログラムでリスト処理をするのに便利な関数のライブラリーを作った」との記述は、 ワイゼンバウムのMITでの最初の成果である SLIP) の実装を思い出させます。 カーニハンやワイゼンバウムに限らず、 リスト処理を念頭においた拡張ライブラリはこの時代の定番の研究テーマだったんでしょうかね?

それから、1967年の夏はベル研でのインターンシップを努めたとの事ですが、であればカーニハンはデニス・リッチーと事実上の同期だったようですね。 リッチーはハーバードからカーニハンはプリンストンから、1967年にベル研にインターンシップにやってきて、そのままベル研に就職したということですか。 もちろん二人とも学業優秀の秀才な訳ですが…彼らだけでは Unix はできなかったように思えてしまう。



ではケン・トンプソンはどういう経緯でベル研にやってきたのでしょうか? それはこの本の別のところに書いてあるようです。

以上

*1:Unixにも「目障りな敵は片っ端からやっつける」というヤンチャな時代があったという話。 1980年代にコンピュータを始めた僕らの世代には大きなカルチャー・ショックで、 その悪態ぶりのカッコよさに憧れて当時の僕は思わず飛び付いた感じだったのですが、 その後存在そのものが巨大化してしまいましたからねぇ。

*2:コマンド "awk" の K の人としても有名ですよね?

*3:カーニハンぐらいになると、どんな出版社でも書籍化に動くだろうにねぇ。 なんでまた KDP を使ったのだろうか?

これの日本語版の版権もカーニハン自身と交渉するのだろうか?
そんな奇特な出版社はあるのかなぁ?

*4:だから『Unix考古学』も書けた

*5:もちろん AILab は LISP を使っていたのでしょうが…