素歩人徒然 “Goto”氏 我が愛しのgoto文
素歩人徒然
(3)

“Goto”氏


── 我が愛しのgoto

 最近のソフトウェア技術者は、Wintelの世界に囲い込まれて仕事をしている限り、どうもがいてもCPUに選択の余地は残されていない。しかし昔は、コンピュータを開発するということは、CPUの命令語の設計から始めるのが普通であった。私のようなソフトウェア技術者も、ハードウェア技術者と一緒になって命令語の細かい仕様について議論し、ささやかながらも設計作業に参画させてもらったものである。

 命令語の中でも、特にサブルーチン呼出しの命令は最大の関心事であった。命令語というのは全体のバランスが重要であるから、サブルーチン呼出しの命令だけを重視しても意味がない。しかしプログラマにとっては、プログラムの実行性能とか、プログラミングの手間も考え合わせると特別に関心を持たざるを得ない部分だったのである。

 サブルーチンの呼出し命令というのは、その時点のプログラムカウンタ(注1)の値を保存して、指定されたサブルーチンへ飛ぶ機能を有する。その戻り番地の情報をどこに保存するかというと、普通はインデックスレジスタなどに置くことが多い。

【注1】プログラムカウンタは、常に次に実行すべき命令語の番地を値として持っている。この値を保存してサブルーチンから戻るときに利用するのである。

 しかしインデックスレジスタのないコンピュータもあるし、あっても一つしかないという簡素なコンピュータもある。そういう場合はインデックスレジスタを気前よくそのために使ってしまう訳にはいかない。当時は、そういう小規模なコンピュータが多かったからである。

 インデックスレジスタを使わずに戻り番地を保存する方法として、飛び先であるサブルーチンの先頭命令語の番地部に、その情報を書き込んでしまうという方式が当時提案されていた。先頭の命令語は、普通NOP(No Operation:何もしない命令)にしておいて、戻るときそこに書き込まれた番地情報を間接番地で参照しようというものである。これを、発案者の名にちなんで“ゴトージャンプ”(Goto-jump)と称した。確か、後藤英一博士の発案だったと記憶する。

 私は“ゴトージャンプ”の採用には反対であった。当時はまだ、pure-procedure とか commom routine という概念はまだあまり普及していなかったし、recursive call という呼び出し方式は存在していたが、そんなことはソフトウェア側で実現すべきことであってハードウェアで実現を考慮するような事柄ではないというのが一般的な考え方だったのである。現在の常識では、命令語とデータをごったにして同じ領域に置くなぞということは飛んでもないことである。しかし、初期のコンピュータでは、平気でそんなことをやっていたのだ。

 しかし私が反対した理由は、上記のような将来的な技術動向を予想してということではもちろんなかった。単にインデックスレジスタの1つも付けて、もっと使いやすいマシンにしてほしいと思っただけのことである。私は、当時の最先端マシンであったIBM−7090の使用経験があったので、命令語に関しては少しは目が肥えていたのである。結局、私の主張は通らず“ゴトージャンプ”は採用されてしまった。

 その時、私は思ったのである。あぁ、そうなんだ。いい名前だとこうして自分の名前を残せるのだ。それに引き替え私のような凡庸な名前では、どう頑張ったところで後世に名を残すのは不可能なことであろうと。

 その一方で、当時東急グループの創始者であった五島慶太氏が、その強引な商法の故に、陰で“強盗”慶太と呼ばれていたことも知っていた。そして、いみじくも思ったものである。あぁ、そうなんだ。変な名前だとこうして強盗呼ばわりされてしまったりする。それに引き替え私のような凡庸な名前なら、どう間違ってもそんな心配は不要であろうと。

 その後、高水準のプログラム言語が出現するようになると、当然のことながら goto文が使われるようになった。どんなプログラム言語でも必ず goto文を具えている時代になったのである。しかし、なぜか“goto”であって、決して“go to”とは書かないのであった。私は、前述のような Goto-jump の経験を経てきていたので、普通の人とは違ってこの“goto”という予約語には特別な思い入れがあったのであろう、goto文を見ると反射的に“ゴトージャンプ”のことを思い出してしまったりするのであった。そうなると、決まって思うのである。あぁ、そうなんだ。いい名前だとこうしてプログラム言語の中に自分の名前を残せるのだ。それに引き替え私のような凡庸な名前では、どう頑張ったところで後世に名を残すのは不可能なことであろうと。

 時代は更に進み、ダイクストラ博士が「goto文は有害である」とのたまうと、たちまちにして世は「goto文の除去」が最大の関心事となり“GOTO-less Programming”の時代となってしまった。そして後藤博士は、海外に行くといつも「除去」されてしまう事態になってしまったのである(注2)
 そしてまたまた私は思うのであった。あぁ、そうなんだ。変な名前だとこうして不幸な目に会わなければならないのだ。それに引き替え私のような凡庸な名前では、どう間違ってもそんな心配は不要であろうと。

【注2】Literate Programming, Donald E. Knuth 参照
 (邦訳:「文芸的プログラミング」アスキー出版)

 今から思うと、あの時代は“我が愛しの goto文”にとっては本当に暗黒の時代であった。どこかへ行きたい場合に、直接そこへ行きたいと意思表示できないとしたら、これはどんなにか不便なことであろう。何か(たとえば、繰返し作業のような仕事)にかこつけて、偶然そこに行き着いたようにみせなければならないのである(出張を口実に、その土地の名所旧跡を見て回ってくるようなものだ)。そんな世の中にはしたくない。そんな国には住みたくないものだ。私は goto文がひとり弾劾されている事態に直面し、はなはだ不満であった。しかし、だからと言ってそれを声高に主張する勇気の方も持ち合わせてはいなかった。私はただ世の中の流れに身を任せ、人々の尻馬に乗って goto文に対する魔女狩りの動きに迎合するしかなかったのである。実に情けないことではあった。

 そして遂には、goto文を持たない(持たない! 何たることか!)プログラム言語が登場するに至ったのである。これは、ひどい。いくら何でもやり過ぎである。この世から goto文が永遠に消えてしまったらどうなるのか。これから10年後、50年後、いや100年以上経ったらこの世は一体どうなっているのか。そう考えた瞬間に、私の脳裏にあるアイディアが閃いたのであった。いやなに、素晴らしい技術を思い付いた訳ではない。単なる小話を思い付いただけのことである。

 その小話とは、次のようなものであった。

『初  夢』

 西暦2980年1月3日。東京電によれば、プログラム用言語で使われる文として画期的な機能をもつ文が、日本の一学生によって考案されたという。
 この文を用いると、プログラムの性能が従来に比し約5〜10倍にも向上することが確認されている。しかし詳細は不明である。その秘密を探ろうと、あるプログラマがこのプログラムの解析を試みたところ、2日後に遂に発狂してしまったという。通常の思考過程を混乱に陥れる恐ろしい力をもった文であるらしい。
 ちなみにこの文は、発明者であるゴトーという学生の名にちなんでGoto文と呼ばれている。

 当時は、電子掲示板のような便利なものはなかったので、こういった雑文/小話を大勢の人に読んでもらいたくてもその発表の手段がなかったのである。その捌け口として、私は当時Bit誌に投稿するのを趣味としていた。しかしこの程度の小話ではそれもはばかられる。そこで、当時NTISに出向していた時代だったので、たまたまNTISの情報誌(注3)に原稿執筆を依頼された機会を利用することにした。そのどさくさに紛れて原稿の埋め草としてこれを載せてもらおうと謀ったのである。当時の編集長がまた変わった人だったのであろう、何と! これが採用されてしまったのである。

【注3】昭和55年1月10日発行 システムクリエイター

 しかし、残念ながら反応は皆無であった。自分では大傑作だと思っていたのであるが。多分、当時のNTIS関係者(日電と東芝の関係者から成る)にジョークの分かる人がいなかった為であろう。あるいは、プログラム言語の goto文のことを知らなかったのであろうか。goto文でがんじがらめのスパゲッティ状になったプログラムの解読に、日夜苦しんで気が狂いそうになっている我々プログラマの悩みを、彼らはまったく理解していなかったのであろう。■