伝えられるところによると、アラン・ケイは「オブジェクト指向」という用語の発明者です。そして、私たちがOO今日と呼んでいるものは彼が意図したものではないということを言ったと彼はしばしば引用されています。
たとえば、私はこれをGoogleで見つけました:
「オブジェクト指向」という言葉を作りましたが、C++を考えていなかったことがわかります。
-Alan Kay、OOPSLA '97
私は彼がdidの意味についてかなり洞察に満ちた何かを聞いたことを漠然と覚えています。 「メッセージパッシング」の線に沿った何か。
彼の意味を知っていますか?彼の意味と、今日の一般的なオブジェクト指向オブジェクトとの違いについて詳しく説明していただけますか?何か参考資料があれば教えてください。
ありがとう。
http://www.purl.org/stefan_ram/pub/doc_kay_oop_en
日付:2003年7月23日水曜日09:33:31 -0800宛先:ステファンラム[プライバシー保護のため削除]差出人:アランケイ[プライバシー保護のため削除]件名:再:「オブジェクト指向」の説明
こんにちはステファン-
遅れて申し訳ありませんが、私は休暇中でした。
6:27 PM +0200 7/17/03、Stefan Ramはこう書いている:
親愛なるケイ博士、
この件に関するチュートリアルページの「オブジェクト指向プログラミング」という用語について、信頼できるWordをいくつか用意したいと思います。私が「信頼できる」と考える2つの情報源は、「ISO/IEC 2382-15」で「オブジェクト指向」を定義する国際標準化機構と、彼らが言うようにその用語を作り出したあなたです。
私はそうしたと確信しています。
残念ながら、その用語の定義または説明を含むWebページまたはソースを見つけるのは困難です。この点に関してあなたが言ったかもしれないことについてのいくつかの報告があります(「継承、多態性、およびカプセル化」など)が、これらは直接の出典ではありません。また、後で「メッセージング」に重点を置いていることも承知していますが、「オブジェクト指向」についても知りたいです。
記録、私のチュートリアルページ、およびその他の配布と公開について説明してください。
「オブジェクト指向」という用語が最初に使用されたのはいつ、どこですか。
スケッチパッド、シミュラ、ARPAnetの設計、バローズB5000、および生物学と数学の経歴の影響を受けた11月66日以降のユタ州で、プログラミングのアーキテクチャについて考えました。誰かが私に何をしているのかと尋ねられたのはおそらく1967年で、私は「それはオブジェクト指向プログラミングだ」と言った。
当初の発想には以下の部分がありました。
オブジェクトはネットワーク上の生物細胞や個々のコンピューターのようなものであり、メッセージとしか通信できないと思っていました(そのため、メッセージングは最初から始まっていました-プログラミング言語でメッセージングを行う方法を十分に効率よく確認するには時間がかかりました役に立つ)。
データを取り除きたかった。 B5000は、ほとんど信じられないほどのハードウェアアーキテクチャを介してこれをほぼ実現しました。セル/コンピューター全体のメタファーはデータを取り除き、 "<-"は単なる別のメッセージトークンになることに気づきました(これらの記号をすべて名前として考えていたため、これを考えるのにかなり時間がかかりました関数と手順。
私の数学の背景から、各オブジェクトには複数の代数が関連付けられている可能性があり、これらのファミリーが存在する可能性があり、これらは非常に有用であることを理解しました。 「ポリモーフィズム」という用語はずっと後に課されたもので(ピーターウェグナーによると思います)、それは実際には関数の命名法に由来するため、完全に有効ではありません。ジェネリックな振る舞いを準代数的形式で扱うために、「ジェネリシティ」という用語を作りました。
Simula IまたはSimula 67が継承を行う方法が好きではありませんでした(ただし、NygaardとDahlは途方もない思想家とデザイナーであると思っていました)。そのため、私はそれがよく理解されるまで、継承を組み込み機能として除外することにしました。
このアーキテクチャーでの私の元々の実験は、ファンウィングガーテンとワースの「ALGOLの一般化」とワースのオイラーから採用したモデルを使用して行われました。これらはどちらもかなりLISPに似ていますが、より一般的な読み取り可能な構文を備えています。私は当時、有形のメタ言語というモンスターのLISPのアイデアを理解していませんでしたが、IronsのIMPを含むさまざまなソースから引き出された拡張可能な言語についてのアイデアに少し近づきました。
これの第2フェーズは、最終的にLISPを理解し、この理解を使用して、より優れた、より小さく、より強力な、より遅いバインドされた下部構造を作成することでした。デイブフィッシャーの論文は「マッカーシー」スタイルで行われ、拡張可能な制御構造に関する彼のアイデアは非常に役に立ちました。現時点でのもう1つの大きな影響は、Carl HewittのPLANNERでした(これは、Prologをどれだけ前に予測できたかを考えると、それに値する認識を得たことはありません)。
Xerox PARCのオリジナルのSmalltalkは、上記のことから生まれました。後続のSmalltalkは、Historyの章の最後で文句を言われています。それらはSimulaに向かって後方にスライドし、拡張メカニズムをより有用なものより安全なものに置き換えませんでした。
「オブジェクト指向[プログラミング]」はあなたにとって何を意味しますか? (チュートリアルのような紹介は必要ありません。可能であれば、それらに精通している読者のために、他の概念の観点からの「[継承、ポリモーフィズム、およびカプセル化によるプログラミング]]のような簡単な説明だけを行ってください。また、「オブジェクトを説明する必要はありません。 "、" Smalltalkの初期の歴史 "からの"オブジェクト "の説明を含むソースが既にあるため。)
(私は型に反対しているわけではありませんが、完全な苦痛ではない型システムを知りません。そのため、私はまだ動的型付けが好きです。)
私にとってのOOPは、メッセージング、ローカルでの保持と状態プロセスの保護と非表示、およびすべてのものの極端な遅延バインディングのみを意味します。 SmalltalkとLISPで実行できます。これが可能な他のシステムがあるかもしれませんが、私はそれらを知りません。
[また、]私が言及しておかなければならないことの1つは、Simulaによって触媒された2つの主要なパスがあったことです。初期の(偶然による)ルートは、私が採用したbio/net非データプロシージャルートでした。もう1つは、少し後で研究の対象として出てきたもので、抽象的なデータ型であり、これははるかに多くの役割を果たしました。
歴史全体を見ると、proto-OOPはADTで始まり、私が「オブジェクト」と呼んだものに小さな分岐があり、それがSmalltalkなどにつながりましたが、小さな分岐の後に、 CSの確立は、ADTをほぼ実行し、データプロシージャパラダイムに固執したかったのです。歴史的に、(私がSmalltalkの歴史で説明した)USAF Burroughs 220ファイルシステム、MIT(AEDおよびそれ以前)でのDoug Rossの初期の研究)を見て、埋め込み手順を提唱しました。データ構造のポインタ、Sketchpad(完全なポリモーフィズムがありました。たとえば、データ構造の同じオフセットが「表示」を意味し、構造が表すオブジェクトのタイプなどの適切なルーチンへのポインタなどがあり、プログラム参照テーブルが真の「ビッグオブジェクト」であり、「データ」と「プロシージャ」の両方へのポインタを含んでいたバローズB5000は、データを追跡しようとして、プロシージャポインタを見つけた場合、多くの場合、正しいことを行うことができました。初期のユタのもので解決した問題は、メソッドとオブジェクトのみを使用した「データの消失」でした。60年代の終わりに(おそらく)ボブバルザーは「データレスプログラミング」と呼ばれるかなり気の利いた論文を書き、その後間もなくジョンレイノルズが書きました同様に気の利いた紙「Ged彼はラムダ式を使用すると正しい方法でデータをプロシージャによって抽象化できるようになることを示しました(1970年に私は思う)。
非データとしてオブジェクトを好きだった人の数は少なく、自分自身、Carl Hewitt、Dave Reed、その他数人が含まれていました。このグループのほとんどすべてがARPAコミュニティとARPAnet→インターネットの設計に何らかの形で関わっていました。計算の基本単位はコンピューター全体でした。しかし、70年代から80年代にかけて、アイデアがどれほど頑固に掛かるかを示すためだけに、オブジェクトやメッセージについて考えるのではなく、「リモートプロシージャコール」を使用して回避しようとしました。Sicトランジットグロリアムンディ。
乾杯、
アラン・ケイ
object-orientationによってアランケイが意味したもののすべてではないにしても、ほとんどがSmalltalk言語で具体化されています。
また、 http://en.wikipedia.org/wiki/Message_passing#Influences_on_other_programming_models から:
Alan Kayは、メッセージパッシングはOOPのオブジェクトよりも重要であり、オブジェクト自体はしばしば過度に強調されると主張しました。ライブ分散オブジェクトプログラミングモデルは、この観察に基づいています。分散データフローの概念を使用して、高度な機能スタイル仕様を使用して、メッセージパターンの観点から複雑な分散システムの動作を特徴付けます。
オブジェクト指向によってアラン・ケイが意味したことのすべてではないにしても、ほとんどがSmalltalk言語で具体化されています。
「PARCですべてのアイデアを実行することはしませんでした。元のSmalltalkに刺激されたカールヒューイットの俳優のアイデアの多くは、OOP)の精神に基づいていました。重要な部分Erlangは、実際のOOP言語、現在のSmalltalk、および確かに「OOPペイント」でペイントされたCベースの言語)に似ています。」
Alan Kayのコメントからの引用:
http://computinged.wordpress.com/2010/09/11/moti-asks-objects-never-well-hardly-ever/
私がアラン・ケイやジム・コプリエンなどの他の作品をフォローして得た主なポイントの1つは、真の「オブジェクト指向」プログラミングは、人間/ユーザーのメンタルモデルではなく、コンピュータとソフトウェアのモデリングに関するものであるということですプログラマーのための単なるツール。
私が理解しているように、OOP=のアランのビジョンは、コンピュータを人間のユーザーが望むものを作ることができるツールにすることでした:コンピュータの全機能は、直感的なインタラクティブモデル:コードだけでなく、ランタイムオブジェクトとインタラクションを直接表示およびスカルプトできる必要があります。
これは、概念実証としてJavaScriptでこれのいくつかのバージョンを試す私の計画に関する投稿です: http://www.cemetech.net/forum/viewtopic.php?p=234494#234494
ソフトウェア開発/プログラミングの観点から、Jim Coplienは、コードがどのようにしてユーザーのメンタルモデルに似ているべきかについて説明します。つまり、コードは、その動作を説明する人が聞くのとほとんど同じ方法で読み取ります。これは主に、クラスとタイプの観点ではなく、オブジェクトの観点から考えることによって達成されます。動作は、オブジェクトのIDENTITYの定義の一部としてではなく、オブジェクトによって実行されるロールの観点から説明されています。オブジェクトの相互作用をモデル化できる必要があります。これは、相互作用で再生されるROLEによって識別されます。これが人間のメンタルモデルの仕組みです。ウェイター、カスタマー、キャッシャー、ソースアカウント、デスティネーションアカウントなどです。これらはタイプではなくロールであり、「そのときにこの役割を果たしているオブジェクトのメソッド」を定義できるようにする必要があります。 "その動作は、いくつかのTYPEの定義の一部ではなく、多くの変化するオブジェクト間のシステム相互作用の一部であるためです。