煩悩生活
Books
@Randam


れっつ、Wirth系
やめられない、とまらない
(1999/11/13)



Wirth系
処理系が手に入らなくてもついつい買ってしまう言語の本というのはあって、Wirth関係の本なんてのはその最たるものだ。Pascal系じゃなくてWirth系、なのが肝心なのだが。
Wirth(ニクラウス・ヴィルト)といえばPascalの生みの親で、一般に有名なのはPascalの教科書『アルゴリズム+データ構造=プログラム』(「A+D=P」)[1]だろう。
おごちゃんにいわせるとあまりいい本ではないということだがそれはさておき、この本の後半ではPascalによるミニ言語の処理系を作る例題が登場していた。

Modula-2
Pascalについで手がけたのがModula、そしてModula-2で、分割コンパイルやモジュール化、データ隠蔽をサポートしていなかった(TurboPascalではunitなぞで拡張していたが)のを、インターフェース定義のDEFINITION MODULEと実装部分のIMPLEMENTTATION MODULEに分けて作成する様にしてあった。インターフェースだけ先に提供して実装は後で変えられるというやり方だな。このころはまだオブジェクト指向とか継承は用意されていなかったのであくまでデータ隠蔽・抽象データ型だけのサポートだった。(話によるとWirthはXeroxでStarのためのシステム記述言語Mesaを見て影響を受けたらしいが)

細かいところはCほど柔軟じゃなかったけど、システムよりのプログラムも組みやすい言語で良かったのだ。列挙型と範囲指定配列が特徴的だけど。コルーチンという疑似並列処理もサポートしてたし。まぁ標準ライブラリがろくになかったのが寂しかった。でも結構ファンがいていろいろライブラリはあったんだが。

Wirthが書いたModula-2の本というと『Modula-2プログラミング』[2]がまず挙げられるが、これは言語解説の本で、例の「A+D=P」をModula-2で書き直したのが『データ構造とアルゴリズム』[3](同じタイトルの本がいくつもあるので紛らわしい)だ。Wirthの本はいつも教科書の振りをしながら自分の言語とかアーキテクチャを宣伝するスタイルなのが楽しい。この本にはPascalの時に入っていた言語処理系の例題はついておらず、独立して『翻訳系構成法序論』[4]として出版された。
この邦訳がまたくせ者で、筧先生が「安易なカタカナ語」に反発して問題提起を兼ねた形になっていて、訳語を考えてあるんだな。プログラム=算譜とかスタック=棚とかプロセス=算程とか。ちなみにタイトルの「翻訳系」とはコンパイラのことで、インタプリタは「通訳系」という :-)まぁそれは慣れればいいわけだが、この本では、LL(1)の再帰下降構文解析による処理方法が説明されていた。「PL/0」という例題用の簡易言語を設定してそれ用の構文はEBNF(拡張バッカス・ナウアー記法)で用意しておいてそれにあわせて字句解析と構文解析とインタプリタをつくるという例題だ。でもこの実装例がまたこまったもので、チューリッヒ工科大(ETH)で作ったLilithというシステムのWindowインターフェースを使っていたのでDOSでまねるのに工夫が必要だった。

その当時は『Computer Today』誌でModula-2とLilithの特集が組まれるほど注目を集めていたし、今では考えられないことだが"Pascal,Ada and Modula-2"という洋雑誌さえ存在した(AdaとModula-2だぜ!?)。

Modula-3
Wirthが直接設計したわけではないが、Modula-2の子孫の一つにModula-3がある。Wirthの監修の元、DEC(買収されて今はCompaq)のSRC(Sysytems Research Center)とオリベッティの手で開発された言語で、よりシステム記述向けに拡張してあった。
REFANYという何でもありポインタ(void *ですな)を始めとして、LOOPWHOLEという型チェック無しでMOVE出来る処理とか、サブTYPE定義、ジェネリック(TEMPLATE)、bit単位のデータ定義とかもあってかなり強力。これがもっと広まってればいいのにと思わせる。とりあえず有名な本ではGreg Nelsonが編纂した"System Programming with Modula-3"[5]がある。SRCの開発者達の論文を集めた感じの本なのでちょっと取っつきにくいかも知れない。言語そのものの解説としてはハービソンの"Modula-3"[6]でしょうか。これは極めてまっとうに作られている教科書だ。
DOS版もリリースされていたはずだが当時は重くて大変だった気がする。いやあれはCommonLispだったか。これを書くためにSRCのページを見に行ってみたらまだまだ活況のようでめでたいことだ。

Oberon and Oberon-2
その次にWirthが手がけた言語がOberonだ。もっとも、Oberonは言語の名前だけではなくてシステム全体を指す言葉でもあるのだが詳しい説明は省く。
これはModula-2をベースにしているが、型の継承が出来るところが違っていた。といっても構造体に新しい項目を追加できるという程度だが、いちおうダイナミックバインディングは出来た。他にはインターフェースを独立して書くのはやめて、実装からインターフェースモジュールを生成できるようにした。アクセスレベルはprivateとかいうキーワードは無くて、*をつけた項目は公開されるというシンプルなもの。ただ実装上の問題があって、ネイティブの処理系はいざ知らず、DOSなんかで作られた処理系はCに落とすようになっていて、*をつけてない変数はそもそもヘッダーファイルに吐き出されない様にしてあった。ということは子供クラスをつくっても公開されてない変数は参照できないわけだ。そんなわけで、今にして思えば継承によるオブジェクト指向よりはモジュールの組み合わせによる委譲よりの発想だったようだ。
Wirthは"Project Oberon"[7]という大著を出していて、この本の中ではエディタやコンパイラのソースの解説までやっている。システムのソースが盛りだくさんなのでWirthファンなら買っておいて損のない本だ(まだ売っていれば、だが)。
言語としてのOberonの教科書というとWirthが共著で書いた"Programming in OBERON 〜 Steps Beyond Pascal and Modula" [8](「Oberonプログラミング」というところか)がある。タイトルで分かるとおり、自分が設計した2つの言語の問題点をいかに解決したかというあたりから始まって、次のOberon-2に引き継ぐところまで書いてある。

そのOberon-2はOberonの上位互換として設計されたバージョンで、大きな変更点は"Type Bounds Procedure"が追加されたことだ。このおかげで型ごとに手続きを書けるようになっている。
これはなにかというと、Oberonの型とか型の継承は所詮データの継承であって、メソッドはモジュールに閉じていた訳ね。つまりデータはいくつでも作れるけど、それを処理するのはそのオブジェクトのメソッドではなくてそのデータ型のためのモジュールの手続きを指定する必要があったわけだ。(Point型のデータp1を処理するにはp1.moveTo(0,0)ではなくてPoint.moveTo(p1,0,0)と書かないといけない。)Type Bounds Procedureはややマクロじみたやり方でこれを解決した。p1.moveTo(0,0)と書くと手続きにそのp1自体が渡されるようにしてある。
なんかごまかされてるような気がするけどとりあえず用は足せる。ポリモーフィズムもサポートしているし。

PROCEDURE (point:Point) moveTo(x,y:INTEGER);
  BEGIN
    point.x := x;
    point.y := y;
  END;

p1.moveTo(x,y);
まぁ今見ると古くさいかな。オブジェクト指向でない言語を拡張しているから止むを得ないところはあるけど、スクリプト系言語と違ってデータのバイト位置まで気にする系統の言語だといろいろ制約は多いみたいだ。

Oberon-2の言語解説の本も当然出ていて、これはWirth先生ではなくて弟子のメッセンベックが担当している。"Object-Oriented Programminng in Oberon-2"[9]は言語の基本的な機能だけではなく、応用編としてOberonシステムのサブセットOberon-0を書いてみようという章があってなかなかスリリング。

Wirth先生は何をやってたかというと、例のコンパイラの書き方の教科書をOberonで書き直した本、『ヴィルトのコンパイラ構成法』("Compiler Construction")[10]を書いてきた。「A+D=P」から2回書き直していることになる。なんというか、教科書を書くのがすきというか。前書きでも「最近の学生どもは基本的な仕組みを理解しとらんから」云々などという文句をたれていて、ああ学生達もうるさい爺さんがいて可哀想、とも思うけど羨ましかったりもして。ちなみに単なる焼き直しではなく、分割コンパイルとか、以前はスタックマシンを想定していたのだが、RISCコードを生成するときの最適化などの現実的な(?)話題も盛り込んでいる。

それでWirth先生、次の言語はまだですか。



取り上げた本
[1] ニクラウス・ヴィルト『アルゴリズム+データ構造=プログラム』,マイクロソフトウェア,ISBN
[2] ニクラウス・ヴィルト『Modula-2プログラミング』,マイクロソフトウェア,1986
[3] ニクラウス・ヴィルト『データ構造とアルゴリズム』,近代科学社,1990,ISBN4-7649-0162-5
[4] ニクラウス・ヴィルト『翻訳系構成法序論』,近代科学社,1986,ISBN4-7649-0112-9
[5]Edited by Greg Nelson "System Programming with Modula-3",Prentice-Hall,1991,ISBN0-13-590464-1
[6]Samuel P.Harbison "Modula-3",Prentice-Hall,1992,ISBN0-13-596396-6
[7]Niklaus Wirth,Jurg Guntknecht "Project Oberon",ACM Press,Addison-Wesley,1992,ISBN0-201-54428-8
[8]Martin Reiser,Niklaus Wirth "Programming in OBERON 〜 Steps Beyond Pascal and Modula" ,ACM Press,Addison-Wesley,1992,ISBN0-201-56543-9
[9]Hanspeter Moessenboeck "Object-Oriented Programminng in Oberon-2",Springer-Verlag,1993,ISBN3-387-56411-X (著者名の"oe"はウムラウト付"o")
[10] ニクラウス・ヴィルト『ヴィルトのコンパイラ構成法』,アジソン・ウェスレイ・パブリッシャーズ・ジャパン,1997,ISBN4-7952-9706-1
英語版ではフロッピーが付いていたが、訳書ではETHからFTPしてこいと書いてある。




関連書籍
◆Martin Reiser "THE OBERON SYSTEM User Guide and Programmer's Manual",ACM Press,Addison-Wesley,1991,0-201-54422-9
Oberonシステムの概念から使用方法まで解説した本。どこでもテキストをコマンドとして評価できるとか、コマンドをメニューとしてあらかじめテキストを表示させておいてマウスで処理するなど、Smalltalkライクな発想の機能が面白い。

関連リンク
◆DEC/Compaq SRC(Sysytems Research Center)のModula-3 HomePage http://www.research.digital.com/SRC/modula-3/html/home.html
◆ETHのOberonホームページ:http://www.oberon.ethz.ch/
◆NetNews
comp.lang.modula2
comp.lang.modula3
comp.lang.oberon
◆後は適当に、www.yahoo.comの言語のカテゴリをあさってちょ


Vette Home Page
煩悩生活