オブジェクト指向プログラミング
一次資料が残されていないので本人の主張を尊重するならば…という制約はあるが、一般的認知としてはアラン・ケイが1967年頃に当時の自らの取り組みを表現するのに用いた言葉が発端とされている。 At Utah sometime after Nov 66 when, influenced by Sketchpad, Simula, the design for the ARPAnet, the Burroughs B5000, and my background in Biology and Mathematics, I thought of an architecture for programming. It was probably in 1967 when someone asked me what I was doing, and I said: "It's object-oriented programming".
Sketchpad、Simula、ARPAnetの設計、Burroughs B5000、そして生物学と数学のバックグラウンドに影響されて、プログラミングのためのアーキテクチャを考えたのは、66年11月以降のある時期のことでした。1967年頃でしょうか、誰かに「何をやっているのか」と聞かれて、私はこう答えました: 「オブジェクト指向プログラミングだ」と。
(前述制約があるにも関わらず、不思議にも「オブジェクト指向はアラン・ケイ発」ということだけは、後述する氏のオブジェクト指向を受け入れられない人たちにも事実として意外と広く受け入れている。老人 もとい かつて発言力のあったシニア層におけるSmalltalkの知名度の高さによるものか?) 端的には「オブジェクトのみにより構成される、メッセージングのみによるプログラミング」というかなり奇抜なプログラミングのスタイルである。
When one thinks in terms of what I called objects ca 1966, one is talking about entities that from the outside are identical to what we think of as computers (and this means not just sending messages and getting outputs, but that we don't get to look inside with our messages, and our messages don't get to command, unless whatever is going on in the interior of the computer has decided to allow.
So from the outside, there are no imperatives, only requests and questions. Another way to look at this is that an object/computer is a kind of "server" (I worry to use this term because it also has "pop" meanings, but it's a good term.)
This is sometimes called "total encapsulation".
From this standpoint, we don't know what's inside. Could be just hardware. Could be variables and methods. Could be some form of ontology. Or mix and match.
私(ケイ)が1966年頃に「オブジェクト」と名付けたものについて考える時は、我々がコンピュータと思うものと外見上同一のエンティティについて話しています。( これは単にメッセージを送り結果を得るということだけではなく、そのコンピュータの内部で起こっているものが許可しない限り、我々はメッセージで内部を覗くことも、命令を下すこともできないことを意味します。)
外からは「オブジェクト」に強制的に何かをさせることはできません。できるのは「お願い」や「問合せ」だけなのです。別の見方では、この「オブジェクト」(すなわちコンピュータ)はある種の「サーバー」です。(この用語は他の意味合いでも使われるため慎重にすべきですが、「オブジェクト」の性質を表すのに良い言葉だと思います。)
あるいは「完全なカプセル化」と呼ぶのもよいでしょう。
この観点からすると、中身が何であるかはわかりません。ハードウェアだけかもしれません。変数やメソッドかもしれません。ある種のオントロジー(より高度に組織化された情報体系)かもしれません。またはそれらの混合かもしれません。
これが「オブジェクト」をネットワーク上のコンピューター、特に大規模な世界規模のネットワークに喩えることの意味です。
後で書く:
現在主流の「抽象データ型のスーパーセットのオブジェクト指向」 という用語への派生とコロニー化について
Object-oriented programming is a method of implementation in which programs are organized as cooperative collections of objects, each of which represents an instance of some class, and whose classes are all members of a hierarchy of classes united via inheritance relationships.
オブジェクト指向プログラミングとは、プログラムをオブジェクトの協調的な集合体として構成する実装方法である。各オブジェクトはあるクラスのインスタンスを表し、クラスはすべて継承関係で結ばれたクラスの階層のメンバーである。
There are three important parts to this definition: (1) Object-oriented programming uses objects, not algorithms, as its fundamental logical building blocks (the "part of" hierarchy we introduced in Chapter 1); (2) each object is an instance of some class; and (3) classes may be related to one another via inheritance relationships (the "is a" hierarchy we spoke of in Chapter 1). A program may appear to be object-oriented, but if any of these elements is missing, it is not an object-oriented program. Specifically, programming without inheritance is distinctly not object-oriented; that would merely be programming with abstract data types.
この定義には3つの重要なポイントがある。(1) オブジェクト指向プログラミングは、アルゴリズムではなく、オブジェクトを基本的な論理構成要素としていること(第1章で紹介した「part of」の階層)、(2)各オブジェクトは、あるクラスのインスタンスであること、(3)クラスは、継承関係を介して互いに関連している可能性があること(第1章で紹介した「is a」の階層)。一見、オブジェクト指向のプログラムのように見えても、これらの要素のどれかが欠けていれば、それはオブジェクト指向のプログラムではない。具体的には、継承のないプログラミングは明らかにオブジェクト指向ではなく、抽象的なデータ型を使ったプログラミングに過ぎない。