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

削除された内容 追加された内容
編集の要約なし
編集の要約なし
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]]の方をモデルにしていた。
 
上述の様にオブジェクト指向とは元々プログラミング・パラダイムとして編み出された理論であったが、1980年代から[[データベース]]と[[オペレーティングシステム|OS]]の開発にもその設計構想が活かされるようになり、1990年代になるとソフトウェア工学の幅広い面にも応用されて、オブジェクト指向を土台にした様々な分野が開拓される事になった。
25行目:
 
=== 概要 ===
オブジェクト指向(''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).''
#''3, Objects have their own memory (in terms of objects).''
 
#''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)'''はプログラム内のあらゆる要素をオブジェクトとして扱う事を示している。従来の変数や文字列や構造体だけに留まらず、数値(プリミティブ)や真偽値(ブーリアン)や演算子(オペレータ)、更には手続き(コードブロック)や制御文(コントロールフロー)やクラス構造情報(メタデータ)までもオブジェクトにした点が一線を画していた。これがオブジェクト指向と名付けられた由縁である。
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++をオブジェクト指向の観点から語ろうとはしなかったが、その言語仕様に内包される[[抽象化 (計算機科学)|抽象化]]のプログラミング概念については度々触れていた。
 
==脚注==