T1#research#standard

Simula 67 ── クラスと継承が言語に入る

1964年夏、ノルウェー計算センターの UNIVAC 1107 を訪れた米欧からの見学者。最上段の左端が Kristen Nygaard
出典Norsk Regnesentral / eds. Lars Holden and Håvard Hegna (Wikimedia Commons) · CC BY-SA 3.0 · Commons で見る

メタデータ

日付
年代
1960s
Tier
T1
出典数
06
関連項目
05
Tags
#research#standard

1967年5月、 オスロ郊外リセブ(Lysebu)で IFIP TC2 のシミュレーション言語に関する作業会議が開かれた。 議長は Ole-Johan Dahl。 彼と Kristen Nygaard が提出した論文の題は "Class and subclass declarations" ── クラスとサブクラスの宣言、 である。

現代のプログラミング言語の大半が持っている概念の系譜は、 ここから引ける。

前史 ── シミュレーションから来た

出発点は言語設計ではなく、 待ち行列だった。

Kristen Nygaard はノルウェー国防研究所(NDRE)でモンテカルロ法によるシミュレーションを扱っていた人物で、 1960年にノルウェー計算センター(Norsk Regnesentral、 NCC)へ移る。 複雑な動的システムを、 当時の水準よりはるかに高い抽象度で記述できる記法が欲しい ── それが動機だった。 1962年1月の書簡で彼は、 待ち行列系の記述方法についてはかなり明確な考えができたと書いている。 その翌日に会う「腕のいいプログラマ」が Dahl だった。

1962年8月、 二人はミュンヘンの IFIP 世界会議でこの構想を発表する。 この段階(後に「Simula 0」と呼ばれる)では、 系は固定数の「ステーション」とその待ち行列に並ぶ「カスタマ」でできており、 ALGOL コンパイラの前処理系として実装するつもりだった。 実装はされていない。

つまずいたのは ALGOL の後入れ先出し(LIFO)方式である。 手続き呼び出しがスタック規律に縛られていては、 生存期間の異なるオブジェクトを扱えない。 二人はコンパイラの中に踏み込み、 ヒープとごみ集めを導入した。 その自由を得た瞬間に、 言語は一般化できると見えた ── 能動的なステーションと受動的なカスタマを、 「プロセス」というひとつの概念に統合したのである。

Simula Iactivity というキーワードで宣言される「プロセス」を持つ)は1964年3月に定義が固まり、 UNIVAC 1107 用 ALGOL コンパイラを作り替える形で1965年1月に実装が完成した。 主導したのは Dahl で、 Bjørn Myhrhaug と Sigurd Kubosch が参加している。 この時点で、 動的なオブジェクト生成、 参照カウント方式のごみ集め、 コルーチン的な擬似並列実行、 オブジェクト外部からの属性・手続きアクセスが揃った。 ただしサブクラスは無い。 ポインタは型を持たず、 実際の型を調べるための inspect ... when という不格好な構文が必要だった。

1966年終盤の突破

Simula I を実際に使ってみると、 シミュレーション以外にも使えることがわかり、 汎用言語への一般化が始まる(1965年1月〜1967年夏)。

火をつけたのは C.A.R. Hoare が Algol Bulletin 21号(1965年11月)に書いたレコード操作の提案だった。 レコードを「レコードクラス」で記述し、 その拡張として「レコードサブクラス」を導入する。 さらにポインタ変数をクラスで型付けし、 そのクラスと下位クラスのレコードだけを指せるようにする ── 型安全と柔軟性が両立する。

だが Hoare の案では、 クラスとその全サブクラスをひとつの閉じた構文単位に書く必要があった。 これが Dahl と Nygaard の他の要求と噛み合わない。 行き詰まりが解けたのは1966年の終盤で、 サブクラスは、 スーパークラスが宣言された場所とは独立に宣言してよいという原理を見つけたときである。 構文は C class D(...); begin ... end ── C を D の「接頭辞(prefix)」として書く。 Simula 系の文献で「prefix class」という言い方が出るのはこのためだ。

これが何をもたらしたか。 汎用のクラスを別々に書いて公開ライブラリに置き、 利用者がそれぞれの用途に合わせてサブクラスを書ける。 Simula I のシミュレーション機能一式を Simula 67 の「パッケージ」として書き直せたのも、 この形のおかげだった。 属性参照は Hoare の attribute(pointer) ではなく、 現在おなじみのドット記法が採られた。

仮想手続きは締切のあとに来た

論文は1967年3月に締切ぎりぎりで提出された。 仮想手続きの案がまとまったのは、 そのである。

問題は具体的だった。 クラスは手続きと同様に仮引数を持てるが、 技術的理由から手続きを引数に取れない。 しかし「同じ文を、 オブジェクトごとに少し違う効果で実行したい」という要求は明らかにある。 議論の末、 クラス C の手続きを virtual と宣言すればサブクラス D で再定義でき、 D のオブジェクトでは C のコードから呼んだ場合でも再定義のほうが効く、 という仕組みに落ち着いた。 同じ呼び出しが違う版の手続きを起動する。 この提案はリセブの会議にぎりぎり間に合い、 論文の最終版に入っている。

現代の言語で「仮想メソッド」「動的束縛」と呼ばれるものは、 この数週間の産物である。

凍結、 そして実装

1967年5月、 Control Data と実装契約が結ばれた ── KCIN が CDC 3600 向け、 オスロ大学が CDC 3300 向け、 パリの Control Data 自身が CDC 6000 系向け。 6月には NCC で「Simula 67 Common Base Conference」が開かれ、 Simula Standardization Group(SSG)が設置される。 このとき Dahl と Nygaard は「名前付きの inline オブジェクト」(クラスを通常の変数宣言の型として使う)を追加提案したが、 実装陣に否決された ── 実装量がすでに十分多かったからである。

言語が正式に凍結されたのは、 SSG が 1968年2月10日に承認した「Simula 67 Common Base Language」報告(NCC 刊行物 S-2、 1968年5月)による。 その改訂版 S-22(1970年10月)の扉には、 SIMULA が Norwegian Computing Center の商標であること、 著作権が NCC にあることが明記されている ── 同じ1960年代に無償で配られた BASIC とは対照的な扱いである。

Control Data の各コンパイラは1969年春に完成。 NCC はその後 UNIVAC 1100 系(1971年3月)と IBM System/360 / 370 系(1972年5月)への実装を仕上げた。

二本の系譜 ── Smalltalk と C++

Simula 67 に無かったものも書いておく。 多重継承は入っていない。 「オブジェクト指向プログラミング」という言葉自体、 後年 Xerox PARC の Alan Kay が使い始めたもので、 Dahl と Nygaard の用語ではない。 したがって「世界初のオブジェクト指向言語」という言い方は慎重に扱うべきで、 IEEE のマイルストーン顕彰文が採っているのは「カプセル化・継承・遅延束縛・動的なオブジェクト生成という、 今日オブジェクト指向言語に不可欠とされる要素をすべて導入した」という書き方である。

系譜は二本ある。 一本は Alan Kay が1970年代に PARC で Simula の着想を取り込んだ Smalltalk。 もう一本は C++ で、 Bjarne Stroustrup は HOPL-II の論文の冒頭で、 C++ は Simula のプログラム構成機能と、 システムプログラミングのための C の効率と柔軟性を併せて提供するよう設計された("C++ was designed to provide Simula's facilities for program organization together with C's efficiency and flexibility for systems programming.")と書いている。 彼は博士研究のシミュレータを Simula で書いた経験から、 クラス概念が応用側の概念を直接そのまま言語構造へ写せる点に感銘を受けたと述べている。

Dahl と Nygaard は2001年の ACM Turing 賞と2002年の IEEE John von Neumann メダルを共同受賞した。 2017年9月27日、 オスロ大学に IEEE マイルストーン「Object-Oriented Programming, 1961-1967」の銘板が掲げられている。

最後に、 二人の仕事のやり方について。 HOPL の論文で彼ら自身が書いていることが、 いちばんよく彼らを説明している ── 研究チームによっては新しい着想は大切に扱われ、 「面白い!」「美しい!」と言われる。 Simula の開発ではそうではなかった。 一方が新しい着想を思いついたと言うと、 もう一方は顔を輝かせてそれを潰しにかかった、 と。

出典

  1. 三次資料Simula — Wikipedia

    取得日: 2026-08-12

最終更新:

共有