プログラミング
アラン・ケイが語る「オブジェクト指向プログラミング」の意味(2003年)
Alan Kay on the meaning of "object-oriented programming" (2003) (notes.shixiangxi.com)
要約
オブジェクト指向プログラミングの提唱者であるアラン・ケイが、2003年のメールでその本来の意味を説明しています。彼は、オブジェクト指向を「メッセージング、ローカルな状態保持と保護、状態プロセスの隠蔽、そして極端な遅延バインディング」と定義し、生物の細胞やネットワーク上の個々のコンピュータのようなオブジェクトがメッセージのみで通信するアーキテクチャとして構想したと述べています。一般的な継承、ポリモーフィズム、カプセル化といった概念とは異なる、彼自身の視点からのオブジェクト指向が語られています。
全文翻訳
このページには、アラン・ケイがステファン・ラムに送った2003年7月の2通の電子メールが掲載されており、「オブジェクト指向プログラミング」が、その用語を造語した本人にとって元々何を意味していたのかが明確にされています。
出典: http://www.purl.org/stefan_ram/pub/doc_kay_oop_en
メール 1 — 2003年7月23日
件名: Re: 「オブジェクト指向」の明確化
こんにちは、ステファン — 遅れて申し訳ありませんが、休暇中でした。
2003年7月17日午後6時27分(+0200)にステファン・ラムが書きました:
ケイ博士へ、
「オブジェクト指向プログラミング」という用語について、私のチュートリアルページのために権威ある言葉をいただきたいと考えております。
「権威ある」と私が考える唯一の2つの情報源は、「ISO/IEC 2382-15」で「オブジェクト指向」を定義している国際標準化機構と、あなたです。なぜなら、あなたがその用語を造語したと言われているからです。
その通りだと思います。残念ながら、あなたの定義やその用語の説明が掲載されているウェブページや情報源を見つけるのは困難です。この点についてあなたが何を言ったかもしれないかについてのいくつかの報告(「継承、ポリモーフィズム、カプセル化」など)はありますが、これらは直接の情報源ではありません。また、あなたが後になって「メッセージング」により重点を置いたことも承知しておりますが、私は「オブジェクト指向」について知りたいと思っています。
記録のため、私のチュートリアルページ、そして今後の配布と出版のために、ご説明いただけますでしょうか:
「オブジェクト指向」という用語は、いつ、どこで初めて使われましたか?
ユタ大学で、スケッチパッド、シミュラ、ARPAnetの設計、バロウズB5000、そして生物学と数学の私の背景に影響を受け、プログラミングのためのアーキテクチャを考えた1966年11月以降のある時期です。おそらく1967年に誰かに私が何をしているのか尋ねられ、「それはオブジェクト指向プログラミングです」と答えた時でしょう。その元の構想には以下の部分がありました。私はオブジェクトを生物の細胞やネットワーク上の個々のコンピュータのように考え、メッセージによってのみ通信できるものとしました(したがってメッセージングは最初からありました — プログラミング言語でメッセージングを効率的に行う方法を見つけるのに少し時間がかかりました)。私はデータを取り除きたいと思っていました。B5000は、そのほとんど信じられないようなHWアーキテクチャによって、これをほぼ実現していました。私は細胞/全体コンピュータのメタファーがデータを取り除くことに気づき、<-は単なる別のメッセージトークンになるだろうと理解しました(これらのシンボルをすべて関数と手続きの名前として考えていたため、これを完全に理解するのにかなりの時間がかかりました)。私の数学の背景は、各オブジェクトがいくつかの代数を持つことができ、それらのファミリーが存在し、これらが非常に非常に役立つだろうと気づかせました。 「ポリモーフィズム」という用語ははるか後になって(ピーター・ウェグナーによってだったと思います)課せられましたが、それは厳密には有効ではありませんでした。なぜなら、それは実際には関数の命名法に由来するものであり、私は関数以上のものを望んでいたからです。私は擬代数的な形式で一般的な振る舞いを扱うための「ジェネリシティ」という用語を作りました。Simula IやSimula 67の継承のやり方は好きではありませんでした(しかし、ナイガードとダールはただ素晴らしい思想家であり設計者であると思っていました)。そこで、継承を組み込み機能として理解するまで含めないことにしました。このアーキテクチャでの私の最初の実験は、ファン・ワインガルデンとヴィルトの「Algolの一般化」とヴィルトのEulerから適応したモデルを使用して行われました。これらは両方ともLISPにかなり似ていましたが、より一般的な読みやすい構文を持っていました。当時は、有形なメタ言語という巨大なLISPのアイデアは理解していませんでしたが、アイロンズのIMPを含むさまざまな情報源から得られた拡張可能な言語に関するアイデアによって、かなり近づきました。この第二段階は、最終的にLISPを理解し、その理解を使って、はるかに洗練され、小さく、強力で、より遅延バインドされた下部構造を作ることでした。デイブ・フィッシャーの論文は「マッカーシー」スタイルで行われ、拡張可能な制御構造に関する彼のアイデアは非常に役立ちました。この時期のもう一つの大きな影響は、カール・ヒューイットのPLANNERでした(Prologをどれほど早く、どれほどよく予測できたかを考えると、これほど評価されないのは残念です)。ゼロックスPARCのオリジナルのSmalltalkは上記から生まれました。その後のSmalltalkは、「歴史」の章の最後に不満が述べられています。それらはSimulaに逆戻りし、拡張メカニズムを、それほど有用ではないがより安全なものに置き換えませんでした。
「オブジェクト指向[プログラミング]」とはあなたにとって何を意味しますか?
(チュートリアル風の導入は不要です。可能であれば、読者が慣れている他の概念で簡潔に説明してください。「継承、ポリモーフィズム、カプセル化によるプログラミング」のように。また、「オブジェクト」については、「Smalltalkの初期の歴史」であなたの説明がすでにあるため、説明する必要はありません。)
(私は型に反対ではありませんが、完全に苦痛でない型システムを知らないので、動的型付けを好みます。)
OOPは、私にとってはメッセージング、ローカルな状態保持と保護と状態プロセスの隠蔽、そしてすべての極端な遅延バインディングを意味するだけです。それはSmalltalkとLISPで可能です。おそらくこれらが可能な他のシステムもありますが、私はそれらを知りません。
では、アラン
メール 2 — 2003年7月26日
件名: Re: 「オブジェクト指向」の明確化
私が言及すべきだったことの一つは、Simulaによって触発された主要な経路が2つあったことです。初期のもの(たまたまですが)は、私がとった生物/ネットワークの非データ・プロシージャの経路でした。もう一つは、少し後になって研究対象として現れた抽象データ型であり、こちらの方がはるかに多くの注目を集めました。歴史全体を見ると、プロトOOP的なものはADTから始まり、私が「オブジェクト」と呼んだものに向かって少し分岐し、それがSmalltalkなどにつながりましたが、その小さな分岐の後、CSの学会はADTをかなり重視し、データ・プロシージャのパラダイムに固執しようとしました。
歴史的には、USAF Burroughs 220ファイルシステム(Smalltalkの歴史で説明したもの)、MITのダグ・ロスによる初期の仕事(AEDとその前身で、データ構造にプロシージャポインタを埋め込むことを提唱していました)、Sketchpad(完全なポリモーフィズムを持っていました。たとえば、データ構造内の同じオフセットが「表示」を意味し、その構造が表すオブジェクトの型に適したルーチンへのポインタが含まれていました)、そしてBurroughs B5000(そのプログラム参照テーブルは真の「大きなオブジェクト」であり、「データ」と「プロシージャ」の両方へのポインタを含んでいましたが、データを追跡しようとしてプロシージャポインタを見つけた場合でも、しばしば適切な処理を行うことができました)を調べる価値があります。そして、私の初期のユタの仕事で解決した最初の問題は、メソッドとオブジェクトだけを使って「データの消滅」を実現することでした。60年代の終わり頃(だと思いますが)、ボブ・バルザーは「Dataless Programming」というかなり優れた論文を書き、そのすぐ後、ジョン・レイノルズは同様に優れた論文「Gedanken」(1970年だと思います)を書き、ラムダ式を正しく使うことでデータをプロシージャによって抽象化できることを示しました。非データとしてオブジェクトを好む人々の数は少なく、私自身、カール・ヒューイット、デイブ・リード、その他数名が含まれていました。このグループのほとんどすべてがARPAコミュニティの出身で、ARPAnetからインターネットへの設計に何らかの形で関与しており、そこでは計算の基本単位は全体としてのコンピュータでした。しかし、アイデアがいかに頑固に残り続けるかを示すために、70年代から80年代にかけて、多くの人々がオブジェクトとメッセージについて考える代わりに「リモートプロシージャコール」で済ませようとしました。
Sic transit gloria mundi.(世の栄華はかくもはかない。)
では、アラン
2003年7月26日午後10時05分(+0200)にステファン・ラムが書きました:
2003年7月23日水曜日午前9時33分31秒(-0800)にアラン・ケイが書きました:
OOPは、私にとってはメッセージング、ローカルな状態保持と保護と状態プロセスの隠蔽、そしてすべての極端な遅延バインディングを意味するだけです。
アランさん、
(上記の引用部分以外の部分も含めて)ご説明ありがとうございます!
「ローカルな状態保持」はOOPの文脈では私にとって新しい概念であり、状態プロセスを指し、オブジェクトがその状態プロセスを所有し、オブジェクトの状態がオブジェクトとともにローカルに保持され、他の場所にないことを意味すると理解しています。
私は