- 木村 泉、米澤 明憲, 1982: 算法表現論 (岩波講座 情報科学 12)。岩波書店, 282 pp.
1982年に出た A5判 横書きのハードカバー。岩波書店は、文科系・理科系にわたるさまざまな専門分野について、「講座」とよばれるシリーズの本をだしている。専門分野内のおおぜいの分担執筆で、分野全体をみわたそうとするものだ。大学院生や学者になったばかりの人の勉強や、学者の知識の更新、また、大学の図書となって学生が参照することなどが想定されていただろう。この「情報科学」の講座の初刷りは、全巻予約購入が原則だったが、最初に発売された2巻はバラ売りもしていて、出版は番号順ではなく、本書は2番めに出たので、バラ売りで買えた、と記憶している。第2刷りは全部バラ売りになった。
わたしは、大学4年生のときから、数値計算をするために Fortran をつかう必要があったが、Fortran の教科書の例文はわかりにくかった。『プログラム書法』という本があって、既存の教科書の例文を添削する形で、Fortran で見とおしのよいプログラムをかく方法をしめしていた。また、Fortran の変種である Ratfor というプログラム言語をつかう機会があった。その言語は Software Tools という本で提示されていた。その本は、Ratforで書かれたプログラムを Fortran に翻訳する前処理系 (pre-processor) があることを前提としながら、その前処理系を自分でつくることができるような技法をおしえるものだった。わたしがその本を英語で読みおわったころ、日本語版『ソフトウェア作法』が出た。訳者は『プログラム書法』と同じ 木村 泉 さんだった。
『算法表現論』の著者名に木村さんの名まえがあがっていたので、わたしはとびついたのだった。買ってみると、木村さんの執筆部分は全10章のうち第1章だけだった (長めの章ではあるが)。しかし、わたしにとってはそれだけでも価値があった。ずっと持っていたのだが、2019年に蔵書をへらしたときに古本屋さんに売ってしまった。2021年からプログラミングをおしえるたちばになったので、その参考にまた読んでおこうと思い、2023年11月に大学の (東京のキャンパスの) 図書館にあったのを借りて読んだ。
米澤さんの執筆部分は、(数学者はそう思わないだろうが、わたしにとっては) 数学書のような感じだ。わたしは読みとおせていない。プログラム言語を、大きく「命令型」と「作用型」に分類し、両方を統一するモデルをつくって説明しようとしているが、どちらかというと「作用型」のほうが基本に近いと考えているらしい。わたしはこれを読んでしばらくこの用語をプログラム言語の標準的分類名だと思っていたが、他の文献には従来どおり「手続き型」と「関数型」をつかっているものがおおいようだ。わたしは、「手続き」ということばは、たとえば Pascal 言語の procedure をさすこともあるのでまぎらわしいと思い、「手順立て型」ということにしている。わたし自身のプログラム言語への理解は手順立て型にかぎられており、関数型やオブジェクト指向はいまもよくわからないままである。
米澤さんは「命令型」 (わたしのいう「手順立て型」) 言語の例として Pascal をつかっていて、その記述は (同じころに出版された) Pascal の教科書とほとんど同じだったので、その部分にかぎっては理解できた。
木村さんによる序章の趣旨は、米澤さんの執筆部分のような体系的記述がなぜ必要になったのかをしめす、というものだ。内容は、Kernighan & Plauger の訳書とは、まさに同工異曲、いわば「Kernighan & Plauger の主題による即興変奏曲」である。Ratfor 前処理系と似たしごとをするプログラムを、わざと旧式の Fortran でつくって、どのようにこまるかを実演してみせるのだ。これによってわかるのは、プログラム言語は「制御構造」を適切に表現できる形式をもつべきだということだ。旧式のプログラム言語は、計算機に対する命令を順にならべたうえで、そこに「どこどこに行け」という「go to 文」をまぜて構成されていた。その方法で書けるプログラムのほとんどは、順次処理、条件別処理、ループの 3つの基本的な制御構造で書きなおせる。Ratfor や Pascal は条件別処理やループの構文を明示することで、計算手順をわかりやすくした。(関連することを [別ブログ 2020-07-18 「go to」をめぐって] の第3–4節に書いた。)
しかし、これでおわりではない。(木村さんのいう)「データ抽象」の話がつづく。Pascal 言語には変数をいくつか組にしてまとめてあつかう機能があるけれども、それだけでは力不足だ。データとそれにアクセスする手続きをあわせたパッケージ化の機能がほしいのだ。(複数の人がつくった部品をあわせて動くプログラムをつくることをかんがえると、A氏による部品のなかのプログラムがB氏による部品の内部のデータを書きかえることができるのは危険だ。他の部品へのアクセスは、外に見せると約束したデータへのアクセスにかぎるべきだ。) 序章のおわりのほうに、このようなことができる言語として、Ada とか Clu のなまえがでてくるのだが、わたしにはどちらもつかう機会がなかった。のちに発達した C++ 言語の「クラス」機能がいくらかそれにちかいと思うが、「オブジェクト指向」と「データ抽象」とはちがうだろう。そのあたりの概念がわたしにはよくわかっていない。2020年代の「算法表現論」をどなたか書いてくださるとありがたい。
文献
- Brian W. Kernighan, P. J. Plauger, 初版 1974, 第2版 1978: The Elements of Programming Style. McGraw-Hill. [わたしは直接読んでいない。]
- Brian W. Kernighan, P.J. Plauger 著, 木村 泉 訳, 初版 1976, 第2版 1982: プログラム書法。共立出版。[わたしはこの両方の版を読んだ。] [読書メモ (2024-06-23)]
- Brian W. Kernighan, P. J. Plauger, 1976: Software Tools. Addison-Wesley. [わたしはこの版を読んだ。] [読書メモ (2024-08-18)]
- Brian W. Kernighan, P.J. Plauger 著, 木村 泉 訳, 1981: ソフトウェア作法。共立出版。[わたしはこの版も見たがよく読んでいない。]
折りかえしのあとに目次をつける。
Continue reading