アラン・ケイは「私は「オブジェクト指向」という用語を作り上げました。C++を念頭に置いていなかったと言えます」もちろん、彼が念頭に置いていたのはSmalltalkでした。しかし、彼はオブジェクト指向プログラミング自体を構成しませんでした。彼はSimulaから基本的なアイデアを得ました。この用語がまだ発明されていない場合、Simulaで元々オブジェクト指向プログラミングと呼ばれていたものは何ですか?
アラン・ケイは「私は「オブジェクト指向」という用語を作り上げました。C++を念頭に置いていなかったと言えます」もちろん、彼が念頭に置いていたのはSmalltalkでした。しかし、彼はオブジェクト指向プログラミング自体を構成しませんでした。彼はSimulaから基本的なアイデアを得ました。この用語がまだ発明されていない場合、Simulaで元々オブジェクト指向プログラミングと呼ばれていたものは何ですか?
回答:
実際、Alan Kay は「オブジェクト指向プログラミング」という用語を思いついたときにSmalltalkを念頭に置いていませんでした。
11月66日以降、ユタ州でスケッチパッド、Simula、ARPAnetのデザイン、バローズB5000、および生物学と数学の私のバックグラウンドの影響を受けて、プログラミングのアーキテクチャを考えました。おそらく私がやっていることを誰かが私に尋ねたのは1967年で、「オブジェクト指向プログラミングだ」と言いました。
それの最初の概念は次の部分を持っていました。
- オブジェクトは、生物学的細胞やネットワーク上の個々のコンピューターのようなものであり、メッセージとのみ通信できると考えました(そのため、メッセージングは最初から始まりました-プログラミング言語でメッセージングを効率的に行う方法を見るのに時間がかかりました役に立つ)。
- データを取り除きたかった。B5000は、ほとんど信じられないほどのHWアーキテクチャを介してこれをほぼ実現しました。セル/コンピューター全体のメタファーはデータを取り除き、「<-」は単なる別のメッセージトークンになることを認識しました(これらすべてのシンボルを関数と手順。
- 数学の背景から、各オブジェクトには複数の代数が関連付けられている可能性があり、それらのファミリーが存在する可能性があり、これらは非常に有用であることがわかりました。「ポリモーフィズム」という用語はかなり後に付けられたもので(ピーターウェグナーによると思います)、それは実際には関数の命名法に由来するため、あまり有効ではありません。私は、準代数形式で一般的な動作を処理するための「汎用性」という用語を作成しました。
- Simula IまたはSimula 67が継承を行う方法が好きではありませんでした(NygaardとDahlは単なる素晴らしい思想家でありデザイナーだと思っていましたが)。そこで、理解が深まるまで、継承を組み込み機能として除外することにしました。
Smalltalkは、この概念の結果であり、 Kristen NygaardとOle-Johanによる「Simula言語の開発」で説明されているように、SimulaがALGOLから継承した「オブジェクト」と「クラス」の概念を借用し、拡張しました。ダール(1978年、253ページ):
ALGOLでは、ブロック(プロシージャを含む)は外部から一般化された操作と見なされます。準並列シーケンシングのメカニズムを導入することにより、本質的に同じコンストラクトが並行してプロセスの役割を果たし、ブロックインスタンスに名前を付けてそのコンテンツにアクセスするメカニズムにより、一般化データオブジェクトとして機能します。データと操作を1つの構造に結合することの本質的な利点は、すでに検討されていました。
この調査の結果の1つは、「プロシージャ属性」が役立つ可能性があるという発見でした。「抽象」自動車オブジェクトのクラスの次の例は、言語定義ドキュメント(Dahl and Nygaard 1965)のセクションから引用されています。5.3。
特にサブクラス化のためのさらなるインスピレーションは、CAR Hoareのレコードクラス(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ページ)で、CAR Hoare、Douglas T. Ross、ALGOL、Sketchpadの影響も認識しています。
それにもかかわらず、ユーザーとプログラマーの区分を削除しようとするサザーランドの試みは、そうしなかった場合に新しいプログラミングパラダイムへの想像上の飛躍を提供した唯一のシステムではありませんでした。Nygaard and DahlのSimula [7]はオブジェクト指向の原則を取り入れた最初の従来のプログラミング言語でしたが、Sketchpadのクラスおよびインスタンスベースの継承(オブジェクトとは呼ばれませんが)の実装はSimulaよりも数年前に先行しました。
ダグラスT.ロスの研究を通じて共通の影響があったようです。ダグラスT.ロスは、この論文の謝辞で言及されており、それに基づいたMITリンカーン研究所のテクニカルレポートでも引用されています。ロスは、1960年代半ばにカーホーアとアルゴル68委員会に参加しました。そこでは、レコードのようなデータ構造(プレックスと呼ばれる)に対する以前の研究が、抽象的なデータ型に関するホーア自身のアイデアに影響を与えました[3]。 Simula [7]のクラス定義メカニズムの起源として。
Xerox Starと彼の言語Smalltalkによるオブジェクト指向プログラミングへの関心の両方をもたらしたAlan Kayの独創的なDynabookプロジェクトは、Sketchpadから直接影響を受けました。ケイは、Smalltalkの起源が、Simulaの配布テープとSutherlandのSketchpad論文のコピー[5]の両方の机に偶然出現したという事実を書きました。ケイは、2つのシステムが同じ基礎となるタイプのコンセプト(明らかにロスのプレックスからの2つの異なるルートを介して派生)に基づいており、これらがより広く使用可能なプログラミングシステムの基礎を形成できることを認識しました。これら2つの影響力のルートを比較すると、SimulaはSketchpadよりもはるかに大きなプロジェクトであり、最初のオブジェクト指向プログラミング言語として正しく認識されていました。
ただし、Alan Kayは明らかに、Smalltalkを最初のオブジェクト指向言語と見なしています。
それは確かに高貴な先祖を持っていますが、Smalltalkの貢献は、プロのプログラマーの大きな問題を攻撃し、初心者ユーザーが小さな問題を可能にするための、オブジェクト指向と呼ばれる新しい設計パラダイムです。オブジェクト指向設計は、シリコン爆発によって可能になった、より複雑な動的システムとユーザー関係のモデリングの効率を定性的に向上させるための成功した試みです。
そして、この用語を作り出したので、私はそこにあまり議論がないと思います。
最後にあなたの質問に答えます:オブジェクト指向のコア概念のいくつかはSimula、およびAlgolやLISPのような初期の言語に存在していましたが、パラダイム自体は存在しなかったため、実際には名前は必要ありませんでした。
Smalltalkは、少なくともAlan Kayがオブジェクト指向として考えているものを念頭に置いて、オブジェクト指向を考慮して設計されました。
私にとってのOOPとは、メッセージング、ローカルの保持と状態プロセスの保護と隠蔽、およびすべてのものの極端な遅延バインディングのみを意味します。SmalltalkおよびLISPで実行できます。これが可能なシステムは他にもあるかもしれませんが、私はそれらを知りません。
アーキテクチャは以前の概念の融合のように見えるかもしれませんが、その中心的な概念はSmalltalkによって導入されたため、パラダイムの最初の実装をマークしています。