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

削除された内容 追加された内容
編集の要約なし
タグ: 2017年版ソースエディター
編集の要約なし
(同じ利用者による、間の5版が非表示)
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-2101}}</ref>。そこから遡って他のエピソードによると、1967年に公開されていた「[[Simula|Simula 67]]」を当時大学院生だったケイが知った際に、''object-oriented''という咄嗟造語で評論したのが発端だという。なお、Simula 67に結び付けられたオブジェクト指向と、後にケイ自身が開発するSmalltalkの理念とされたオブジェクト指向の性格は全く異なるものであったが、いずれにせよ[[クラス (コンピュータ)|クラス]]と[[オブジェクト (プログラミング)|オブジェクト]]の設計を備えた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-0201}}</ref>、その設計は[[手続き型プログラミング]]の機能拡張に近いものである。アラン・ケイ自身は「[[LISP]]」の影響を受けた事の方を強調しており<ref name="EarlyHistoryOfSmalltalk" />、実際に[[クラス (コンピュータ)|クラス]]の仕組みを除い彼がSmalltalkで示し[[Smalltalk]]のオブジェクト指向設計はくの別物であった。1958年に公開されていた[[LISP]]は[[マサチューセッツ工科大学|MIT]]の[[人工知能]](AI)研究と深い関わりを持っていた。その後、計算機科学者[[ビャーネ・ストロヴストルップ]]が1983年に公開した「[[C++]]」が契機となって、オブジェクト指向に関連する様々な考え方が再定義されている。[[C++]]の設計は[[Simula|Simula 67]]の方をモデルにしていた。
 
上述の様にオブジェクト指向とは元々プログラミング・パラダイムとして編み出された理論であったが、1980年代から[[データベース]]と[[オペレーティングシステム|OS]]の開発にもその設計構想が活かされるようになり、1990年代になるとソフトウェア工学の幅広い面にも応用されて、オブジェクト指向を土台にした様々な分野が開拓される事になった。
24行目:
==オブジェクト指向とは==
 
=== 概要コンセプト ===
オブジェクト指向(''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).''
#''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.''
 
#3, ''Objects have their own memory (in terms of objects).''
これをやや意訳するとこうなる。
# すべてはオブジェクトである。
# オブジェクトはメッセージの送受信によって相互作用する。
# オブジェクトは自身の記憶領域(データ)を持つ。
# どのオブジェクトもクラスのインスタンスであり、クラスもまたオブジェクトである。
# クラスはその全インスタンスの為の共有動作(メソッド)を持つ。インスタンスはプログラムにおけるオブジェクトの形態である。
# プログラム実行時は、制御は最初のオブジェクトに渡され、残りはそのメッセージとして扱われる。
 
#4, ''Every object is an instance of a class (which must be an object).''
'''(1)'''はプログラム内のあらゆる要素をオブジェクトとして扱う事を示している。従来の変数や文字列や構造体だけに留まらず、数値(プリミティブ)や真偽値(ブーリアン)や演算子(オペレータ)、更には手続き(コードブロック)や制御文(コントロールフロー)やクラス構造情報(メタデータ)までもオブジェクトにした点が一線を画していた。これがオブジェクト指向と名付けられた由縁である。
 
#5, ''The class holds the shared behavior for its instances (in the form of objects in a program list).''
'''(2)'''のメッセージ送受信とは元々は、[[LISP]]が採用していた[[高階関数]]の仕組みを[[参照透過性]]と相反する観点から独自に拡張させたものであり、この視点の下では変換式に独自の記憶を持たせたものがオブジェクトとなった。オブジェクトを[[第一級関数]]と同様に入力値にも出力値にも出来る事がメッセージングに必須の枠組みである。オブジェクト指向の下では数式もメッセージングとなった。「3+5」は3というオブジェクトに+と5というメッセージが送られて8の結果値が返るといった具合である。+の演算子と5の引数値もオブジェクトであり、8の結果値もオブジェクトなので、それにまたメッセージを送る事も出来た。コードブロックもまたオブジェクトであり同時にメッセージにも出来たので、比較式オブジェクトが返す真偽値に対して特殊な予約語オブジェクトとコードブロックを併せて送る事で条件分岐や反復といった制御構文を表現する事も出来た。数値に対してコードブロックを送ると回数反復となった。オブジェクトを次々と引き合わせる(''communication'')のは順次処理となった。従来のプログラムリストで広く使われていた[[フローチャート]]が別の視点から眺められて、その図表上にある数値や記号や変数および順次や分岐や反復のフローといったあらゆる要素がオブジェクトとして分解され、オブジェクトにオブジェクトを引き合わせて双方に関連した処理を行わせるという全く新しいフローがメッセージと名付けられた。
 
#6, ''To eval a program list, control is passed to the first object and the remainder is treated as its message.''|Alan Kay}}以下はその和訳である。
'''(3)'''と'''(5)'''によってオブジェクトとは、データとメソッドの複合体である事が示されている。これは[[Simula|Simula 67]]のオブジェクト概念を踏襲している。'''(4)'''によってオブジェクトの実装は、クラスという定義情報とそれを実メモリに展開したインスタンスで為される事が示されている。これもSimula 67の特徴に準じているが、更にクラスもオブジェクトとする事でいわゆるメタデータの扱いにも言及している。'''(6)'''の''eval''(''evaluate'')とはソフトウェア工学では演算して結果値を出す意味の言葉であり、プログラムは任意のオブジェクトから開始され、後はメッセージによるオブジェクト間の相互作用で処理が実行される事を示している。プロセスが各オブジェクトを扱うのではなく、イメージ的にオブジェクトの振る舞い及びその振る舞いのトリガーになるオブジェクト同士の引き合わせ(''communication'')を意味するメッセージングがそのままプロセスとなる事を強調していた。
 
# すべてはオブジェクトである。
# オブジェクトはメッセージのけ答えによって相互作用コミュニケーションする。
# オブジェクトは自身の記憶領域(デメモリタ)を持つ。
# どのオブジェクトもクラスのインスタンスであり、クラスもまたオブジェクトである。
# クラスはその全インスタンスの為の共有動作(メソッド)を持つ。インスタンスはプログラムにおけるオブジェクトの形態である。
# プログラム実行時は、制御は最初のオブジェクトに渡され、残りはそのメッセージとして扱われる。
 
また、2003年にオブジェクト指向の意味を再び尋ねられたケイは、恐らく巷のプログラミングで言われる「カプセル化、継承、多態性」を意識した上でこのように答えている。{{Quotation|''OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.''
なおこれは同時に要点でもあるが、アラン・ケイが最初に示したのは(1)から(3)までであり、(4)から(6)は実際のコーディングスタイルを掴ませる為にあえて付け加えられたものだった。つまり、オブジェクト指向の要約は(1)から(3)までで事足りるという。これについても後述する。
 
(僕にとってのオブジェクト指向とは、メッセージング、ローカルな記憶保持と保護と実行状態の隠蔽、徹底的な遅延バインディング、これに尽きる)|Alan Kay}}オブジェクト指向を提唱する中でケイは「[[LISP]]」の影響を受けた事を言及しているが、具体的に参考とされたのは、''lambda''のキーワードで表現される[[高階関数]]の仕組みと、''atomと定義される''データ表現であったという<ref name="EarlyHistoryOfSmalltalk" />。それらに加えて、初期に発表された六つの要約と、後にケイが明かした三つのコンセプトを踏まえた上でオブジェクト指向を読み解いていく。
=== 解説 ===
オブジェクト指向を提唱する中で[[アラン・ケイ]]は[[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++をオブジェクト指向の観点から語ろうとはしなかったが、その言語仕様に内包される[[抽象化 (計算機科学)|抽象化]]のプログラミング概念については度々触れていた。
 
=== その ===
==脚注==
{{Reflist}}