それでは、「オブジェクト指向」という用語でアランケイが本当に意味したことは何ですか?


95

伝えられるところによれば、アラン・ケイは「オブジェクト指向」という用語の発明者です。そして彼はしばしば、今日私たちがOOと呼ぶものは彼が意味するものではないと言ったと引用されています。

たとえば、Googleでこれを見つけました。

「オブジェクト指向」という用語を作成しましたが、C ++を念頭に置いていなかったことがわかります。

-アラン・ケイ、OOPSLA '97

何をしたかについてかなり洞察に満ちた何かを聞いたことを漠然と覚えてます。「メッセージの受け渡し」に沿った何か。

彼の意味を知っていますか?彼が何を意味し、今日の一般的なオブジェクト指向とどのように異なるのか、詳細を記入できますか?参照がある場合は共有してください。

ありがとう。


私のブログの投稿は、このテーマに関して興味深いものを見つけるかもしれません:yegor256.com/tag/oop.html
yegor256

このブログ投稿のコメントセクションをチェックしてください。
アランケイ

回答:


82

http://www.purl.org/stefan_ram/pub/doc_kay_oop_en


日付:2003年7月23日水曜日09:33:31 -0800宛先:Stefan Ram [プライバシー保護のため削除]送信者:Alan Kay [プライバシー保護のため削除]件名:Re:「オブジェクト指向」の明確化

こんにちはステファン-

遅れてすみませんが、休暇中です。

6:27 PM +0200 7/17/03、Stefan Ramは次のように書いています。

親愛なるケイ博士、

このテーマに関するチュートリアルページでは、「オブジェクト指向プログラミング」という用語に信頼できる言葉を付けたいと思います。私が「信頼できる」と考える唯一の2つのソースは、「ISO / IEC 2382-15」で「オブジェクト指向」を定義する国際標準化機構です。

私はやったと確信しています。

残念ながら、その用語の定義または説明を含むWebページまたはソースを見つけることは困難です。この点であなたが言ったことについていくつかの報告がありますが(「継承、ポリモーフィズム、カプセル化」など)、これらは直接の情報源ではありません。また、後で「メッセージング」に重点を置くことも承知していますが、それでも「オブジェクト指向」について知りたいです。

記録、私のチュートリアルページ、およびさらなる配布と公開については、説明してください:

「オブジェクト指向」という用語が最初に使用されたのはいつですか?

11月66日以降、ユタ州でスケッチパッド、Simula、ARPAnetのデザイン、バローズB5000、および生物学と数学の私のバックグラウンドの影響を受けて、プログラミングのアーキテクチャを考えました。おそらく私がやっていることを誰かが私に尋ねたのは1967年で、「私はオブジェクト指向プログラミングだ」と言いました。

当初のコンセプトは次の部分で構成されていました。

  • オブジェクトは、生物学的細胞やネットワーク上の個々のコンピューターのようなものであり、メッセージとのみ通信できると考えました(そのため、メッセージングは​​最初から始まりました-プログラミング言語でメッセージングを効率的に行う方法を見るのに時間がかかりました便利である)。

  • データを取り除きたかった。B5000は、ほとんど信じられないほどのHWアーキテクチャを介してこれをほぼ実現しました。セル/コンピューター全体のメタファーはデータを取り除き、「<-」は単なる別のメッセージトークンになることを認識しました(これらすべてのシンボルを関数と手順。

  • 数学の背景から、各オブジェクトには複数の代数が関連付けられている可能性があり、それらのファミリーが存在する可能性があり、これらは非常に有用であることがわかりました。「ポリモーフィズム」という用語はかなり後に付けられたもので(ピーターウェグナーによると思います)、それは実際には関数の命名法に由来するため、あまり有効ではありません。私は、準代数形式で一般的な動作を処理するための「汎用性」という用語を作成しました。

  • Simula IまたはSimula 67が継承を行う方法が好きではありませんでした(NygaardとDahlは単なる素晴らしい思想家でありデザイナーだと思っていましたが)。そこで、理解が深まるまで、継承を組み込み機能として除外することにしました。

このアーキテクチャを使用した私の最初の実験は、van WijngaartenとWirthの「Algolの一般化」とWirthのEulerを改造したモデルを使用して行われました。これらはどちらもかなりLISPに似ていますが、より一般的な読みやすい構文です。そのとき、私は具体的なメタ言語のモンスターLISPのアイデアを理解していませんでしたが、IronsのIMPを含むさまざまなソースから引き出される拡張可能な言語についてのアイデアに少し近づきました。

この第2段階では、最終的にLISPを理解し、この理解を使用して、より良く、小さく、より強力で、より遅いバインドされた下部構造を作成しました。Dave Fisherの論文は「McCarthy」スタイルで行われ、拡張可能な制御構造に関する彼のアイデアは非常に役立ちました。当時のもう1つの大きな影響は、カール・ヒューイットのプランナーでした(Prologをどれだけ早く、どれだけ早く予測できるかを考えると、それにふさわしい評価を得たことはありません)。

Xerox PARCの元々のSmalltalkは上記のものから生まれました。後続のSmalltalkについては、Historyの章の終わりに不満があります。Simulaに逆戻りし、拡張メカニズムをより有用な安全メカニズムに置き換えませんでした。

「オブジェクト指向[プログラミング]」とはどういう意味ですか?(チュートリアルのような導入は必要ありません。可能であれば、それらに精通した読者のための他の概念の観点からの簡単な説明[「継承、ポリモーフィズム、カプセル化」など)。また、「オブジェクト「これは、「Smalltalkの初期の歴史」の「オブジェクト」について説明した資料をすでに持っているからです。)

(私は型に反対ではありませんが、完全な苦痛ではない型システムは知りませんので、動的型付けは今でも好きです。)

私にとってのOOPとは、メッセージング、ローカルの保持と状態プロセスの保護と隠蔽、およびすべてのものの極端な遅延バインディングのみを意味します。SmalltalkおよびLISPで実行できます。これが可能なシステムは他にもあるかもしれませんが、私はそれらを知りません。

[また]言及すべきことの1つは、Simulaによって触媒された2つの主な経路があったことです。初期の(偶然の)ものは、私が取ったバイオ/ネットの非データ手順ルートでした。もう1つは、少し遅れて調査対象として来たもので、抽象データ型でした。

歴史全体を見ると、OOPの原型はADTで始まり、私が「オブジェクト」と呼んでいるものに少し分岐していることがわかります。それがSmalltalkなどにつながりましたが、小さな分岐の後、 CSの設立はほとんどADTを行い、データ手順のパラダイムに固執したかった。歴史的には、USAFバローズ220ファイルシステム(Smalltalkの歴史で説明した)、データ構造にプロシージャポインタを埋め込むことを提唱したMITのダグロス(AED以前)の初期の作品、Sketchpadを見る価値があります。完全なポリモーフィズム-たとえば、データ構造内の同じオフセットが「表示」を意味し、構造が表すオブジェクトのタイプなどに適切なルーチンへのポインタがある場合、およびバローズB5000 そのプログラム参照テーブルは真の「ビッグオブジェクト」であり、「データ」と「プロシージャ」の両方へのポインタを含んでいたが、データを追ってプロシージャポインタを見つけようとした場合、しばしば正しいことができた。そして、初期のユタのもので最初に解決した問題は、メソッドとオブジェクトのみを使用した「データの消失」でした。60年代の終わりに(私が思うに)ボブ・バルザーは「データレスプログラミング」と呼ばれるかなり気の利いた論文を書き、その後すぐにジョンレイノルズは同様に気の利いた論文「ゲダンケン」(1970年に思う)を書きました。式が正しい方法であれば、プロシージャによってデータを抽象化できます。しかし、データの後に行こうとしてプロシージャポインタを見つけようとしていた場合、正しいことを行うことができました。そして、初期のユタのもので最初に解決した問題は、メソッドとオブジェクトのみを使用した「データの消失」でした。60年代の終わりに(私が思うに)ボブ・バルザーは「データレスプログラミング」と呼ばれるかなり気の利いた論文を書き、その後すぐにジョンレイノルズは同様に気の利いた論文「ゲダンケン」(1970年に思う)を書きました。式が正しい方法であれば、プロシージャによってデータを抽象化できます。しかし、データの後に行こうとしてプロシージャポインタを見つけようとしていた場合、正しいことを行うことができました。そして、初期のユタのもので最初に解決した問題は、メソッドとオブジェクトのみを使用した「データの消失」でした。60年代の終わりに(私が思うに)ボブ・バルザーは「データレスプログラミング」と呼ばれるかなり気の利いた論文を書き、その後すぐにジョンレイノルズは同様に気の利いた論文「ゲダンケン」(1970年に思う)を書きました。式が正しい方法であれば、プロシージャによってデータを抽象化できます。

オブジェクトを非データとして好きだった人たちの数は少なく、私、カールヒューイット、デイブリード、その他数人が含まれていました。 ARPAnetの設計→計算の基本単位がコンピューター全体であるインターネット。しかし、70年代から80年代を通じて、アイデアがどれほど頑固に持ちこたえるかを示すために、オブジェクトやメッセージについて考えるのではなく、「リモートプロシージャコール」で対処しようとした人が多くいました。シックトランジットグロリアムンディ。

乾杯、

アラン・ケイ


1
HTTP / 1.1 403アクセスが拒否されました。
ジョブ

1
ただアクセスできたので、一時的な問題だったに違いありません。そのリンクをありがとう、Manoj。
デヴィッドコンラッド

2
@Job水曜日(3月16日、明らかに403エラーが発生した日)は、userpage.fu-berlin.deのドメイン管理者の月次サービス日です)。彼らは定期的にネットワークの一部を月に一度オフラインにします。ええ、ええ、聞いてはいけない…
コンラッドルドルフ

「データを削除したい」とはどういう意味ですか?データはオブジェクト指向の不可欠な部分です(つまり、クラスにカプセル化されたり、クラス間でやり取りされることがよくあります)。どのようなパラダイムが使用されていても、コンピューティングでデータなしではできないため、データを取り除くことは意味がありません。
デニス

1
< -元のSmalltalk代入演算子た
DangerMouse

22

Alan Kayがオブジェクト指向によって意味したことのすべてではないにしても、ほとんどはSmalltalk言語で具体化されています。

また、http//en.wikipedia.org/wiki/Message_passing#Influences_on_other_programming_modelsから:

Alan Kayは、メッセージの受け渡しはOOPのオブジェクトよりも重要であり、オブジェクト自体はしばしば強調されすぎると主張しています。ライブ分散オブジェクトプログラミングモデルは、この観察に基づいて構築されています。分散データフローの概念を使用して、高度な機能スタイル仕様を使用して、メッセージパターンの観点から複雑な分散システムの動作を特徴付けます。

18
それから、なぜ彼はそれを「メッセージ指向」ではなく「オブジェクト指向」と呼んだのでしょうか。
デヴィッドソーンリー

@David Thornley:それでは、C ++をメソッド指向にするのでしょうか?
-back2dos

60
私は戻って60年代における用語についてすぎブライスだったと「指向メッセージ」のようなものを選択したはずです
アラン・ケイ

1
しかし、「メッセージ指向」とは何ですか?(私は非同期呼び出しを(おそらく)考えることができますが、実際には多かれ少なかれ「通常の」メソッドを実装していない言語を実際には知りません。戻り値についてもありますが、これはsort-of ' ref '/' out 'パラメーターなど)
mlvljr

1
「メッセージ指向」とは、基本的にレイトバインディング/動的タイピングです。オブジェクトに渡されたメッセージは、実行時に(そのオブジェクトによって)分析されます。
マークシダー

6

Alan Kayがオブジェクト指向によって意味したことのすべてではないにしても、ほとんどはSmalltalk言語で具体化されています。

「PARCですべてのアイデアを実行したわけではありませんでした。オリジナルのSmalltalkから生まれたCarl Hewittの俳優のアイデアの多くは、その後のSmalltalkよりもOOPの精神にあります。Erlangの重要な部分は、実際のOOP言語現在のSmalltalk、そして確かに「OOPペイント」でペイントされたCベースの言語。

アラン・ケイのコメントから引用:

http://computinged.wordpress.com/2010/09/11/moti-asks-objects-never-well-hardly-ever/


:あなたがコメントダウン長い道のりをスクロールする必要があり、ここではアラン・ケイさんのコメントへの直接リンクですcomputinged.wordpress.com/2010/09/11/...
icc97

コメント全体が非常に便利です。この質問に対する潜在的な答えから始まります。「私は「オブジェクト指向」と考える大規模システムの良い例はインターネットです。何十億もの完全にカプセル化されたオブジェクト(コンピューター自体)と「コマンドではなくリクエスト」などの純粋なメッセージングシステム
icc97

5

アラン・ケイやジム・コプリエンなどの作品をフォローすることから私が選んだ重要なポイントの1つは、真の「オブジェクト」指向プログラミングは、人間/ユーザーの精神モデルの観点からコンピューターとソフトウェアをモデリングすることであるということですPROGRAMMERSの単なるツールです。

私が理解しているように、OOPに対するAlanのビジョンは、コンピューターを人間のユーザーが望むものを作成できるツールにすることでした。コンピューターの全機能は、直感的なインタラクティブモデルを通じてエンドユーザーに直接公開されます。コードだけでなく、ランタイムオブジェクトとインタラクションを直接表示およびスカルプトできる必要があります。

概念実証としてJavaScriptでこのバージョンを試行する私の計画に関する投稿は次のとおりです。http : //www.cemetech.net/forum/viewtopic.php?p=234494#234494

ソフトウェア開発/プログラミングの観点から、Jim Coplienは、コードがどのようにユーザーのメンタルモデルに似ているか、またSHOULDについて話しています。つまり、コードは、その動作を説明する人が鳴らすのとほぼ同じ方法で読み取ります。これは主に、クラスとタイプの観点ではなく、オブジェクトの観点で考えることによって達成されます。動作は、オブジェクトのIDENTITYの定義の一部としてではなく、オブジェクトによって実行される役割の用語で説明されます。オブジェクトのインタラクションをモデル化できる必要があります。オブジェクトはインタラクションで再生されるロールによって識別されます。これが人間のメンタルモデルの仕組みです。ウェイター、カスタマー、キャッシャー、ソースアカウント、デスティネーションアカウントなどです。これらはタイプではなく役割です。「その時点でこの役割を果たしているオブジェクトは何でも」 」、


DDDも同様の概念を使用しています。おそらくあなたはこれについて正しいです。:-)
inf3rno
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.