オブジェクト指向

出典: フリー百科事典『ウィキペディア(Wikipedia)』

出典: フリー百科事典『ウィキペディア(Wikipedia)』
検索に移動

オブジェクト指向(オブジェクトしこう、: object-oriented)は、ソフトウェア開発コンピュータプログラミングのために用いられる考え方である。元々は特定のプログラミングパラダイムを説明するために考案された言葉だった。明確な用語としては1970年代に誕生し、1980年代前半に知名度を得て、考案者の手を離れた自由で曖昧な定義のまま発展を続けた後に、1990年代に入るとソフトウェア工学の様々な分野にも応用されるようになった。ソフトウェア開発における一つの標語のような扱い方もされている。

オブジェクト指向の来歴[編集]

Alan Kay

オブジェクト指向(object-oriented)という言葉自体は、1972年から80年にかけてプログラミング言語「Smalltalk」を開発したゼロックス社パロアルト研究所の計算機科学者アラン・ケイがその言語設計を説明する中で初めて生み出されている[1]。本人の述懐によると、大学院時代のケイがプログラミング言語「Simula」に感化されて日夜プログラミング・アーキテクチャの思索に耽っていた1967年頃、今何をしているのかと尋ねてきた知人に対して「object-oriented programmingだよ」と咄嗟の造語で答えたのが発端だという。このオブジェクト指向が知名度を得るようになったのは1981年頃からであり、当時のマイコン専門誌BYTEによるSmalltalkの誌上紹介が契機になっている。オブジェクト指向の中でケイ自身はメッセージングという考え方を重視していたが、世間の技術的関心はクラスインスタンスの仕組みの方に集まり、オブジェクト指向の解釈はケイの考えとは異なる方向性で推移していった。クラスを初めて導入した言語はSimulaの1967年版だったので、こちらも後付けでオブジェクト指向の源流に位置付けられている[2]。Simulaに結び付けられたオブジェクト指向と、Smalltalkで提唱されたオブジェクト指向の性格は全く異なるものだったので、双方の解釈に数々の齟齬を生じさせている[3]。1983年に計算機科学者ビャーネ・ストロヴストルップがSimulaのオブジェクト指向をモデルにした言語「C++」を公開し、このC++が人気を博した事でオブジェクト指向は本来のSmalltalkではなく、後付けのSimulaスタイルの方で認識されるようになった。

1986年からACM(計算機協会)がOOPSLA(オブジェクト指向会議)を年度開催するようになり、オブジェクト指向はコンピュータサイエンスの一つのムーブメントになった。OOPSLA初期のチェアパーソンは、Smalltalkが生まれたゼロックス社パロアルト研究所のフェローが務めることが多かった。Smalltalkは正確にはプログラミング言語とGUI運用環境を合わせたフレームワークであり、ゼロックスAlto機上のOSまたはミドルウェアとして開発されていた。Smalltalkは70年代のアラン・ケイが構想していたダイナブックのためのGUI環境でもあった。ダイナブックはパーソナルコンピュータの原型に位置付けられているものである。ゼロックスAltoGUIを初めて汎用的にサポートしたコンピュータとOSであり、かのスティーブ・ジョブスを啓発してMacintoshのモデルになったことはよく知られている。こうした背景からオブジェクト指向は、上述のプログラミング云々よりも、GUI(グラフィカル・ユーザー・インターフェース)を始めにした当時の先進的なソフトウェアデザインソフトウェアアーキテクチャのための開拓的なモデル理論として受け止められる方が好まれた。データベース開発とオペレーティングシステム開発およびユーザーインターフェース設計が最初の活用対象になり、産業プログラミング界隈の主流であった構造化(Structured)分野に倣うようにして、オブジェクト指向設計(OOD)オブジェクト指向分析(OOA)オブジェクト指向モデリング(OOM)といった科目も立ち上げられた。それらの研究は形式手法の確立に繋げられて1991年にブーチメソッドオブジェクトモデル化技法、1992年にオブジェクト指向ソフトウェア工学が発表され、いずれも形式言語化されていたのでオブジェクトモデリング言語という総称用語を生み出した。上記三種の考案者(スリーアミーゴス)は、後のIBMブランドになるラショナルソフトウェアで合流して統一モデリング言語(UML)を構築するに到り、1995年のOOPSLAで初回発表した。デザインパターンリファクタリングモデル駆動工学ドメイン固有言語アジャイルソフトウェア開発といった数々のトピックもOOPSLAから誕生している。

1989年にはIBM社アップル社ヒューレットパッカード社サンマイクロシステムズ社アメリカン航空などの11社がコンピュータ産業共同事業団体OMG(Object Management Group)を設立した。OMGの目的は、企業システムネットワークの基盤になる分散コンピューティングを構築するための基礎要素になる分散オブジェクト設計の標準化を図ることであった。ここでのオブジェクトもデータとメソッド(=コード)の組み合わせと定義されていたので、この業務用システムおよびネットワークの構築を目的にした技術アーキテクチャもオブジェクト指向のカテゴリに入れられた。1991年に分散オブジェクトの規格パラダイムとなるCORBAが公開された。また1997年にOMGが標準モデリング言語として採用したUMLは、オブジェクト指向準拠のソフトウェア設計およびシステム設計のスタンダードに位置付けられた。

オブジェクト指向の分野[編集]

オブジェクト指向はプログラミングパラダイムとして誕生した理論である。そのデータ(変数またはプロパティ)とコード(関数またはメソッド)のセットを基本要素にして物事を解析する考え方が1980年代から大きく注目され始めたことで、ソフトウェア開発の様々な局面にobject-orientedを接頭辞にした分野が立ち上げられた。大まかな特徴としては情報資源と処理手順を区分けして分析と設計を行っていた従来の標準的な手法に対し、オブジェクト指向と名が付く分野ではこの双方をひとまとめにして処理対象の分析と設計を行う点が共通している。

アラン・ケイのオブジェクト指向とは[編集]

コンセプト[編集]

1970年代にゼロックス社パロアルト研究所で誕生し、1981年頃から知名度を得るようになったオブジェクト指向(object-oriented)は同時に発案者であるアラン・ケイの手を離れてプログラミングパラダイムからソフトウェア工学分野へと認識拡大し、1986年以降はACM(計算機協会)開催のOOPSLA(オブジェクト指向会議)が中心的な担い手の役割を果たしていた。70年代から80年代前半にかけてのオブジェクト指向はSmalltalk言語仕様の一環としてそれに当たることで一定の理解を得られたが、80年代後半以降は事情が異なっている。

1989年頃[編集]

1989年に発表されたUser Interface A Personal Viewという記事の中でアラン・ケイは、Smalltalkのオブジェクト指向性は大変示唆的であると前置きした上でこう述べている[4]

object-oriented means that the object knows what it can do.
(オブジェクト指向とは、オブジェクトが出来る”なにか”を知っていることを意味している) — Alan Kay

これは認知心理学アフォーダンスにつながる考え方と解釈されている。この意味についてケイは抽象的なシンボルの視点と、具象的なユーザーインターフェース表示の視点のプロセスを対照させながら説明している。前者では我々はまずオブジェクトの名前(識別子)を示し、次にそのオブジェクトが実行する”なにか”を知らせるメッセージを続かせることになる。メッセージには実コードや実データの中間参照になる抽象的シンボル(文字列ないし数列)が含まれている。後者では我々はまず操作する対象を選択し、次にその対象が提供する”なにか”のメニュー覧を表示させることになる。メニューの各項目名は抽象的シンボルと同義になる。この双方を踏まえた上でケイはこう結論している。

In both case we have the object first and the desire second. this unifies the concrete with the abstract in highly satisfying way.
(具象と抽象の両視点においてオブジェクト(対象)を第一とし、欲求を第二とする。これは高い満足度で具象と抽象を一体化する) — Alan Kay

1993年頃[編集]

1992年にACMからプログラミング言語史編纂の一環として執筆を依頼されたアラン・ケイは、翌年のACM刊行記事においてオブジェクト指向の構想を改めて六つの要約にまとめて説明した[1]

1, EverythingIsAnObject.

2, Objects communicate by sending and receiving messages (in terms of objects).

3, Objects have their own memory (in terms of objects).

4, Every object is an instance of a class (which must be an object).

5, The class holds the shared behavior for its instances (in the form of objects in a program list).

6, To eval a program list, control is passed to the first object and the remainder is treated as its message. — Alan Kay

この和訳は以下のようになる。

  1. すべてはオブジェクトである。
  2. オブジェクトはメッセージの送信と受信によってコミュニケーションする。
  3. オブジェクトは自身の記憶を持つ。
  4. すべてのオブジェクトはクラスのインスタンスである。クラスもまたオブジェクトであるべきである。
  5. クラスはそのインスタンスたちのために共有される振る舞いを保持する。振る舞いはプログラムリストのオブジェクトの形態である。
  6. プログラムリストの評価では、制御は最初のオブジェクトに渡され、残りはそのメッセージとして処理される。

オブジェクトがhaveする記憶とは、オブジェクト所属のデータのようである。オブジェクトがholdする振る舞いと形容されているプログラムリストとは、LISPのフォームないしフォームリストに因んだものであり、関数シンボル、変数シンボル、アトム、数値といったものを連ねたデータ列である。このデータ列をコードとして解釈演算するのが評価(eval)である。この評価を制御(control)する権利はメッセージの受け取り側に渡されるので、同じシンボルでもそのオブジェクトの文脈(context)によって意味内容が変わるという実行時多態を表わしている。

1998年頃[編集]

1998年にAn Introduction To Object-Oriented Programmingを出版したオレゴン大学コンピュータサイエンス教授ティム・バッドによると、この時期のアラン・ケイの構想はこのようになっていた[5]

1, EverythingIsAnObject.

2, Communication is performed by objects communicating with each other, requesting that objects perform actions. Objects communicate by sending and receiving messages. A message is a request for action, bundled with whatever objects may be necessary to complete the task.

3, Objects have their own memory, which consists of other objects.

4, Every object is an instance of a class. A class simply represents a grouping of similar objects, such as integers or lists.

5, The class is the repository for behavior associated with an object. That is, all objects that are instances of the same class can perform the same actions.

6, Classes are organized into a singly-rooted tree structure, called the inheritance hierarchy. Memory and behavior associated with instances of a class are available to any class associated with a descendent in this tree structure. — Alan Kay

この和訳は以下のようになる。

  1. すべてはオブジェクトである。
  2. コミュニケーションはオブジェクトに動作実効を要求するオブジェクトの相互通信で実効される。オブジェクトはメッセージの送受信でコミュニケーションする。メッセージはタスク遂行に必要なオブジェクトが付帯された動作要求である。
  3. オブジェクトは自身の記憶を持つ。記憶は他のオブジェクトたちで構成されている。
  4. すべてのオブジェクトはクラスのインスタンスである。クラスは数値集合やリスト集合といったように類似オブジェクトのグループ化をシンプルに表現する。
  5. クラスはオブジェクトに関連付けられた振る舞いのリポジトリである。同じクラスのインスタンスである全てのオブジェクトは共通動作を実効できる。
  6. クラスは継承階層と呼ばれる単一ツリー構造で組成される。クラスのインスタンスの記憶と振る舞いは、ツリー構造下の子孫であるクラスからも利用できる。

オブジェクトに振る舞いを求めるメッセージ自体にもオブジェクトが含まれていることや、オブジェクトの記憶自体も他のオブジェクトの集合であることが示されており、メッセージと記憶の意味がより明らかにされている。また、プログラムリストを評価するなどの構想が、単一継承を重視する考えに置き換えられている。

2003年頃[編集]

2003年にとある知人からオブジェクト指向の意味を尋ねられたアラン・ケイはこのようにメール上で答えている[6]

OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.
(僕にとってのオブジェクト指向とは、メッセージング、ステートプロセスの局所保持かつ保護かつ隠蔽、徹底的な遅延バインディング、これだけの意味だった。) — Alan Kay

messaging」「state-process」「late-binding」のうち一番目と二番目は、object-orientedと同様にケイの造語のようである。一番目はオブジェクト同士のコミュニケーションを指しておりメッセージパッシングに類似の概念である。二番目のステートプロセスは状態処理が適訳と思われるが、元々が造語であるため詳細は漠然としている。

2020年頃[編集]

Q&AサイトのQuoraで「66~67年のオブジェクト指向という造語を発したアラン・ケイに誰かが影響を与えていたのか?」という質問に対して本人がこう回答している。なお、rotationとは「一つのコンピュータはどこかのコンピュータができることをできる、相互通信によってあらゆる規模の計算可能性を表現できる」を意味している。

In the 1960s, software composites that were more complex than arrays, were often called “objects”, and all the schemes I had seen involved structures that included attached procedures. A month or so after the “rotation” someone asked me what I was doing, and I foolishly said “object-oriented programming”.
(60年代、配列より複雑なソフトウェア構成体はしばしばオブジェクトと呼ばれていた。手続きを付けた構造体を僕もそう見ていた。rotation構想の後、今何をしているのかと尋ねられた僕は愚かにもこう言った。オブジェクト指向プログラミングと。) — Alan Kay
The foolish part is that “object” is a very bad word for what I had in mind — it is too inert and feels too much like “data”. Simula called its instances “processes” and that is better.“Process-oriented programming” would have been much better, don’t you think?
(僕の考えを表現するのにオブジェクトはとても悪い言葉だった。不活性的でデータを過剰に意識させたからだ。Simulaはプロセスと呼んでいた。これはいい。プロセス指向プログラミングの方がずっと良かったんじゃないか?) — Alan Kay

その解釈[編集]

脚注[編集]

出典

関連項目[編集]