macroscope

( はてなダイアリーから移動しました)

「Go to」をめぐって

【まだ書きかえます。どこをいつ書きかえたか、かならずしも しめしません。】

【この記事のうち、第2節までは、国民のひとりとして政策に対する意見をのべるものです。ただし、意見を根拠づけて論じることは省略して、自分にとっての結論的主張だけを書きました。第3節からは、雑談です。】

- 1 -
日本政府が「Go to キャンペーン」あるいは「Go to トラベル」という政策を実行しようとしている。

わたしは、すくなくともいま これを実行することに反対する。感染症が拡大するおそれのあるときにやるべき政策ではない。とくに東京に感染者がおおいからといって、東京だけはずそうとしているが、それでは、いろいろな不公平が生じるし、計画変更に対応するための業務が生じ、その担当者は見かえりのない労働をすることになる。

旅行産業 (宿、ガイド、交通機関など)をささえる必要があるとすれば、つぎのいずれかがよいと思う。

  • 休業による収入減少を補填する直接給付
  • 旅行産業 (宿など) が感染症対策をするための補助金
  • 感染症対策をしっかりした旅行を奨励するための補助金

- 2 -
これは、感染症リスクレベルが平常になってからならば、よい政策だろうか?

自民党の中では、特定産業むけ商品券政策がつぎつぎに提案される。特定産業を保護したいのだが、直接給付ではなく、その産業がふだん収入を得る商取引を、国からお金を追加して、奨励するのだ。

ひとつの道は、おおくの産業がそれぞれ政治家にはたらきかけることによって、かたよりをへらすことなのだろう。そのためにはそれぞれの産業が自分たちを代弁してくれる政治家をつくらなければならない。産業とはいいがたいが、大学教員という業種としても、その業種が損をしないように、政治家を出すべきなのかもしれない。

しかし、このやりかたでは、政治家にはたらきかけるちからがよわい業種がとりのこされると思う。

業種に関係なくすべての人にやくだつ政策を優先させるべきだと思う。

- 3 -
わたしの意識は、「go to」ということばのほうへむかってしまう。

今回の「go to」は、日本語のなかでとくに必要がないのに英語由来の要素をへたにつかった例だと思う。

英語の「go to」のふつうのつかいかたは、おおきくわけてふたとおりある。
ひとつは、「go to [名詞]」で、「どこどこに行け」だ。たとえば「Go to a national park.」は「 国立公園に行け」だ。
もうひとつは、「go to [動詞 (不定法)]」で、「なになにをしに行け」だ。たとえば「Go to swim.」は「およぎに行け」あるいは「行っておよげ」だ。

わたしは、「Go to キャンペーン」ときけば、「キャンペーンに行け」だと思うが、あきらかにこれは趣旨とちがう。

また、「Go to travel」は変だと思う。Travelは行き先ではない。Travel を動詞として、行く目的と考えることはできなくはないが、おちつかない。「go」と「travel」が同じ動作で、手段と目的の関係でないからだと思う。「Go travelling」ならばわかる。(つづり字のエルをかさねるかどうかの問題はのこるが。)

- 3X -
ただし、ネット情報を見ていて、英語には「Go to!」といういいまわしはある、ということを知った。Shakespeare の戯曲のせりふにも出てくるそうだ。『リーダーズ英和辞典』にも書かれているというので、ひいてみた。実際には、『リーダーズ+プラス』の電子ブック版[注1]をEBWin [注2]で検索した。

リーダーズ英和辞典本体のほうに

Go to!《古》 まあ待て, はて, これ, さあ! 《いさめ・不信など》

プラスのほうに

Go to! 《古》 さあそうしよう, それがいい!; 《口》 [euph.] 勝手にしろ, くそくらえ 《Go to hell! の代用表現》.

というのがある。

このうち「さあそうしよう, それがいい」だと思ってくれればよいのだが。

  • [注1] 1996年に出版された「電子ブック」用の小型CD-ROMで、研究社が1984年に出版した『リーダーズ英和辞典』と、1994年に出版した『リーダーズ・プラス』の内容をふくんでいる。
  • [注2] hishida さんが http://ebstudio.info/ で公開している、MS Windows 上で動くソフトウェア。

- 4 -
- 4A -
1970-80年代に計算機プログラミングをならった人のおおくは

"Go to" statement considered harmful.

というもんくを知っている。日本語でいえば

「go to」文は有害だと考えられる。

となる。当然ながら、これは今回の政策を批判するもんくとして応用された。

これは論文 (ただし「論じる文」であって研究成果報告ではない) の題名だった。

これはプログラム言語の設計に関する話だ。かつて、計算機プログラムは、機械に実行させる命令を順にならべたものだった。しかし、実際には条件つきの処理やくりかえしなどが必要だから、プログラム上のどこ「に 行け」(go to) またはどこに「とべ」(jump) という命令が用意された。しかし、これを自由につかうと、読んでも実行時の制御の流れがわからないものになる。

そこで、「条件つきの処理」や「くりかえし処理」のための構文をもつプログラム言語が設計された。そうすると、もう「go to」文は いらない、といえるだろう、というわけだ。

Dijkstraの原稿の題名は、”A case against the goto statement" だったのを、編集長 Wirth がかえてしまったのだそうだ。Dijkstraの態度は、自分は 「go to」文をつかわないようにしようというたちばだが、反対のたちばもあることはみとめたものだったが、Pascal言語の考案者でもある Wirth のほうが明確な「go to」文排除論者だったようだ。

わたしは、1993年度の教材として、[プログラミング言語のはなし 1. 制御構造を中心に]という文章を書いた。いまだったら表現をかえるところはあるが、基本的主張はいまもかわらない。

- 4B -
1970年代の末、わたしが計算機をつかいはじめたころ、その専門分野では、プログラム言語としては Fortran をつかう必要があった。当時のコンパイラでつかえた Fortran は、Fortran 66 標準 (1966年に案がまとまったアメリカ標準) にしたがったもので、単独の命令を条件つきで実行する if 文はあったが、if-else構文はなかったし、くりかえし回数がきまった do ループはあったが、条件がみたされるまでくりかえすループの構文はなかった。だから、仕事をするためにはどうしても「go to」文が必要だった。

(なお、Fortranでは、文字列の内側をのぞいて空白には意味がなかったから、「GO TO」と書いても、「GOTO」というひとつのキーワードとして認識された。だから、「goto文」というべきかもしれないが、英語の単語と対応づけたいし、後藤さんとは区別したいので、「go to 文」と書いておく。あとででてきた「end if」「end do」も同様である。また、Fortran 66の標準にふくまれていたアルファベットは大文字だけだったのだが、つぎにのべる Ratfor のプログラムは、文字列内をのぞいて大文字と小文字の区別がないことを前提に、小文字で書かれていた。わたしはそちらにしたがって、小文字で書く習慣ができた。いまもその習慣によって小文字で書いている。ただし、実際に Fortranプログラムを書くときは、Fortran言語として意味をもつ語は大文字、変数名は小文字、として区別する習慣もできた。)

そこで先輩からおそわったのが Ratfor だった。Kernighan & Plauger の Software Tools の本で、例文を記述する言語だった。そして、Ratforで書かれたプログラムを Fortran (Fortran 66) に書きかえる方法も、教材の到達目標にふくまれていたのだった。Ratfor 言語には、if-else 構文や、ループをつくる while 構文が、Awk や C とだいたい同じ形でふくまれていた。わたしはその本の日本語版がでるまえに英語で読んだ。Ratfor は わたしにとって native 計算機言語になった。

1980年代、Fortran 77 標準がコンパイラに実装されて、「ブロック if文」( if-then-else-end if ) がつかえるようになった。ループの構文はまだ標準化されておらず、コンパイラメーカーがすこしずつちがった構文で実装した。次期標準 Fortran 8X は仕様がふくれすぎて(新しいプログラミングの発想もつかえるとともに過去のプログラムがつかえる互換性をもたせようとしたからだろう) 決定がおくれ、結局 Fortran 90 になった。そこには、「do while ... end do」というループ構文がふくまれていた。しかし Fortran 90 のコンパイラは、大型の数値計算をする人たちにはつかわれたけれども、あまり普及しなかった。わたしにとって do...end do を追加した Fortran 77が日常の言語になった。

文献

  • Brian W. Kernighan & P. J. Plauger, 1976: Software Tools. Addison-Wesley.
  • [同、日本語版] Brian W. Kernighan & P.J. Plauger 著, 木村 泉 訳, 1981: ソフトウェア作法。共立出版。

- 4C -
Kernighan と Plauger は、Fortran のプログラムを添削する本も書いていた。「go to」文をさけられない Fortran 66 をつかいながらでも、条件つき処理やくりかえしの構造を意識して、「go to」を定型的につかえば、わりあいわかりやすいプログラムになる。

わたしは Fortran 66時代のプログラムを再利用することがよくあった。しかし、読んでながれがわかりにくいプログラムをそのままつかう気にはなれなかった。『プログラム書法』を手本として、あたまをひねって、「go to」で書かれている制御のながれを、条件つき処理やくりかえし処理のくみあわせでくみなおし、Fortran 77 に「do while」構文をつけくわえた自分の常用言語のプログラムにすることを、命令されてではなく、自発的にやった。いわば、わたしは 「「go to」はずし職人」だった。1970年代以前のFortranプログラムの再利用が必要ならば、こういう職人をよびだしてくれるとよいかもしれない。([2013-08-01 ベテランプログラマーの出番か? 応用科学史家の出番か?]にもそんなことを書いた。)

文献

  • Brian W. Kernighan & P. J. Plauger, 1974; second edition 1978: The Elements of Programming Style. McGraw-Hill.
  • [同、日本語版] Brian W. Kernighan & P.J. Plauger 著, 木村 泉 訳, 1976; 第2版 1981: プログラム書法。共立出版。

- 4D -
実際の計算処理のプログラムを書いてていると、条件つき処理とくりかえしの構文があっても、「go to」をなくしにくいばあいがある。

第1は、例外的事態がおきたときの処理だ。Fortran 77 までのFortranにはなかったが、1980年代以後に設計されたプログラム言語では、そのための構文をもつものがある。(Fortran 90 以後のFortranにもあるのかもしれないが、わたしは知らない。)

第2は、ループを脱出する処理だ。たとえば Ratfor では、このために break 文を用意したので、直接「go to」をつかわないですむ。ただし、多重ループの中にいるとき、いくつめまでをぬけるのかを指示できる構文をもっているプログラム言語はすくない。それがないと、プログラム中にラベル(Fortranでは「文番号」)をおいてそこへの「go to」で表現する必要が生じる。

【プログラムがこみいってよければ、ループ脱出のかわりに、みかけ上ループを正常に終了する形に書くことはできる。脱出したい条件が生じたら「旗をあげ」(ある論理型変数の値を偽から真にかえ)、そこからあとの処理を「もし旗があがっていなかったら」という条件つきにすればよいのだ。しかし、このしかけをするのにはてまがかかるし、しかけをしたプログラムは読みにくい。】

- 5 [2024-03-30 補足] -
プログラム言語の「go to」という文を対象として論じるとき、「go to 文」と書くことがある。英語でも (Dijkstra の論文の題名のように) 「go to statement」と書いてしまうことがあるが、これをすなおに読むと、(「statement」の訳語が「文」でよいとして) 「文に行け」という意味にとられるだろう。まぎれないためには「"go to" statement」のように引用符でくくっておくべきだろう。

プログラム言語によっては、空白をあけない「goto」というキーワードにしてしまっていることがあり、それにしたがえば (Dijkstraの題名の原案のように) 「goto statement」になって、英語としては見なれない形の語をふくむが、人はふつう見なれない語を名詞だと想定して読むから、名詞・名詞の複合語という、書いた人が想定した構造にみちびかれるだろう。ただし、別の意味の「goto」ということば (たとえば後藤さんや五島列島) を知っている人は、ちがった意味をかんがえてしまうかもしれない。【英語では固有名詞ならば最初の文字を大文字にするが、文の頭では固有名詞でなくても大文字にするのでまぎらわしくなる。プログラム言語のなかの語の大文字・小文字の区別は、言語ごとに事情がちがい、ここには書ききれない。】