「オブジェクト指向」の版間の差分
削除された内容 追加された内容
SpaceMeteor (会話 | 投稿記録) Apple改名に伴う変更 |
|||
(同じ利用者による、間の2版が非表示) | |||
4行目:
== オブジェクト指向の来歴 ==
[[ファイル:Alan Kay (3097597186) (cropped).jpg|サムネイル|222x222ピクセル|Alan Kay]]
オブジェクト指向(''object-oriented'')という
1986年から[[Association for Computing Machinery|ACM]](計算機協会)が[[OOPSLA]](オブジェクト指向会議)を年度開催するようになり、オブジェクト指向は[[コンピュータサイエンス]]の一つのムーブメントになった。[[OOPSLA]]初期のチェアパーソンは、[[Smalltalk]]が生まれた[[ゼロックス|ゼロックス社]][[パロアルト研究所]]のフェローが務めることが多かった。Smalltalkは正確にはプログラミング言語と[[グラフィカルユーザインタフェース|GUI]]運用環境を合わせた[[フレームワーク]]であり、[[Alto|ゼロックスAlto]]機上の[[オペレーティングシステム|OS]]または[[ミドルウェア]]として開発されていた。Smalltalkは70年代の[[アラン・ケイ]]が構想していた[[ダイナブック]]のための[[グラフィカルユーザインタフェース|GUI]]環境でもあった。[[ダイナブック]]はパーソナルコンピュータの原型に位置付けられているものである。[[Alto|ゼロックスAlto]]は[[GUI]]を初めて汎用的にサポートしたコンピュータと[[オペレーティングシステム|OS]]であり、かの[[スティーブ・ジョブズ|スティーブ・ジョブス]]を啓発して[[Macintosh]]のモデルになったことはよく知られている。こうした背景からオブジェクト指向は、上述のプログラミング云々よりも、[[グラフィカルユーザインタフェース|GUI]](グラフィカル・ユーザー・インターフェース)を始めにした当時の先進的な[[ソフトウェア設計|ソフトウェアデザイン]]と[[ソフトウェアアーキテクチャ]]のための開拓的なモデル理論として受け止められる方が好まれた。[[データベース]]開発と[[オペレーティングシステム]]開発および[[ユーザーインターフェース]]設計が最初の活用対象になり、産業プログラミング界隈の主流であった[[構造化プログラミング|構造化]](Structured)分野に倣うようにして、オブジェクト指向設計(OOD)オブジェクト指向分析(OOA)[[オブジェクト指向モデリング]](OOM)といった科目も立ち上げられた。それらの研究は[[形式手法]]の確立に繋げられて1991年に[[Booch法|ブーチメソッド]]と[[オブジェクトモデル化技法]]、1992年に[[オブジェクト指向ソフトウェア工学]]が発表され、いずれも[[形式言語]]化されていたのでオブジェクトモデリング言語という総称用語を生み出した。上記三種の考案者([[スリーアミーゴス]])は、後のIBMブランドになる[[ラショナル|ラショナルソフトウェア]]で合流して[[統一モデリング言語]](UML)を構築するに到り、1995年のOOPSLAで初回発表した。[[デザインパターン (ソフトウェア)|デザインパターン]]、[[リファクタリング (プログラミング)|リファクタリング]]、[[モデル駆動工学]]、[[ドメイン固有言語]]、[[アジャイルソフトウェア開発]]といった数々のトピックも[[OOPSLA]]から誕生している。
26行目:
=== 1980年代の言及 ===
1989年に発表された「User Interface A Personal View」という記事の中でアラン・ケイは、[[Smalltalk]]のオブジェクト指向性は大変示唆的であると前置きした上で、
{{Quotation| これは[[認知心理学]]の[[アフォーダンス]]につながる考え方と解釈されている。その説明の中でケイは、Smalltalkプログラミングを抽象シンボル舞台と形容しており、GUI {{Quotation| === 1990年代の言及 ===
1992年に[[Association for Computing Machinery|ACM]]からプログラミング言語史編纂の一環として執筆を依頼されたアラン・ケイは、翌年の
{{Quotation|Smalltalk's design—and existence—is due to the insight that everything we can describe can be represented by the recursive composition of a single kind of behavioral building block that hides its combination of state and process inside itself and can be dealt with only through the exchange of messages.<br/>(Smalltalkの設計―及び存在―とは、私たちの思い描く全てが、自身のステートとプロセスの連携を内包した個々の振る舞い組立ブロックの再帰構成によって表現され、徹底的なメッセージの交換のみによって処理されるということだ。)}}ここで登場している'''再帰構成'''(recursive composition)が一つのキーワードである。[[再帰]]の概念は後続の文章にも再三登場しており、Smalltalk設計のあらゆる局面に影響を与えている。もっとも再帰はコンピュータプログラミング分野の普遍的概念であり、例えば[[ジョン・マッカーシー]]も[[LISP]]の設計を<code>recursive functions of symbolic expressions and their computation by machine.</code>''(記号式の再帰関数群と機械によるその計算)と概略していた。''{{Quotation|In computer terms, Smalltalk is a recursion on the notion of computer itself. Instead of dividing "computer stuff" into things each less strong than the whole—like data structures, procedures, and functions which are the usual paraphernalia of programming languages—each Smalltalk object is a recursion on the entire possibilities of the computer.<br/>(Smalltalkは計算観念の自己再帰である。コンピュータプログラムをその全体からの劣化要素―データ構造、手続き、関数といった言語機能の諸々に分割していくのではなく、Smalltalkのオブジェクトはそれぞれが全体的な計算可能性を備えた再帰要素になる。)}}Smalltalkオブジェクトが備えている全体的な計算可能性とは実装レベルでは、一般的な関数呼び出しの代わりに、その関数名シンボルに相当するセレクタを実行時解釈する[[メッセージパッシング]]の仕組みを用いることと、セレクタの自由な解釈による他の関連オブジェクトへの積極的な[[委譲]]を用いることを意味している。その対義概念になる全体からの劣化要素への分割とは、いわゆる型付けによる[[型システム]]の導入と同義になり、他の論考でもケイは[[型システム]]に対して否定的な見解を示していた。[[型理論]]からの主旨がフォールトアヴォイダンスである[[型システム]]に対して、オブジェクト指向はフォールトトレランスが前提ということになる。ただし全体的な計算可能性を表現するための[[委譲]]は規則的かつ段階的に行われるべきであったので、そのために[[クラス (コンピュータ)|クラス]]と[[インスタンス]]の仕組みが実装された。{{Quotation|Philosophically, Smalltalk's objects have much in common with the monads of Leibniz and the notions of 20th century physics and biology. Its way of making objects is quite Platonic in that some of them act as idealizations of concepts—Ideas—from which manifestations can be created. <br/>(哲学面でのSmalltalkオブジェクトは、[[ライプニッツ]]の[[モナド]]や20世紀の物理・生物学思考との共通点を見出せる。オブジェクトの構築は全くの[[プラトン|プラトニック]]であり、顕現の想起性を根底にした[[イデア論]]としてのものである。)}}
ここでの[[モナド (哲学)|モナド]]はオブジェクトの情報隠蔽を示唆しており、[[イデア論]]はクラスのインスタンス化を示唆している。クラスもまたメタクラスのインスタンス化であり、メタクラスもまたそのメタクラスのインスタンス化である。メタクラスの[[生命の樹 (旧約聖書)|木構造]]を[[イデア]]への上方に辿っていき適切なノードで別系統現象への下方に降りていくといった[[委譲]]サーチが全体的な計算可能性といった表現につながる。この委譲サーチをメッセージとするならば、この記事当時のメッセージは横つながりのネット的な連携よりも、縦つながりのヒエラルキー的な連携が主体であったことになる。実際にこのThe Early History Of Smalltalkにおいて[[ARPA]]は度々登場するが、[[ARPANET]]は一度も登場していない。
2, ''Objects communicate by sending and receiving messages (in terms of objects).▼
「インスタンス化」とは原型クラスの抽象内容を全て具体化して新たな抽象内容を付け足すという作業である。抽象内容が未付加ならばそこが末端インスタンスになる。それとは異なる「サブクラス化」とは原型クラスの抽象内容をそのままにして新たな抽象内容と具象内容を付け足すという作業である。これは[[継承 (プログラミング)|継承]]と呼ばれるが、Smalltalkは当初これを採用しなかった。[[継承 (プログラミング)|継承]]は後のオブジェクト指向で最も物議を醸した概念にもなっているのでその先見性が伺える。第四章では、Smalltalkをより汎化したような言語仕様が六つの要約にまとめられており、以下六項目には上述の再帰構成および自己再帰の計算性質が随所に盛り込まれている。{{Quotation|1, EverythingIsAnObject.
4, ''Every object is an instance of a class (which must be an object).▼
6, ''To eval a program list, control is passed to the first object and the remainder is treated as its message.|Alan Kay}}''この和訳は以下のようになるが、ここでは長い説明を避けて特徴的な要点のみを解説する。''▼
5, The class holds the shared behavior for its instances (in the form of objects in a program list).
▲6,
# すべてはオブジェクトである。
47 ⟶ 56行目:
# プログラムリストの評価では、制御は最初のオブジェクトに渡され、残りはそのメッセージとして扱われる。
'''(
=== 2000年代の言及 ===
21世紀になると[[Smalltalk]]処理系の開発は下火になったが、それ故に実装可能性の束縛から離れた元々の構想が語られる機会も生み出している。2003年にアラン・ケイはオブジェクト指向への貢献で[[チューリング賞]]を受賞し、知人から改めてオブジェクト指向の意味を尋ねられたケイは以下のようにメール返信している<ref>{{Cite web|url=http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/doc_kay_oop_en|title=Dr. Alan Kay on the Meaning of “Object-Oriented Programming”|accessdate=2019-1|publisher=}}</ref>。このメールは1960年代末からの源流構想をケイらしくさり気なく簡潔にまとめたものとしてしばしば引用される。ここでは文章順に各要点を抜粋しながら説明していく。
▲上記はケイ本来のオブジェクトの在り方を述べたものであり、特に解説はしない。<blockquote>
ここでプログラムからデータを取り除きたいという独特の考えが提示されている。なお、HWアーキテクチャとは前節での再帰構成の仕組みに似た技術のようである。細胞/全体(cell/whole)というワードもそれと同等と見てよい。
▲'''I wanted to get rid of data. The B5000 almost did this via its almost unbelievable HW architecture. I realized that the cell/whole-computer metaphor would get rid of data, ...'''(僕はデータを取り除きたかった。これを[[バロース B5000|バロースB5000]]は信じがたい技術でほぼ実現していた。僕は気付いた。細胞/全体コンピュータメタファはデータを除去できるであろうと、)</blockquote>
▲'''My math background made me realize that each object could have several algebras associated with it, and there could be families of these, and that these would be very very useful.''' (僕の数学専攻経験がこれを気付かせた。各オブジェクトは幾つかの代数を持ち、またその系統群もあるかもしれない。それらは大変有用になるだろうと)</blockquote>
▲ここで代数というワードが登場する。これは数学で言われる[[代数的構造]]のプログラミング応用例と解釈してよい。<blockquote>
メッセージングは恐らく[[メッセージパッシング]]に類似の概念であるが、一般に連想されやすい[[リモートプロシージャコール]]とは異なることが言及されているので、そうした理由からこちらの造語が使われているようである。ステートプロセスは前節の再帰構成(recursive composition)と前述の代数(algebra)と後述の非データ(non-data)の考え方を合わせた独特のデータとコードの一体化概念であり、これも造語である。[[動的束縛|遅延バインディング]]は関数/変数の実行時多態である。
▲'''OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.'''(僕にとってのOOPとは、メッセージング、ステートプロセスの局所保持かつ保護かつ隠蔽、徹底的な遅延バインディング、これだけの意味だった)</blockquote>
ここで[[抽象データ型]](abstract data type)に対する非データ手順(non-data-procedure)というワードが登場する。振る舞いを通してデータを扱うというデータ抽象の概念を、更に抽象化したものが非データであり、[[代数学]]で言う[[写像]]のみによってデータを表現するという概念を指している。写像の組み合わせはメッセージングとの類似概念になり、あらゆるプログラム要素の遅延バインディングにも繋がる。その実装理論には[[圏論]]で言われる[[射 (圏論)|射]]や[[関手]]の構造が応用されることになり、関数型言語の世界ではそれで実践されている。 {{Quotation|And the very first problems I solved with my early Utah stuff was the "disappearing of data" using only methods and objects. At the end of the 60s (I think) Bob Balzer wrote a pretty nifty paper called "Dataless Programming", and shortly thereafter John Reynolds wrote an equally nifty paper "Gedanken" (in 1970 I think) in which he showed that using the lamda expressions the right way would allow data to be abstracted by procedures. 非データ手順(non-data-procedure)のプログラミング実践例としては、ポイントフリースタイルや自由[[モナド (プログラミング)|モナド]]などが挙げられる。いずれも数学の[[代数的構造]]のプログラム応用例であり、純然たる[[宣言型プログラミング|宣言型]]および純粋[[関数型プログラミング|関数型]]の分野になる {{Quotation|The people who liked objects as non-data were smaller in number, ここで歴史に戻る。1960年代になると[[ソフトウェア危機]]としても語られるプログラム規模拡大に対応するために、サブルーチンとデータをまとめた[[モジュール]]という機能が登場した。このモジュールを土台にして1967年に[[オルヨハン・ダール]]らは[[クラス (コンピュータ)|クラス]]という機能を備えた[[Simula|Simula67]]を開発し、1969年から[[エドガー・ダイクストラ]]は真珠のネックレスという概念を備えた[[構造化プログラミング]]を提唱した。1974年から[[IBM|IBM社]]中心の研究者たちが[[構造化分析設計技法|構造化設計]]と総称される技法を発表し、構造化プログラミングはこちらに取って代わられた。1972年からアラン・ケイはメッセージングという概念を備えたオブジェクト指向を誕生させている。オブジェクト指向は後に[[クラスベース|クラス・パラダイム]]にマウントされている。 [[構造化プログラミング|構造化設計]]はモジュールをそのままサブルーチンとデータの構成体として扱っている具象データ(concrete data)技術である。Simula発のクラスとダイクストラの真珠のネックレスは、モジュールに[[カプセル化]]・[[継承 (プログラミング)|継承]]・[[多態性]]を備えて抽象体として扱おうとする抽象データ(abstract data)技術である。そしてアラン・ケイ本来のオブジェクトとは、モジュールを[[生物学]]と[[代数学]]の観点から再解釈した非データ(non data)技術であった。構造化設計は1980年代までの主流であり、続けてオブジェクト指向が主流になったが、現在においてもクラスをただのデータとメソッドの構成体として扱っているようなオブジェクト指向は、構造化設計と大差ないものになり「具象データ」から「抽象データ」への思考転換の難しさを物語っている。モジュールの抽象化が提唱され始めたのは1970年代であったが、同時期にアラン・ケイは「抽象データ」を更に抽象化した「非データ」を構想していた。
79行目:
=== 2020年の言及 ===
Q&Aサイトの[[Quora]]で「
''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?''<br>(愚かしいこのオブジェクトは僕の考えを表現するのにとても悪い言葉だった。不活性的でデータを過剰に意識させたからだ。Simulaはプロセスと呼んでいた。こっちがよかったな。プロセス指向プログラミングの方がずっと良かったと思わないかい?)
}}
== 脚注 ==
'''出典'''{{Reflist}}
|