僕にとっての和田先生

created: *Date: 2015-07-30*

堀内寛己(ほりうちひろき) x19290@gmail.com

和田先生とは

東京大学名誉教授、 IIJ 技術研究所研究顧問の和田英一先生[1]です。

出会い

大学 4 年の時、 僕はふてくされていました。 全部自責なのですが留年が決まっていました。 それは、 嫌で嫌でしようがなかった落ちこぼれ学科での生活がまた 1 年増えることをも意味しました。 自分がしたいのはこんなことではない。 コンピューターの勉強がしたい。 そう思って、 他学科聴講の制度を使って、 そういう講義をいくつか取ってみました。 その中で和田先生のものだけは別格の面白さだったのです。

先生の講義の名前は「算法言語[2]というものでした。

算法言語

講義の内容は、 前半が Pascal、 後半が Lisp でした。 例によってぐうたらな僕は、 前半の最初の方の講義をサボったのです。 そのこともあってか前半にはついて行けませんでした[3]。 ところが

衝撃の Lisp

後半で取り上げられた Lisp は、 想像を絶する奇妙な言語でした。 普通のプログラミング言語なら、 “1 + 2 + 3” と書くはずのものを (+ (+ 1 2) 3)[4]と書くのです。 ある意味でプログラマーに苦労を強いる言語ですが、 そのかわり Lisp インタープリターの構造はとても簡単なものになります。

実際、 ある講義プリント[5]の半分くらいに、 Lisp インタープリターが何をするのか。 つまり eval が何をするのか、 apply が何をするのかが書かれていたのです。 それを読んで僕は、 Lisp を完全に理解したと確信しました[6]

注にも書きましたがこれは夢のような体験で、 どんなにおちぶれてもこのとき得た自信によって、 僕はプログラマーを続けていくことができます。 だから和田先生は僕の大恩人の一人です。

後日談

留年して 2 回目の 4 年生のときも和田先生の講義を受けました。 講義の名前は忘れてしまいましたが、 計算機アーキテクチャーについての話だったと思います。 正確には前半を担当されたのが和田先生、 後半を担当されたのが Xerox PARC[7] から凱旋した鈴木則久先生でした。

おそらく、 試験のときに自由に書いていい欄に「動きもしない Lisp のプログラム」を書いて誤魔化して単位を取ったのだと思います。 この講義で覚えていることは先生方の雑談だけです。

和田

(嬉しそうに Macintosh を教室に持ち込んで)このコンピューターはしゃべるんですよぉ。 “The machine is called Macintosh.” なんてね。

和田

君たちはスティーブン・レビーのハッカーズは読んだことはあるかな?

本にも書いてあるとおり、 MIT のハッカーズはみな堕落してしまった。

でもストールマン[8]だけは変わりませんねぇ。 グニューって知ってますか? みんなタダなんですよぉ。

鈴木

データベースの意義は、 データとアプリケーションの分離である。

これからデータベースの基礎となるデータ構造である B-Tree について説明する[9]

君たちは COBOL っていうと馬鹿にするけど、 世の中のほとんどのデータベースは COBOL で書かれているんだ。

フロッピーは LAN が無い場合の必要悪[10]

注釈:

  1. 東京大学名誉教授、 IIJ 技術研究所研究顧問の和田英一先生

    ^ 和田英一 - Wikipedia

  2. 算法言語

    ^ 要するにプログラミング言語のことなのですが、 先生は妙なところが古くてそういう言葉を使うことがあります。

  3. 前半にはついて行けませんでした

    ^ これは当時も思っていたことですが、 講義を全部聞いたとしても理解できなかったと思います。

  4. (+ (+ 1 2) 3)

    ^ 現在のほとんどの Lisp ではこの式は、 (+ 1 2 3) と書くことができます。

  5. 講義プリント

    ^ 先生は、 ほとんど板書ということをしません。 代わりに A3 くらいの「わら半紙」に講義の要点を刷って配ります。 これによって学生は「板書されたものをひたすらノートに書き写す」というくだらない労力から解放され、 講義に集中できるようになります。 僕は、 この素晴しい習慣を他の先生が実践されているのを見たことがありません。

  6. Lisp を完全に理解したと確信しました

    ^ 当時僕は、 (+ (+ 1 2) 3) という式なら、 それがそのまま直列にメモリーに格納されているものと思っていました。 少なくとも Lisp では、 それはとんでもない誤解です。 実際はリスト構造[11]と呼ばれるものが使われます。 また、 自動ゴミ集め[12]についても知りませんでした。 本当はリスト構造や自動ゴミ集めを知らずに Lisp についてわかった気になってはいけないのです。 それにもかかわらず、 Lisp インタープリターが eval と apply という相互に再帰的な[13]関数でできているということが理解できたのは、 夢のような体験でした。

  7. Xerox PARC

    ^ パロアルト研究所 - Wikipedia

  8. ストールマン

    ^ 彼については僕は、 サイト内の別文書で熱く語っています

  9. B-Tree について説明する

    ^ この説明がまったく理解できなかったことは、 言うまでもありません。

  10. フロッピーは LAN が無い場合の必要悪

    ^ 同じことは SD カードにも言えるはずです。 実際、 賢明なユーザーはそのことに気付き始めています。 それを理解せずにまだ SD カードに社運を賭けている会社がたくさんあるようです。

  11. リスト構造

    ^ Lisp をほぼゼロから創り上げた故ジョン・マッカーシーが遺した大発明の一つです。 (+ (+ 1 2) 3) をメモリーに直列にではなく配置する方法です。

  12. 自動ゴミ集め

    ^ Lisp をほぼゼロから創り上げた故ジョン・マッカーシーが遺した大発明の一つです。 あなたが使っているプログラミング言語でもし、 当たり前のように文字列の結合ができるのなら、 それは自動ゴミ集めのおかげです。 C というとてもよく知られたプログラミング言語には自動ゴミ集めはありません。 だから C で文字列の結合のようなことをしようとすると、 大変な苦労を強いられます。

  13. 相互に再帰的な

    ^ eval が動作するにあたり apply の機能が必要となることがあります。 同様に apply が動作するにあたり eval の機能が必要となることがあります。 「ことがある」という点が重要です。 つまり eval も apply も単独で動作することがあります。 だからこの論理は、 普通は無限には循環しません。

updated: $Date: 2015-12-01$