アラン・ケイ氏は、「私は「オブジェクト指向」という用語を作り上げたので、C++を考えていなかったと言えるでしょう」と述べています。もちろん、彼が考えていたのはSmalltalkでした。しかし、彼はオブジェクト指向プログラミング自体を構成していませんでした。彼はSimulaから基本的なアイデアを得ました。では、この用語がまだ発明されていないのであれば、当初Simulaでオブジェクト指向プログラミングを何と呼んでいたのでしょうか。
実際、アラン・ケイ Smalltalkは考えていませんでした 彼が「オブジェクト指向プログラミング」という用語を思いついたとき:
11月66日後のユタで、Sketchpad、Simula、ARPAnetの設計、Burroughs B5000、および生物学と数学のバックグラウンドの影響を受けて、プログラミングのアーキテクチャについて考えました。誰かが私に何をしているのかと尋ねられたのはおそらく1967年で、私は「オブジェクト指向プログラミングです」と言った。
当初の発想には以下の部分がありました。
- 私はオブジェクトがネットワーク上の生物細胞や個々のコンピューターのようなものであり、メッセージとしか通信できないと考えました(そのため、メッセージングは最初から始まりました-プログラミング言語でメッセージングを行う方法を確認するのに十分時間がかかるので、便利である)。
- データを取り除きたかった。 B5000は、ほとんど信じられないほどのハードウェアアーキテクチャを介してこれをほぼ実現しました。セル/コンピューター全体のメタファーはデータを取り除き、 "<-"は単なる別のメッセージトークンになることに気づきました(これらのすべての記号を関数と手順。
- 私の数学の背景から、各オブジェクトには複数の代数が関連付けられている可能性があり、これらの代数が存在する可能性があること、およびこれらが非常に役立つことがわかりました。 「ポリモーフィズム」という用語はずっと後に課されたもので(ピーターウェグナーによると思います)、それは実際には関数の命名法に由来するため、あまり有効ではありません。ジェネリックな振る舞いを準代数的形式で扱うために、「ジェネリシティ」という用語を作りました。
- Simula IまたはSimula 67が継承を行う方法が好きではありませんでした(ただし、NygaardとDahlは途方もない思想家とデザイナーであると思っていました)。そのため、私はそれをよりよく理解するまで、継承を組み込み機能として除外することにしました。
Smalltalkはこの概念の結果であり、 "The Simula languages"の説明 で説明されているように、Simulaから「オブジェクト」と「クラス」の概念を借用および拡張したものです。 Kristen NygaardおよびOle-Johan Dahl(1978年、253ページ):
ALGOLでは、ブロック(プロシージャを含む)は外部では一般化された操作と見なされます。準並列シーケンスのメカニズムを導入することにより、本質的に同じ構成が並列にプロセスの役割を果たすことができ、ブロックインスタンスに名前を付けてそのコンテンツにアクセスするメカニズムを通じて、それらは一般化されたデータオブジェクトとして機能できます。単一の構成でデータと操作を組み合わせることの本質的な利点はすでに探求されていました。
この調査の1つの結果は、「プロシージャ属性」が有用であるかもしれないという発見でした。次の「抽象」自動車オブジェクトのクラスの例は、言語定義ドキュメント(Dahl and Nygaard 1965)、sectから引用されています。 5.3。
特にサブクラス化のさらなるインスピレーションは C.A.R。Hoare's レコードクラス(258ページ)でした:
Hoare(68)のサブクラスのアイデアは自然な出発点でしたが、2つの困難がありました。
- 純粋なデータレコードだけでなく、独自のアクションとローカルデータスタックを持つプロセスのサブクラスが必要でした。
- また、必ずしも事前にわかっていないさまざまな状況で、後で適用できるように、共通のプロセスプロパティをグループ化する必要もありました。
1966年の秋、Hoareのレコードクラス構成を私たちの要件に適合させるために多くの時間が費やされましたが、成功しませんでした。解決策は、1966年12月に「プレフィックス」のアイデアで突然登場しました。私たちは、トラックまたはバスのいずれかである車の列を備えた橋の環礁ブースのことを考えていました。 (この例は、(Dahl and Nygaard 1968)に再び現れます)。
「クラス」および「オブジェクト」という用語は、Ole-Johan Dahl、Bjorm Myhrhaug、およびKristen Nygaardによる SIMULA 67 COMMON BASE LANGUAGE にも表示されます(4〜5ページ):
ブロックの概念は、「サブ問題」または「サブアルゴリズム」の直観的な概念に対応しています。これは、正統的なアプリケーション領域での分解の有用な単位です。
ブロックは、集約されたデータ構造と、関連するアルゴリズムおよびアクションの正式な説明、つまり「パターン」です。
...
拡張ブロックの概念は、「クラス」宣言と、「オブジェクト参照」(ポインター)、リモートアクセス」、「準並列」操作、ブロック「連結」などの関連する相互作用メカニズムによって導入されます。
クラスについては、1.3.3章(5ページ)で詳しく説明しています。
Simula 67の中心的な新しいコンセプトは「オブジェクト」です。オブジェクトは自己完結型のプログラム(ブロックインスタンス)であり、「クラス宣言」によって定義された独自のローカルデータとアクションを持っています。クラス宣言はプログラム(データとアクション)パターンを定義し、そのパターンに準拠するオブジェクトは「同じクラスに属する」と言われます。
...
したがって、「オブジェクト指向」という用語はまだ発明されていませんが、「クラス」と「オブジェクト」の両方が、1969年にアランケイがSmalltalkの開発を始める前の現代の使用法と同様に使用されました。
Ivan Sutherland は、Simulaを最初のオブジェクト指向プログラミング言語として識別します Sketchpad:マンマシングラフィカルコミュニケーションシステム (4ページ)、C.A.R。 Hoare、 Douglas T. Ross ' 、ALGOL、Sketchpadの影響:
それにもかかわらず、ユーザーとプログラマーの間の境界を取り除くためのサザーランドの試みは、そうすることに失敗したときに、新しいプログラミングパラダイムへの想像上の飛躍を提供した唯一のシステムではありませんでした。 NygaardとDahlのSimula [7]は、オブジェクト指向の原則を組み込んだ最初の従来のプログラミング言語でしたが、Sketchpadのクラスおよびインスタンスベースの継承(オブジェクトとは呼ばれません)の実装は、Simulaより数年前から存在していました。
この論文の謝辞に記載され、MITリンカーンラボラトリーテクニカルレポートに基づいて引用されているダグラスT.ロスの研究を通じて、共通の影響があったようです。ロス1960年代半ばにCAR Hoareと一緒にALGOL 68委員会に参加し、レコードのようなデータ構造(プレックスと呼ばれる)に関する彼の以前の研究は、抽象データ型[3]に関するHoare自身のアイデアに影響を与えました。 Simulaのクラス定義メカニズムの起源[7]。
Xerox Starと彼の言語であるSmalltalkによるオブジェクト指向プログラミングへの関心の爆発につながった、アランケイの独創的なDynabookプロジェクトは、Sketchpadから直接影響を受けました。ケイは、Smalltalkの起源がSimulaの配布テープとSutherlandのSketchpad論文のコピー[5]の両方の机上の偶然の外見にあったという事実を書いています。ケイは、2つのシステムが同じ基本的な型の概念(明らかにロスのプレックスからの2つの異なるルートを介して派生した)に基づいており、これらがより広く使用可能なプログラミングシステムの基礎を形成できることを認識しました。これら2つの影響の経路を比較すると、SimulaはSketchpadよりもはるかに大きなプロジェクトであり、最初のオブジェクト指向プログラミング言語として正しく認識されていましたが、ユーザーインターフェイス自体での抽象化のサポートに関するSketchpadの特別な強調が、次のように実行可能になることを願っています。進行中の研究努力の結果[2,6]。
ただし、アラン・ケイは明らかに、Smalltalkを 最初のオブジェクト指向言語 と見なしています。
確かに貴族の祖先はいますが、Smalltalkの貢献は、プロのプログラマーの大きな問題を攻撃し、初心者のユーザーが小さな問題を可能にするための、私がオブジェクト指向と呼んだ新しい設計パラダイムです。オブジェクト指向の設計は、シリコンの爆発によって可能になった、これまでになく複雑な動的システムとユーザーの関係をモデル化する効率を質的に向上させるための成功した試みです。
用語を作り出したので、私はそこに多くの議論はないと思います。
最後にあなたの質問に答えます:オブジェクト指向のコアコンセプトのいくつかはSimulaやALGOLやLISPなどの以前の言語に存在しましたが、パラダイム自体は存在しなかったため、実際には名前は必要ありませんでした。
Smalltalkは少なくともオブジェクト指向を念頭に置いて設計されました Alan Kayはオブジェクト指向と考えました :
私にとってのOOPとは、メッセージング、ローカルでの保持と状態プロセスの保護と非表示、およびすべてのものの極端な遅延バインディングのみを意味します。 SmalltalkとLISPで実行できます。これが可能な他のシステムがあるかもしれませんが、私はそれらを知りません。
アーキテクチャは以前の概念の融合のように見えるかもしれませんが、その中心的な概念はSmalltalkによって導入されたため、パラダイムの最初の実装を示しています。