「オブジェクト指向」の版間の差分
オブジェクト指向とは |
|||
3行目: | 3行目: | ||
== オブジェクト指向の来歴 == |
== オブジェクト指向の来歴 == |
||
オブジェクト指向(''object-oriented'')という言葉自体は、1972年から80年にかけてプログラミング言語「[[Smalltalk]]」を公開した[[パロアルト研究所]]の計算機科学者[[アラン・ケイ]]がその設計を説明する中で初めて作り出されている<ref name="EarlyHistoryOfSmalltalk">{{Cite web|url=http://worrydream.com/EarlyHistoryOfSmalltalk/|title=The Early History Of Smalltalk|author=Alan C. Kay|accessdate=2019 |
オブジェクト指向(''object-oriented'')という言葉自体は、1972年から80年にかけてプログラミング言語「[[Smalltalk]]」を公開した[[パロアルト研究所]]の計算機科学者[[アラン・ケイ]]がその設計を説明する中で初めて作り出されている<ref name="EarlyHistoryOfSmalltalk">{{Cite web|url=http://worrydream.com/EarlyHistoryOfSmalltalk/|title=The Early History Of Smalltalk|author=Alan C. Kay|accessdate=2019-01|publisher=}}</ref>。本人の述懐によると、大学院時代のケイがプログラミング言語「[[Simula]]」に感化されて日夜プログラミング・アーキテクチャの思索に耽っていた1967年頃、今何をしているのかと尋ねてきた知人に対して「''object-oriented programming''だよ」と咄嗟の造語で答えたのが発端だという。なお、ケイがSmalltalkを開発する中で提唱したオブジェクト指向と、1980年頃からSimulaに結び付けられるようになったタームとしてのオブジェクト指向の性格は全く異なるものであったが、結果的に[[オブジェクト (プログラミング)|オブジェクト]]というプログラム概念が注目を集めた事で、そのルーツである[[クラス (コンピュータ)|クラス]]と[[オブジェクト (プログラミング)|オブジェクト]]の設計を備えたSimulaもオブジェクト指向の草分けと見なされるようになった<ref>[http://kristennygaard.org/FORSKNINGSDOK_MAPPE/F_OO_start.html How Object-Oriented Programming Started]</ref>。データとコードの複合体であるオブジェクト(''object'')という用語を確立したのはSimulaであったが、その設計は[[手続き型プログラミング]]の機能拡張に近いものである<ref>{{Cite web|url=https://www.cs.cmu.edu/~charlie/courses/15-214/2014-fall/slides/25-history-oo.pdf|title=OO History: Simula and Smalltalk|author=Jonathan Aldrich and Charlie Garrod|date=2014|accessdate=2019-02-01}}</ref>。それに対してSmalltalkは、[[関数型プログラミング]]の原型と目される「[[LISP]]」の影響の方が強調されていた<ref name="EarlyHistoryOfSmalltalk" />。その後、計算機科学者[[ビャーネ・ストロヴストルップ]]が1983年に公開した「[[C++]]」が契機になってオブジェクト指向に関連する様々な考え方が再定義されている。C++はSimulaの方をモデルにしていた。 |
||
1986年から[[Association for Computing Machinery|ACM]]が[[OOPSLA]](オブジェクト指向会議)を年度開催するようになり、オブジェクト指向は[[コンピュータサイエンス]]の一つのムーブメントになった。[[OOPSLA]]初期のチェアパーソンは、[[Smalltalk]]が生まれた[[ゼロックス|ゼロックス社]][[パロアルト研究所]]のフェローが務めることが多かった。Smalltalkは正確にはプログラミング言語と[[グラフィカルユーザインタフェース|GUI]]運用環境を合わせた[[フレームワーク]]であり、[[Alto|ゼロックスAlto]]機上の[[ミドルウェア]]として開発されていた。Smalltalkは70年代の[[アラン・ケイ]]が構想していた[[ダイナブック]]のための[[グラフィカルユーザインタフェース|GUI]]環境でもあった。[[Alto]]は[[GUI]]を初めて汎用的にサポートしたコンピュータと[[オペレーティングシステム|OS]]であり、かの[[スティーブ・ジョブズ|スティーブ・ジョブス]]を啓発して[[Macintosh]]のモデルになったことはよく知られている。こうした背景からオブジェクト指向は、上述のプログラミング云々よりも、[[グラフィカルユーザインタフェース|GUI]](グラフィカル・ユーザー・インターフェース)を始めにした当時の先進的な[[ソフトウェア設計|ソフトウェアデザイン]]と[[ソフトウェアアーキテクチャ]]のための開拓的なモデル理論として受け止められる方が好まれた。[[デザインパターン (ソフトウェア)|デザインパターン]]、[[リファクタリング (プログラミング)|リファクタリング]]、[[モデル駆動工学]]、[[ドメインモデル]]、[[ドメイン固有言語]]、[[アジャイルソフトウェア開発]]といった数々のトピックが[[OOPSLA]]から生まれている。具体的に応用された最初の例は[[データベース]]開発と[[NEXTSTEP|NeXTSTEP]]などの[[オペレーティングシステム]]開発であった。 |
1986年から[[Association for Computing Machinery|ACM]]が[[OOPSLA]](オブジェクト指向会議)を年度開催するようになり、オブジェクト指向は[[コンピュータサイエンス]]の一つのムーブメントになった。[[OOPSLA]]初期のチェアパーソンは、[[Smalltalk]]が生まれた[[ゼロックス|ゼロックス社]][[パロアルト研究所]]のフェローが務めることが多かった。Smalltalkは正確にはプログラミング言語と[[グラフィカルユーザインタフェース|GUI]]運用環境を合わせた[[フレームワーク]]であり、[[Alto|ゼロックスAlto]]機上の[[ミドルウェア]]として開発されていた。Smalltalkは70年代の[[アラン・ケイ]]が構想していた[[ダイナブック]]のための[[グラフィカルユーザインタフェース|GUI]]環境でもあった。[[Alto]]は[[GUI]]を初めて汎用的にサポートしたコンピュータと[[オペレーティングシステム|OS]]であり、かの[[スティーブ・ジョブズ|スティーブ・ジョブス]]を啓発して[[Macintosh]]のモデルになったことはよく知られている。こうした背景からオブジェクト指向は、上述のプログラミング云々よりも、[[グラフィカルユーザインタフェース|GUI]](グラフィカル・ユーザー・インターフェース)を始めにした当時の先進的な[[ソフトウェア設計|ソフトウェアデザイン]]と[[ソフトウェアアーキテクチャ]]のための開拓的なモデル理論として受け止められる方が好まれた。[[デザインパターン (ソフトウェア)|デザインパターン]]、[[リファクタリング (プログラミング)|リファクタリング]]、[[モデル駆動工学]]、[[ドメインモデル]]、[[ドメイン固有言語]]、[[アジャイルソフトウェア開発]]といった数々のトピックが[[OOPSLA]]から生まれている。具体的に応用された最初の例は[[データベース]]開発と[[NEXTSTEP|NeXTSTEP]]などの[[オペレーティングシステム]]開発であった。 |
||
26行目: | 26行目: | ||
=== コンセプト === |
=== コンセプト === |
||
1970年代に[[パロアルト研究所]]で誕生し、1981年頃から知名度を得るようになったオブジェクト指向(''object-oriented'')は同時に発案者である[[アラン・ケイ]]の手を離れて[[プログラミングパラダイム]]から[[ソフトウエア工学知識体系|ソフトウェア工学]]分野へと認識拡大し、1986年以降は[[Association for Computing Machinery|ACM]](計算機学会)開催の[[OOPSLA]](オブジェクト指向会議)が |
1970年代に[[パロアルト研究所]]で誕生し、1981年頃から知名度を得るようになったオブジェクト指向(''object-oriented'')は同時に発案者である[[アラン・ケイ]]の手を離れて[[プログラミングパラダイム]]から[[ソフトウエア工学知識体系|ソフトウェア工学]]分野へと認識拡大し、1986年以降は[[Association for Computing Machinery|ACM]](計算機学会)開催の[[OOPSLA]](オブジェクト指向会議)が中心的な担い手の役割を果たしていた。70年代から80年代前半にかけてのオブジェクト指向は[[Smalltalk]]言語仕様の一環としてそれに当たることで一定の理解を得られたが、80年代後半以降は事情が異なっている。 |
||
==== 1993年頃 ==== |
==== 1993年頃 ==== |
||
51行目: | 51行目: | ||
==== 1998年頃 ==== |
==== 1998年頃 ==== |
||
1998年にAn Introduction To Object-Oriented Programming''を出版した[[オレゴン大学]]コンピュータサイエンス教授ティム・バッドによると、この時期のアラン・ケイの構想はこのようになっていた''<ref>{{Cite web|url=http://wiki.c2.com/?AlanKaysDefinitionOfObjectOriented|title=Alan Kays Definition Of Object Oriented|accessdate=2020-1|publisher=}}</ref>''。''{{Quotation|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}}''この和訳は以下のようになる。'' |
|||
# すべてはオブジェクトである。 |
|||
# コミュニケーションはオブジェクトに動作実効を要求するオブジェクトの相互通信で実効される。オブジェクトはメッセージの送受信でコミュニケーションする。メッセージはタスク遂行に必要なオブジェクトが付帯された動作要求である。 |
|||
# オブジェクトは自身の記憶を持つ。記憶は他のオブジェクトたちで構成されている。 |
|||
# すべてのオブジェクトはクラスのインスタンスである。クラスは数値やリストといった類似オブジェクトのグループをシンプル表現する。 |
|||
# クラスはオブジェクトに関連付けられた振る舞いのリポジトリである。同じクラスのインスタンスである全てのオブジェクトは共通動作を実効できる。 |
|||
# クラスは継承階層と呼ばれる単一ツリー構造で組成される。クラスのインスタンスの記憶と振る舞いは、ツリー構造下の子孫であるクラスからも利用できる。 |
|||
オブジェクトに動作を求めるメッセージ自体にもオブジェクトが含まれていることや、オブジェクトの記憶もオブジェクトの集合であることが示されており、メッセージと記憶の意味がより明らかにされている。プログラムリスト評価の考えが、単一継承を重視する考えに置き換えられており、これは1993年時と決定的に異なっている。 |
|||
==== 2003年頃 ==== |
==== 2003年頃 ==== |
||
2003年にオブジェクト指向の意味を再び尋ねられたケイは、恐らく巷で言われる「カプセル化、継承、多態性」を意識した上でこのように答えている<ref>{{Cite web|url=http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/doc_kay_oop_en|title=E-Mail of 2003-07-23|accessdate=2019- |
2003年にオブジェクト指向の意味を再び尋ねられたケイは、恐らく巷で言われる「カプセル化、継承、多態性」を意識した上でこのようにメールから答えている<ref>{{Cite web|url=http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/doc_kay_oop_en|title=E-Mail of 2003-07-23|accessdate=2019-1|publisher=}}</ref>。{{Quotation|''OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.'' |
||
<br>(僕にとってのオブジェクト指向は、メッセージングと、ステートプロセスの局所保持かつ保護かつ隠蔽と、あらゆるもの同士の徹底的な遅延バインディングだけだ)|Alan Kay}} |
<br>(僕にとってのオブジェクト指向は、メッセージングと、ステートプロセスの局所保持かつ保護かつ隠蔽と、あらゆるもの同士の徹底的な遅延バインディングだけだ)|Alan Kay}} |
||
「''messaging''」「''state-process''」「''late-binding''」のうち一番目と二番目は、''object-oriented''と同様にケイの造語なので注意が必要である。一番目は[[メッセージパッシング|メッセージ・パッシング]]の派生語である。二番目のステートプロセスは状態処理が適訳と思われるが、元々が造語であるため詳細は漠然としている。 |
「''messaging''」「''state-process''」「''late-binding''」のうち一番目と二番目は、''object-oriented''と同様にケイの造語なので注意が必要である。一番目は[[メッセージパッシング|メッセージ・パッシング]]の派生語である。二番目のステートプロセスは状態処理が適訳と思われるが、元々が造語であるため詳細は漠然としている。 |
||
=== |
==== 2020年頃 ==== |
||
=== その解釈 === |
|||
== 脚注 == |
== 脚注 == |
2020年8月16日 (日) 09:30時点における版
![]() | この記事には独自研究が含まれているおそれがあります。 |
オブジェクト指向(オブジェクトしこう、英: object-oriented)は、ソフトウェア開発とコンピュータプログラミングのために用いられる考え方である。元々は特定のプログラミングパラダイムを説明するために考案された言葉だった。明確な用語としては1970年代に誕生し、1980年代前半に知名度を得て、考案者の手を離れた自由で曖昧な定義のまま発展を続けた後に、1990年代に入るとソフトウェア工学の様々な分野にも応用されるようになった。ソフトウェア開発における一つの標語のような扱い方もされている。
オブジェクト指向の来歴
オブジェクト指向(object-oriented)という言葉自体は、1972年から80年にかけてプログラミング言語「Smalltalk」を公開したパロアルト研究所の計算機科学者アラン・ケイがその設計を説明する中で初めて作り出されている[1]。本人の述懐によると、大学院時代のケイがプログラミング言語「Simula」に感化されて日夜プログラミング・アーキテクチャの思索に耽っていた1967年頃、今何をしているのかと尋ねてきた知人に対して「object-oriented programmingだよ」と咄嗟の造語で答えたのが発端だという。なお、ケイがSmalltalkを開発する中で提唱したオブジェクト指向と、1980年頃からSimulaに結び付けられるようになったタームとしてのオブジェクト指向の性格は全く異なるものであったが、結果的にオブジェクトというプログラム概念が注目を集めた事で、そのルーツであるクラスとオブジェクトの設計を備えたSimulaもオブジェクト指向の草分けと見なされるようになった[2]。データとコードの複合体であるオブジェクト(object)という用語を確立したのはSimulaであったが、その設計は手続き型プログラミングの機能拡張に近いものである[3]。それに対してSmalltalkは、関数型プログラミングの原型と目される「LISP」の影響の方が強調されていた[1]。その後、計算機科学者ビャーネ・ストロヴストルップが1983年に公開した「C++」が契機になってオブジェクト指向に関連する様々な考え方が再定義されている。C++はSimulaの方をモデルにしていた。
1986年からACMがOOPSLA(オブジェクト指向会議)を年度開催するようになり、オブジェクト指向はコンピュータサイエンスの一つのムーブメントになった。OOPSLA初期のチェアパーソンは、Smalltalkが生まれたゼロックス社パロアルト研究所のフェローが務めることが多かった。Smalltalkは正確にはプログラミング言語とGUI運用環境を合わせたフレームワークであり、ゼロックスAlto機上のミドルウェアとして開発されていた。Smalltalkは70年代のアラン・ケイが構想していたダイナブックのためのGUI環境でもあった。AltoはGUIを初めて汎用的にサポートしたコンピュータとOSであり、かのスティーブ・ジョブスを啓発してMacintoshのモデルになったことはよく知られている。こうした背景からオブジェクト指向は、上述のプログラミング云々よりも、GUI(グラフィカル・ユーザー・インターフェース)を始めにした当時の先進的なソフトウェアデザインとソフトウェアアーキテクチャのための開拓的なモデル理論として受け止められる方が好まれた。デザインパターン、リファクタリング、モデル駆動工学、ドメインモデル、ドメイン固有言語、アジャイルソフトウェア開発といった数々のトピックがOOPSLAから生まれている。具体的に応用された最初の例はデータベース開発とNeXTSTEPなどのオペレーティングシステム開発であった。
1989年にはIBM社、アップル社、ヒューレットパッカード社、サンマイクロシステムズ社、データゼネラル社、アメリカン航空などの11社がコンピュータ産業共同事業団体OMG(Object Management Group)を設立した。OMGの目的は、企業システムネットワークの基盤になる分散コンピューティングを構築するための基礎要素になる分散オブジェクト設計の標準化を図ることであった。ここでのオブジェクトもデータとメソッド(=コード)の組み合わせと定義されていたので、この業務用システムないしネットワークの構築を目的にした技術アーキテクチャも人々の共通認識としてオブジェクト指向にそのまま包括された。OMGが1997年に策定したUMLは、オブジェクト指向ソフトウェア工学に準拠したものとして発表されている。
オブジェクト指向の分野
オブジェクト指向はプログラミングパラダイムとして誕生した理論である。そのデータ(変数またはプロパティ)とコード(関数またはメソッド)のセットを基本要素にして物事を解析する考え方が1980年代から大きく注目され始めたことで、ソフトウェア開発の様々な局面にobject-orientedを接頭辞にした分野が立ち上げられた。大まかな特徴としては情報資源と処理手順を別々にして分析ないし設計を行っていた従来の標準的な手法に対し、オブジェクト指向と名が付く分野ではこの双方をひとまとめにして物事の解析と組み立てを行う点が共通している。
- オブジェクト指向プログラミング - 1970年代から
- オブジェクトデータベース - 1980年代から
- オブジェクト指向オペレーティングシステム - 1980年代から
- オブジェクト指向ユーザーインターフェース - 1990年代から
- オブジェクト関係データベース - 1990年代から
- オブジェクト指向分析設計 - 1990年代から
- オブジェクト指向モデリング - 1990年代から
- オブジェクト指向ソフトウェア工学 - 1990年代から
- 統一モデリング言語(UML) - 1997年から
- オブジェクト指向マネージメント - 2000年代から
- オブジェクト指向存在論 - 哲学分野
オブジェクト指向とは
コンセプト
1970年代にパロアルト研究所で誕生し、1981年頃から知名度を得るようになったオブジェクト指向(object-oriented)は同時に発案者であるアラン・ケイの手を離れてプログラミングパラダイムからソフトウェア工学分野へと認識拡大し、1986年以降はACM(計算機学会)開催のOOPSLA(オブジェクト指向会議)が中心的な担い手の役割を果たしていた。70年代から80年代前半にかけてのオブジェクト指向はSmalltalk言語仕様の一環としてそれに当たることで一定の理解を得られたが、80年代後半以降は事情が異なっている。
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
この和訳は以下のようになる。
- すべてはオブジェクトである。
- オブジェクトはメッセージの送信と受信によってコミュニケーションする。
- オブジェクトは自身の記憶を持つ。
- すべてのオブジェクトはクラスのインスタンスである。クラスもまたオブジェクトであるべきである。
- クラスはそのインスタンスたちのために共有される振る舞いを保持する。振る舞いはプログラムリストのオブジェクトの形態である。
- プログラムリストの評価では、制御は最初のオブジェクトに渡され、残りはそのメッセージとして処理される。
メッセージと記憶は、オブジェクトの独自用語とされておりその解釈は先送りする。プログラムリストはLISP言語由来の言葉であり、計算シンボル、関数シンボル、変数シンボル、数列、数値をトークン単位で連ねたデータ列である。データ列をそのままコード列として解釈演算するのが評価(eval)である。評価の管理が制御(control)であり、この場合はどのプログラムスコープで管理されるかを意味する。プログラムリストはメッセージとして処理されると示されているので、すなわちメッセージを送られたオブジェクトのスコープでその評価は制御される事になる。スコープはコンテキストとも読み替えられ、同じシンボルでもコンテキストによって意味が変わった。オブジェクトの記憶のhaveに対して、振る舞いのholdの違いにも留意する必要がある。
1998年頃
1998年にAn Introduction To Object-Oriented Programmingを出版したオレゴン大学コンピュータサイエンス教授ティム・バッドによると、この時期のアラン・ケイの構想はこのようになっていた[4]。
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
この和訳は以下のようになる。
- すべてはオブジェクトである。
- コミュニケーションはオブジェクトに動作実効を要求するオブジェクトの相互通信で実効される。オブジェクトはメッセージの送受信でコミュニケーションする。メッセージはタスク遂行に必要なオブジェクトが付帯された動作要求である。
- オブジェクトは自身の記憶を持つ。記憶は他のオブジェクトたちで構成されている。
- すべてのオブジェクトはクラスのインスタンスである。クラスは数値やリストといった類似オブジェクトのグループをシンプル表現する。
- クラスはオブジェクトに関連付けられた振る舞いのリポジトリである。同じクラスのインスタンスである全てのオブジェクトは共通動作を実効できる。
- クラスは継承階層と呼ばれる単一ツリー構造で組成される。クラスのインスタンスの記憶と振る舞いは、ツリー構造下の子孫であるクラスからも利用できる。
オブジェクトに動作を求めるメッセージ自体にもオブジェクトが含まれていることや、オブジェクトの記憶もオブジェクトの集合であることが示されており、メッセージと記憶の意味がより明らかにされている。プログラムリスト評価の考えが、単一継承を重視する考えに置き換えられており、これは1993年時と決定的に異なっている。
2003年頃
2003年にオブジェクト指向の意味を再び尋ねられたケイは、恐らく巷で言われる「カプセル化、継承、多態性」を意識した上でこのようにメールから答えている[5]。
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年頃
その解釈
脚注
出典
- ^ a b c Alan C. Kay. “The Early History Of Smalltalk”. 2019年1月閲覧。
- ^ How Object-Oriented Programming Started
- ^ Jonathan Aldrich and Charlie Garrod (2014年). “OO History: Simula and Smalltalk”. 2019年2月1日閲覧。
- ^ “Alan Kays Definition Of Object Oriented”. 2020年1月閲覧。
- ^ “E-Mail of 2003-07-23”. 2019年1月閲覧。
関連項目
- アラン・ケイ
- Smalltalk
- LISP
- Simula
- ダイナブック
- Xerox Alto
- GUI
- 仮想マシン
- アクターモデル
- Macintosh
- NeXTSTEP
- パロアルト研究所
- OOPSLA
- オブジェクト関係マッピング
- ブーチメソッド
- オブジェクトモデル化技法