T1#research
A-0 システム ── 「コンパイラ」という語がまだ別の意味だった頃
メタデータ
- 日付
- 年代
- 1950s
- Tier
- T1
- 出典数
- 05
- 関連項目
- 01
- Tags
- #research
1952年5月、 ピッツバーグで開かれた ACM の全国大会で、 Remington Rand の Grace Hopper が「The Education of a Computer」と題した論文を読んだ。 そこで説明されているのが A-0 である。 UNIVAC I の上で春から動いていた。
この仕事は「最初のコンパイラ」として語られることが多い。 その言い方は間違いではないが、 正確でもない。 1952年の compiler は、 いまの compiler とは違うものを指していた。 そこを踏まえないと、 A-0 が何を解いたのかが見えなくなる。
A-0 が実際にしたこと
Hopper 自身の論文は、 A-0 に相当するものを compiling routine of type A と呼び、 それが各演算に対して行う仕事を9項目で列挙している。 抜き出すとこうなる。
- 呼出番号(call-number)で指定された副ルーチンを探し当てる
- 作業記憶から副ルーチンへ引数を渡す命令を組み立て、 プログラムに書き込む
- 副ルーチンがプログラム中で置かれた位置に合わせて、 入口と通常の出口を調整する
- プログラマが与えた制御情報に従って、 代替の出口を調整する
- 副ルーチン内の命令のアドレスをすべて付け直し、 それらの命令をプログラムに書き込む
- 各副ルーチンの呼出番号と入口の位置を記録として保持する
一時記憶とプログラム領域の確保も、 入出力の制御も、 このルーチンが持つ。 論文はそれを一文でまとめている ── 「率直に言えば、 compiling routine こそがプログラマであり、 完成したプログラムを作り出すのに必要な作業のすべてを行う」("Stated bluntly, the compiling routine is the programmer and performs all those services necessary to the production of a finished program.")。
この一覧が何を置き換えたのかを見ると、 意義がはっきりする。 副ルーチンの図書館という考え方自体は先にあった ── Hopper の論文は、 1946年に Howard Aiken が Mark I のマニュアルで述べたものだと明記している。 問題は使い方だった。 人間が目当ての routine の置き場所を調べ、 書き写し、 プログラム中の新しい位置に合わせて内部のアドレスを一つずつ書き換える。 遅く、 単調で、 転記ミスが量産される作業である。 A-0 はそれを機械の側へ移した。 論文はプログラマ側の見返りをこう書く ── 「いずれの場合も、 数学者は『操作 k へ行け』と述べるだけでよく、 あとは compiling routine がやる」("In any event the mathematician need only state, 'go to operation k', and the compiling routine does the rest.")。
この9項目を今日の語彙に置き換えると、 シンボル解決・再配置・呼出規約の生成 であって、 構文解析でも意味解析でもコード生成でもない。 IEEE が2024年5月7日にペンシルベニア大学 Moore School へ建てたマイルストーン銘板も、 A-0 を「リンカ/ローダとして機能した一連の仕様」と記している。
それでも「コンパイラ」で正しかった理由
当時 compile という英語は、 図書館から資料を集めて一冊に綴じる という日常の意味で使われていた。 副ルーチンはテープの図書館に置かれ、 それぞれに呼出番号が振られている。 そこから必要なものを引き出して1本にまとめる作業を compiling と呼ぶのは、 1952年の英語としてまったく自然だった。
現代の意味 ── 高水準言語の原文を機械語へ翻訳する ── が compiler の第一義になるのは、 FORTRAN 以後である。 語が引っ越したあとで、 引っ越す前の用例を現代の意味で読み直したことが、 通説のずれの正体である。
「最初」に付ける限定
同じ時期に、 同じ問題の別の面を解いた仕事が並んでいる。
| 年 | 誰 | 何 |
|---|---|---|
| 1951 | Corrado Böhm(ETH Zurich) | 学位論文で言語とその翻訳系を記述。 実装はされていない |
| 1951–52 | Grace Hopper(Remington Rand) | A-0。 副ルーチンの図書館を機械に管理させる |
| 1952 | Alick Glennie(マンチェスター大学) | Mark 1 向けの Autocode |
Wikipedia のコンパイラ史の項は、 現代の意味でのコンパイラとして最初に実装されたのは Glennie の Autocode だとし、 Donald Knuth も Autocode を最初のコンパイラとみなしたと記す。 一方で A-0 は、 実装され、 稼働し、 顧客のいる商用機の上で動いていた。 どちらが先かは、 「コンパイラ」をどう定義するかで決まる。 定義を書かずに「最初」と書くのが、 いちばん質の悪い書き方である。
本当の争点
A-0 の意義は先着順ではない。 1952年に Hopper が言っていたのは、 プログラムを書く作業そのものを機械にやらせてよい ということだった。 当時それは自明ではなかった。 計算機は算術をする装置であって、 プログラムを作る装置ではない、 というのが常識である。
論文の結びで、 彼女はこう書いている ── 「より進んだ話題についての専門知識を少し加えれば、 UNIVAC は現在、 大学2年生と完全に同等の、 十分に基礎の固まった数学教育を受けており、 しかも忘れることも間違えることもない」("With some specialized knowledge of more advanced topics, UNIVAC at present has a well grounded mathematical education fully equivalent to that of a college sophomore, and it does not forget and does not make mistakes.")。 機械を学生に見立てる比喩は、 論文の題名からして貫かれている。
その先
A-0 は A-1、 A-2 と改訂された。 IEEE Computer Society の記録によれば A-2 は1953年である。 A-2 の原始コードは顧客に配られ、 改良を送り返すよう促された ── オープンソースという語が生まれる40年近く前の話である。 系統は ARITH-MATIC と MATH-MATIC を経て、 1957年の B-0(FLOW-MATIC)へ至る。 その FLOW-MATIC は、 COBOL の最初の仕様 が着想の源として挙げた三つのうちの一つになった。
現在のあらゆる高水準言語が前提にしている「人間の書いたものを機械が翻訳する」という層は、 ここから一度も外されていない。 A-0 がその層の最初の実装だったかどうかは定義次第だが、 その層を置いてよいと主張した最初の実働システムの一つ であったことは、 定義に依らない。
出典
最終更新: