見出し画像

Retro-gaming and so on

ループ構文の話

教えて!gooに次のような質問があがっている。



これは実はプログラミングの質問じゃなくって英語の質問だ。
for + 期間、と言う用法がある。
Longman Dictionaryには次のように紹介されている(※1)。



この例は全てfor + 期間だ。for a week、とかそういう類の用法で、ハッキリ言うけど中学英語の質問だと思う。
まぁ、詳しい説明はひょっとしたらもとこんぐさんの方でやってくれるかもしんない。知らんが(笑)。
いずれにせよ、この質問については以上で終了、だ。

ところで、一体何故に、誰がforを選んだのか?と考えるとこれがなかなかややこしい。
と言うか、ハッキリ言っちゃえば、forループ、と言う言い方には語弊がある。こういう「単語の選択」と言うのは言っちゃえば蓋然性の話であって、決してそうじゃないとならないと言う意味じゃない。たまたま広く使われるようになった、ってだけの話だ。
では一体いつ、デファクトスタンダード的なforループ、が現れたのか。
ちと調べてみた。

世界初の高級言語がIBMのFortran(※2)ってのは良く知られた所だろう。元々はIBM 704と言うミニコン向けに作られた処理系だ。
Fortranの開発自体は1953年辺りに始まったらしいが、「カタチになって日の目を見た」のは1957年前後らしい。

IBM 704

ところが、これ用のFortranのマニュアルってのが現存してるが、読んでみてもこれがサッパリ意味が分からない(笑)。当時だと、言語処理系をテープに積んでたのか、言語仕様の話をしてるんだか、そのテープの操作法を記述してるのかがイマイチピンと来ないんだ。混ざってる(苦笑)。
要するに、テープのどの部分にどの機能を積んでるのか、と言うような話が絡んでて、すんなりアタマに入ってこないんだ。しかも今のマニュアル/仕様書と違ってどういう関数があって、と言うようなインデックス的な記述も無いし、冗長な文でダラダラと書かれてる。まるでポエムだ。こりゃアカン。
何だ?当時はプログラム書いて実行してる最中にテープを早回ししたり巻き戻ししたりして「該当の」機能でも呼び出してたんだろうか。全く想像の範疇外だ。
FM-8とかPC-8001でのカセットテープを思い出す人もいるかもしんないが(もっとも、当時のコンピュータで使われてたのは当然カセットではなくオープンリールのデカイヤツだったろうが)。しかし、プログラム実行中にリアルタイムにやってた、としたら随分なシステムだ。
よって、これを参照するのは諦めた。
次にもうちょっとマシな書き方になってるのはIBM 1401のFortranだ。恐らくコンパイラ自体はIBM 704登場のすぐ後、1957年から1958年の間に登場してると思う。


IBM 1401

このマニュアルで初めて「繰り返し機能」に関してハッキリとした記述が現れる。


そう、最初に登場した高級言語のループ構文はDOループなんだ。
この辺でLisp系言語を学んだ事がある人は、

「なるほど、Lispの反復構文がdoなのは、Fortranの影響か」

と納得するだろう。
が、しかし。
世界で二番目に登場した高級言語(※3)、最初のLispは恐らく1958年頃に現れてるし、殆どFortranと同時期に登場した、と考えてイイんだが、最初のLispはマシン語で書かれた上にどうやらFortranの拡張システムの意味合いが強かったらしい(※4)。加えると「キチンと皆が使える」プログラミング言語として発表されたのはもっと後になる。
それまではMITの中でひっそりと使われるだけ、だったようだ。
初めて人々の前に姿を現したLispはLisp1.5と呼ばれる処理系だ。
ハッキリした登場時期は分からないが、恐らく1960年前後だと思われる。
そして、そのマニュアルを見ると実はDOがない。Lispは再帰をサポートした初めてのプログラミング言語だった為、特別な反復処理は必要ない、と言う割り切った設計になっている。
そしてそれが故、Fortranに慣れたプログラマを大混乱させるんだ(笑)。




マニュアルにはLispを学んだ層には既にお馴染みになってる関数が結構な確率で掲載されている。しかも全部再帰してる
そしてマニュアルなのに、関数定義を出して説明する、と言うのもこの頃からの伝統だと分かる(笑・※5)。
なお、Lispのマニュアルの筈なのに、不可思議な表記法が頻出してるが、これをS式に対してM式と呼ぶ。SMだ(笑)。
M式はMeta Expressionの略で、本来なら、マシン語としてのS式と(※6)、フツーのプログラミング言語としての「ガワ」であるM式のコンビで、プログラミング言語処理系となる予定だった。
ところが、M式は完成しなかった。MITのハッカー等はS式で直にプログラミングする事を好んだからだ。
結果、M式は、80年代半ばくらいまで、Lispの解説本でLispを説明するだけに登場する事となる。

上のLisp1.5で定義されてる関数群をRacketで翻訳すると以下のようになる。



コーディングスタイルはさておき、今でも現役で使える定義群だ。
ちなみに、この時点でのmemberは、真偽値を返すようになってて、今のLispみたいに「引っかかったitemを先頭とするリストを返す」ようにはなってない。
結果、memberが発明された当初は、これは述語だったんだけど、その後の改良の過程で今現在Lisp系言語で見られるmemberへと進化していったんだろう。
いずれにせよ、特別なループ構文を必要とせず、再帰一本槍でループを実現する、と言うのが当初からのLispのコンセプトだった、と言う事が読み取れる。

また、この時点、つまり高級言語黎明期の1960年前後で、既にLispは高階関数を実装してて、今現在のmapの類、がイテレータとして提供されていた、と言うのも驚嘆に値する。



今現在のLisp系言語と違い、map系は単なる二引数関数だった事が読み取れる。また、引数順序が違う。第一引数がリストで、第二引数が関数となっている。
また、ANSI Common Lispのmapcar、SchemeのmapにあたるのがLisp1.5のmaplistだ。そしてmapconmaplistの破壊的変更版だ。
Lisp1.5のmapはむしろANSI Common Lispのmaplistmapconに近い、が、と同時にmapcとの間の子みたいになっている。つまり、副作用目的で、そこだけ見るとSchemeのfor-eachの変種みたいな立場になっている。
名前だけ見ると、今の知識からすれば相当混乱するだろう。
Racketで書くと、次のように翻訳出来るだろう。



mapconは作用的にはmaplistと同じなので省いた。
しかし、mapcall/ccが多用されて恐ろしく読みづらい。
一方、恐ろしい事に、Lisp1.5のmapはANSI Common Lispだと少々手を加えるだけで再現出来てしまう。


これはANSI Common Lispが確かにLisp1.5から続く伝統を基本的にそのまま受け継いでる、からだ。progも生きてるし、goを使ったジャンプ構文もそのまま使える(※7)。まさしくCommonを冠にするのにふさわしい仕様になってるんだ。

いずれにせよ、mapdoより古い
そして再帰を備えたLispはFortran的な反復構文を持つより、関数としてのイテレータを持つ事を選んだ、んだ。

さて、世界で3番目に現れた高級言語がCOBOL(※8)だ。登場は1959年、と言われている。
ただ、厳密にこれが3番目かどうかは分からない。
と言うのも、これの試作と思われる言語が既に2つか3つ程ある。
プログラミング言語と言うよりも「データ処理言語」と言われたこれらは、結果、チューリング完全じゃなかったのか否か。
今となっては資料が残ってるのかどうかも分からんのでなんとも言えない。
言えるのは、これらはビジネスシーンで使う事に特化された言語として設計されていた、と言う事。
そして、弾道計算を行う為に開発されたデジタル・コンピュータ、ENIACが登場したのが1946年(終戦後・笑)なんだが、それから10年弱で既に「一般の会社等でコンピュータを使わせよう」と言う気運が出てきた、って事自体が凄い。要するに今で言う(っつーか既に死語か・笑)オフコン(※9)の走りが既に考案されてたわけだ。
さて、そんなCOBOLのループ構文とは如何なるものか。
恐らく初めてのCOBOLのマニュアル、1960年発表のCOBOL reportを見てみると・・・・・・



スゲぇ! Performだぜ?
想像の斜め上だ(笑)!


あんた、そりゃPerfumeだ(謎

いや、驚くだろ?
この時点までforの欠片も出てこない(笑)。


フォー!!!

そう、ここまで出てないんだ。
じゃあ、あの、有名なBASICだとどうなのか?
実はここまで、怒涛のように1950年代後半から1960年まで「プログラミング言語がにょきにょき生えてきた」時期の話になってんだけど、BASICは数年違いだが、この「カンブリア紀」とはちと離れた時期に誕生してる。1964年だ。「遅れてきた男」だ。
そして実はこの登場時点で・・・初めてのBASICはダートマスBASICと呼ばれ、Fortranの構文を基本的には受け継いでる、って言われてるんだが、何と、Fortranには無かったFORループが唐突に登場してるんだ。



ほら。ここでいきなり「ループ構文」としてFORが登場してる。
じゃあBASICが始祖なのか・・・?と言うとそんな事はない。1950年代末期から1964年の間に、歴史的には重要なプログラミング言語が提案されている。世界中の計算機科学者が一同に会して、「会議により」作り出したプログラミング言語で、なおかつ実装が困難だった為に市場に全然出回らなく、幻として消えた言語・・・・・・。
そうだ、ALGOLだ(※10)。
結論から言うと、ループ構文(用キーワード)として初めてforを提案したのはALGOLなんだよ。つまり戦犯はALGOLだ(笑)。
1958年に発表された一番最初のALGOL 58のドラフトには次のような事が書かれている。


ほら来た、for文だ。
ここで初めてループ構文のキーワードとしてforが採用され、ここの間接的な影響で、BASICにforが導入され、ALGOLの直系のPASCALにもforが入り、そして傍系っぽいC言語にforが入り、forがループ構文の代表的キーワードとして拡散するわけだ。これが歴史だ。
なお、このページにはもっと面白い事が書いてあった。
実はALGOLの前に、スイスで実験的な高級プログラミング言語、Superplanと言うのが開発されていて、実はコイツの登場はFortranより早い(1951年)。
「え?」とか思った。つまり、アメリカから入ってきてた情報は意図的に間違ってたのか(笑)。
そして、その言語の繰り返し構文がドイツ語のFürだったんだと。
つまり、ALGOLの策定をする際に、そのSuperplanで使われてたFürでのループ構文にしたくて、ドイツ語の代わりに英語のforを採用した、と言うビックリの話が書かれてある。
いや、俺はビックリしたぞ。
アメリカよりドイツ系が先行してたんかい!とかマジで驚いた。
だから言ったろ?ヨーロッパの計算機界隈で何が起こってるか、とか日本じゃ正確に掴めないんだって。
これ豆知識でトリビアだ。人に「プログラミング言語のforってさぁ、元々ドイツ語の・・・」とか言えば自慢できるかもしんない。キャバクラとかで(笑)。いや、ウケるかどうかは知らんがな(笑)。

なお、ANSI Common Lispのloopだったらforfromtoを組み合わせてCOBOLもかくや、って程の英語解釈力がある事を書いておいて、この項を終わる事としよう。



※1: おっそろしい事に、Web上のフリー英和辞書には全くこの用法が載ってない。
驚いた。
やっぱりWeb上フリー英和辞書はアテにならん。やっぱりキチンとした「本の」辞書じゃないとダメなんだ。

※2: FortranはFormula Translating System、すなわち「方程式翻訳機」の略称だ。
まさしく科学計算用、として産声をあげたんで、厳密に言うと、「汎用プログラミング言語」として生まれたわけではない。

※3: Lispが「影響を受けた」プログラミング言語にIPLと言う言語が存在するが、「世界で二番目に登場した高級プログラミング言語なのにFortran以外のプログラミング言語に影響を受けた?」と混乱する人もいるだろう。
しかし、IPLは高級言語ではなく、実験目的で作成されたアセンブリ言語の一つだ。

※4: 「最初のLisp」もIBM 704用の処理系だった。

※5: この小冊子にはevalの定義を含めて全部載っている。
だからこそこの小冊子が出版されてからすぐさま、全米中の大学や研究所で実際Lispを簡単に実装し、それぞれ拡張されて広まっていき、結果、日本にも飛び火した。
Lispが「方言だらけ」と言う礎を築いたのは、この小冊子の「余すトコなく全部公開した」方針に拠るところが大きい。

※6: いわゆるLisp特有の「カッコだらけの」表記法、S式はそもそも「人間でも読み書きしやすいマシン語」として提案された。

※7: Lisp1.5には「fortranプログラマ向け」を意図して、ジャンプ構文も実装されている。
この時代は、いわゆるgotoを多用してジャンプを行う、と言うのも至極フツーに行われていて、今の「プログラミング書法」や「作法」とはだいぶ趣が違う。

※8: COmmon Business-Oriented Language、つまり共通ビジネス指向言語、の略称。「プログラミングの為のプログラミング言語」と言うより、ビジネスでフツーの人がすぐ使える事を念頭に置かれて設計された為、プログラミング言語と言うよりはそのまま「英語の文章」として読み書き可能なように作られている。
今ではマイナーに思われるが、一方、銀行システムとか、裏方として現在でも広く使われている。
なお、データベース用クエリ言語として名高いSQLが、何故にあんなにクソで冗長なのか、と言うと、そもそもデータベースこそがビジネスに使われやすいソフトウェアなので、結果、COBOLと合わせて使われる事を想定し、COBOLを書くのと違和感が無いように設計された為だ。
逆にそのせいで、SQLの構文は「フツーのプログラミング言語」からは異様に浮いてるように見えるわけ。
ちなみに、COBOLの中心開発者は実は女性で、殆ど歴史上初めて現れた女性ハッカーだと言えよう。

※9: オフィス用コンピュータの事。会社で使う為のミニコンだ。
ちなみに、これで有名なOSがCP/Mで、Microsoftが作った(と言うか買収した)OS、MS-DOSはこのCP/Mのクローンだった。
結果、オフコンでCP/Mを扱った人たちが「新しく勉強する必要がない」MS-DOSを歓迎したため、あっという間にパソコンではMS-DOSが事実上の標準として広まって使われ、それが現在のWindows隆盛の礎になっている。

※10: 怪物の名に聞こえるが、そうじゃなくって元々はALGOrithmic Language、つまり「アルゴリズム言語」の略。
なお、Schemeの仕様書(RnRS)のタイトル、

Revised n Report on the Algorithmic Language Scheme

ってのは実はこのALGOLの仕様書(Report)のパロディとして始まっている。
そしてALGOLのパロディとして、Schemeは「プログラミング言語」ではなく「アルゴリズム言語」と名乗ってるわけだ。
(もちろん、悪意から、ではなく、史上初めて「レキシカルスコープ」を提案したALGOLへと敬意を払って、だ)

  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「プログラミング」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事