コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

「オブジェクト指向」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
編集の要約なし
編集の要約なし
7行目: 7行目:


== オブジェクト指向の成り立ち ==
== オブジェクト指向の成り立ち ==
オブジェクト指向(''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-02-21}}</ref>。他のエピソードによると、1967年に公開された「[[Simula|Simula 67]]」を当時大学院生だったケイが知った際に「あれは''object-oriented''だな!」と咄嗟の造語で評論したのが発端だという。なお、[[Simula|Simula 67]]に結び付けられたオブジェクト指向と、後にケイ自身が開発する[[Smalltalk]]の理念とされたオブジェクト指向の性格は全く異なるものであったが、いずれにせよ[[クラス (コンピュータ)|クラス]]と[[オブジェクト (プログラミング)|オブジェクト]]の設計を備えた[[Simula|Simula 67]]もオブジェクト指向の草分けと見なされるようになった<ref>[http://kristennygaard.org/FORSKNINGSDOK_MAPPE/F_OO_start.html How Object-Oriented Programming Started]</ref>。データとコードの複合体であるオブジェクト(''object'')という用語を確立したのは[[Simula|Simula 67]]であったが<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-02}}</ref>、その設計は[[手続き型プログラミング]]の機能拡張に近いものである。アラン・ケイ自身は「[[LISP]]」の影響を受けた事を強調しており<ref name="EarlyHistoryOfSmalltalk" />、前述の通り[[Smalltalk]]のオブジェクト指向設計は完全に別物であった。その後、計算機科学者[[ビャーネ・ストロヴストルップ]]が1983年に公開した「[[C++]]」が契機となって、オブジェクト指向に関連する様々な考え方が再定義されている。[[C++]]の設計は[[Simula|Simula 67]]の方をモデルにしていた。
オブジェクト指向(''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-02-21}}</ref>。他のエピソードによると、1967年に公開された「[[Simula|Simula 67]]」を当時大学院生だったケイが知った際に''object-oriented''という咄嗟の造語で評論したのが発端だという。なお、[[Simula|Simula 67]]に結び付けられたオブジェクト指向と、後にケイ自身が開発する[[Smalltalk]]の理念とされたオブジェクト指向の性格は全く異なるものであったが、いずれにせよ[[クラス (コンピュータ)|クラス]]と[[オブジェクト (プログラミング)|オブジェクト]]の設計を備えた[[Simula|Simula 67]]もオブジェクト指向の草分けと見なされるようになった<ref>[http://kristennygaard.org/FORSKNINGSDOK_MAPPE/F_OO_start.html How Object-Oriented Programming Started]</ref>。データとコードの複合体であるオブジェクト(''object'')という用語を確立したのは[[Simula|Simula 67]]であったが<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-02}}</ref>、その設計は[[手続き型プログラミング]]の機能拡張に近いものである。アラン・ケイ自身は「[[LISP]]」の影響を受けた事を強調しており<ref name="EarlyHistoryOfSmalltalk" />、前述の通り[[Smalltalk]]のオブジェクト指向設計は完全に別物であった。その後、計算機科学者[[ビャーネ・ストロヴストルップ]]が1983年に公開した「[[C++]]」が契機となって、オブジェクト指向に関連する様々な考え方が再定義されている。[[C++]]の設計は[[Simula|Simula 67]]の方をモデルにしていた。


上述の様にオブジェクト指向とは元々プログラミング・パラダイムとして編み出された理論であったが、1980年代から[[データベース]]と[[オペレーティングシステム|OS]]の開発にもその設計構想が活かされるようになり、1990年代になるとソフトウェア工学の幅広い面にも応用されて、オブジェクト指向を土台にした様々な分野が開拓される事になった。
上述の様にオブジェクト指向とは元々プログラミング・パラダイムとして編み出された理論であったが、1980年代から[[データベース]]と[[オペレーティングシステム|OS]]の開発にもその設計構想が活かされるようになり、1990年代になるとソフトウェア工学の幅広い面にも応用されて、オブジェクト指向を土台にした様々な分野が開拓される事になった。
25行目: 25行目:


=== 概要 ===
=== 概要 ===
オブジェクト指向(''object-oriented'')の言葉を生み出した計算機科学者[[アラン・ケイ]]は、1970年代に発表した文書の中でその設計構想を六つの要約で説明している<ref name="EarlyHistoryOfSmalltalk" />。
オブジェクト指向(''object-oriented'')の言葉を生み出した計算機科学者[[アラン・ケイ]]は、1970年代に発表した文書の中でその設計構想を六つの要約で説明している<ref name="EarlyHistoryOfSmalltalk" />。{{Quotation|1, EverythingIsAnObject.


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

#''Objects communicate by sending and receiving messages (in terms of objects).''
#''Objects have their own memory (in terms of objects).''
3, Objects have their own memory (in terms of objects).

#''Every object is an instance of a class (which must be an object).''
4, Every object is an instance of a class (which must be an object).
#''The class holds the shared behavior for its instances (in the form of objects in a program list).''

#''To eval a program list, control is passed to the first object and the remainder is treated as its message.''
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}}以下はその和訳である。


これをやや意訳するとこうなる。
# すべてはオブジェクトである。
# すべてはオブジェクトである。
# オブジェクトはメッセージのによってコミュニケーションする。
# オブジェクトはメッセージの受け答えによってコミュニケーションする。
# オブジェクトは自身のメモリーを持つ。
# オブジェクトは自身のメモリーを持つ。
# どのオブジェクトもクラスのインスタンスであり、クラスもまたオブジェクトである。
# どのオブジェクトもクラスのインスタンスであり、クラスもまたオブジェクトである。
42行目: 44行目:
# プログラム実行時は、制御は最初のオブジェクトに渡され、残りはそのメッセージとして扱われる。
# プログラム実行時は、制御は最初のオブジェクトに渡され、残りはそのメッセージとして扱われる。


また、2003年にオブジェクト指向の意味を再び尋ねられたケイは、恐らく巷のプログラミングで言われる「カプセル化、継承、多態性」を意識した上でこのように答えている。{{Quotation|“OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.”


(僕にとってのオブジェクト指向とは、メッセージング、ローカルな記憶保持と保護と実行状態の隠蔽、徹底的な遅延バインディング、これらに尽きるね)|Alan Kay}}初期に発表された六つの要約と、後にケイが明かした三つのコンセプトを踏まえた上で以下を記す。


'''(1)'''はプログラム内のあらゆる要素をオブジェクトとして扱う事を示している。従来の変数や文字列や構造体だけに留まらず、数値(プリミティブ)や真偽値(ブーリアン)や演算子(オペレータ)、更には手続き(コードブロック)や制御文(コントロールフロー)やクラス構造情報(メタデータ)までもオブジェクトにした点が一線を画していた。これがオブジェクト指向と名付けられた由縁である。
'''(1)'''はプログラム内のあらゆる要素をオブジェクトとして扱う事を示している。従来の変数や文字列や構造体だけに留まらず、数値(プリミティブ)や真偽値(ブーリアン)や演算子(オペレータ)、更には手続き(コードブロック)や制御文(コントロールフロー)やクラス構造情報(メタデータ)までもオブジェクトにした点が一線を画していた。これがオブジェクト指向と名付けられた由縁である。
49行目: 53行目:


=== 解説 ===
=== 解説 ===
オブジェクト指向を提唱する中で[[アラン・ケイ]]は[[LISP]]の影響を受けた事を言及しているが、具体的に参考とされたのは、''lambda''のキーワードで表現される[[高階関数]]の仕組みと、''atomと定義される''データ表現であったという<ref name="EarlyHistoryOfSmalltalk" />。なお、他方では[[Simula|Simula 67]]の言語仕様を始めて見た際に「あれは''object-oriented''だな」と語ったというエピソードも紹介されており、[[Smalltalk]]公開当時のケイは何か含む所があって[[Simula|Simula 67]]に対する言及を恐らく意図的に避けていたが、現実的にはLISPの''atom''とSimula 67の''object''&''class''の双方を参考にしてデータ(変数またはプロパティ)とコード(関数またはメソッド)の複合体であるオブジェクトというプログラム概念を考案したと見るのが衆目の一致する所となっている。80年代に入り[[C++]]が公開されると、Simula 67にも言及するようになった代わりに今度はC++をオブジェクト指向の観点から語ろうとはしなかったが、その言語仕様に内包される[[抽象化 (計算機科学)|抽象化]]のプログラミング概念については度々触れていた。
オブジェクト指向を提唱する中で[[アラン・ケイ]]は[[LISP]]の影響を受けた事を言及しているが、具体的に参考とされたのは、''lambda''のキーワードで表現される[[高階関数]]の仕組みと、''atomと定義される''データ表現であったという<ref name="EarlyHistoryOfSmalltalk" />。なお、他方では[[Simula|Simula 67]]の言語仕様を始めて見た際に「あれは''object-oriented''だな」と語ったというエピソードも紹介されており、[[Smalltalk]]公開当時のケイは何か含む所があって[[Simula|Simula 67]]に対する言及を恐らく意図的に避けていたが、現実的にはLISPの''atom''とSimula 67の''object''&''class''の双方を参考にしてデータ(変数またはプロパティ)とコード(関数またはメソッド)の複合体であるオブジェクトというプログラム概念を考案したと見るのが衆目の一致する所となっている。80年代に入り[[C++]]が公開されると、Simula 67にも言及するようになった代わりに今度はC++をオブジェクト指向の観点から語ろうとはしなかったが、その言語仕様に内包される[[抽象化 (計算機科学)|抽象化]]のプログラミング概念については度々触れていた。


==脚注==
==脚注==

2019年6月18日 (火) 05:01時点における版

オブジェクト指向(オブジェクトしこう、: object-oriented)は、ソフトウェア工学理論の一つであり、ソフトウェア設計とプログラム記述の際に用いられる考え方である。元々は特定のプログラミング・パラダイムを説明する為に考案された言葉だった。object-oriented programmingのように修飾語として用いられるのが常であり、それ単体で扱われる事はない漠然とした設計構想でもある。

オブジェクト指向の成り立ち

オブジェクト指向(object-oriented)という言葉自体は、1972年から80年にかけてプログラミング言語「Smalltalk」を公開した計算機科学者アラン・ケイが、その言語設計を説明する中で初めて生み出されている[1]。他のエピソードによると、1967年に公開された「Simula 67」を当時大学院生だったケイが知った際に、object-orientedという咄嗟の造語で評論したのが発端だという。なお、Simula 67に結び付けられたオブジェクト指向と、後にケイ自身が開発するSmalltalkの理念とされたオブジェクト指向の性格は全く異なるものであったが、いずれにせよクラスオブジェクトの設計を備えたSimula 67もオブジェクト指向の草分けと見なされるようになった[2]。データとコードの複合体であるオブジェクト(object)という用語を確立したのはSimula 67であったが[3]、その設計は手続き型プログラミングの機能拡張に近いものである。アラン・ケイ自身は「LISP」の影響を受けた事を強調しており[1]、前述の通りSmalltalkのオブジェクト指向設計は完全に別物であった。その後、計算機科学者ビャーネ・ストロヴストルップが1983年に公開した「C++」が契機となって、オブジェクト指向に関連する様々な考え方が再定義されている。C++の設計はSimula 67の方をモデルにしていた。

上述の様にオブジェクト指向とは元々プログラミング・パラダイムとして編み出された理論であったが、1980年代からデータベースOSの開発にもその設計構想が活かされるようになり、1990年代になるとソフトウェア工学の幅広い面にも応用されて、オブジェクト指向を土台にした様々な分野が開拓される事になった。

オブジェクト指向の分野

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

他にも、オブジェクト指向オペレーティングシステム、オブジェクト関係データベースオブジェクト関係マッピングオブジェクト指向ソフトウェア工学、オブジェクト指向ユーザーインターフェース、オブジェクト指向プロジェクト管理、ブーチメソッドオブジェクトモデル化技法など数々の分野が存在するが、上記リストの四種と知識範囲が重なり合っているか、または内包される副次分野となっていることから、一つの分野として特筆される事は少ない。

オブジェクト指向とは

概要

オブジェクト指向(object-oriented)の言葉を生み出した計算機科学者アラン・ケイは、1970年代に発表した文書の中でその設計構想を六つの要約で説明している[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. プログラム実行時は、制御は最初のオブジェクトに渡され、残りはそのメッセージとして扱われる。

また、2003年にオブジェクト指向の意味を再び尋ねられたケイは、恐らく巷のプログラミングで言われる「カプセル化、継承、多態性」を意識した上でこのように答えている。

“OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.” (僕にとってのオブジェクト指向とは、メッセージング、ローカルな記憶保持と保護と実行状態の隠蔽、徹底的な遅延バインディング、これらに尽きるね) — Alan Kay

初期に発表された六つの要約と、後にケイが明かした三つのコンセプトを踏まえた上で以下を記す。

(1)はプログラム内のあらゆる要素をオブジェクトとして扱う事を示している。従来の変数や文字列や構造体だけに留まらず、数値(プリミティブ)や真偽値(ブーリアン)や演算子(オペレータ)、更には手続き(コードブロック)や制御文(コントロールフロー)やクラス構造情報(メタデータ)までもオブジェクトにした点が一線を画していた。これがオブジェクト指向と名付けられた由縁である。

(2)のコミュニケーションとは、LISPが採用していた高階関数の仕組みを参照透過性とは異なる観点から独自に拡張させたものであり、その視点の下では変換式に独自のメモリーを持たせたものがオブジェクトとなった。オブジェクトを第一級関数と同様にパラメータ値としてもリターン値としても扱える事が、オブジェクトのコミュニケーションを表現する上で必須の枠組みである。

解説

オブジェクト指向を提唱する中でアラン・ケイLISPの影響を受けた事を言及しているが、具体的に参考とされたのは、lambdaのキーワードで表現される高階関数の仕組みと、atomと定義されるデータ表現であったという[1]。なお、他方ではSimula 67の言語仕様を始めて見た際に「あれはobject-orientedだな」と語ったというエピソードも紹介されており、Smalltalk公開当時のケイは何か含む所があってSimula 67に対する言及を恐らく意図的に避けていたが、現実的にはLISPのatomとSimula 67のobjectclassの双方を参考にしてデータ(変数またはプロパティ)とコード(関数またはメソッド)の複合体であるオブジェクトというプログラム概念を考案したと見るのが衆目の一致する所となっている。80年代に入りC++が公開されると、Simula 67にも言及するようになった代わりに今度はC++をオブジェクト指向の観点から語ろうとはしなかったが、その言語仕様に内包される抽象化のプログラミング概念については度々触れていた。

脚注

  1. ^ a b c d Alan C. Kay. “The Early History Of Smalltalk”. 2019年2月21日閲覧。
  2. ^ How Object-Oriented Programming Started
  3. ^ Jonathan Aldrich and Charlie Garrod (2014年). “OO History: Simula and Smalltalk”. 2019年2月2日閲覧。

関連項目

外部リンク