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

削除された内容 追加された内容
26行目:
 
=== 1980年代の言及 ===
1989年に発表された「User Interface A Personal View」という記事の中でアラン・ケイは、[[Smalltalk]]のオブジェクト指向性は大変示唆的であると前置きした上で、そのプログラミング言語での[[オブジェクト指向プログラミング|OOP]]と、その[[GUI]]フレームワークでのOOUIを照応させながらこう述べている<ref>{{Cite web|url=http://worrydream.com/refs/Kay%20-%20User%20Interface,%20a%20Personal%20View.pdf|title=User Interface A Personal View|accessdate=2020-1|publisher=}}</ref>。これは人とコンピュータの対話形式としてのオブジェクト指向に沿ったものになっている。1970年代から80年代にかけてのオブジェクト指向は、GUI(グラフィカルユーザーインターフェース)と半ば表裏一体で扱われていたという技術史背景がある。
{{Quotation|''object-oriented means that the object knows what it can do.''<br/>(オブジェクト指向とは、オブジェクトが出来る「なにか」を知っていることを意味している)}}
これは[[認知心理学]]の[[アフォーダンス]]につながる考え方と解釈されている。その説明の中でケイは、Smalltalkプログラミングを抽象シンボル舞台と形容しており、GUIフレームワークを具象ユーザーインターフェース舞台と形容している。前者の抽象シンボル舞台では、我々は最初にオブジェクトの名前(識別子)をコーディングし、次にそのオブジェクトが実行する「なにか」を伝えるメッセージをコーディングすることになる。後者の具象ユーザーインターフェース舞台では、我々は最初に操作する対象(アイコン)を選択し、次にその対象が提供する「なにか」のメニュー欄を表示させ選択することになる。この双方を踏まえた上でケイはこう結論している。
{{Quotation|''In both case we have the object first and the desire second. this unifies the concrete with the abstract in highly satisfying way.''<br/>(双方の事例において私達は、オブジェクト(対象)を第一とし、欲求を第二とする。これは高い満足度で具象と抽象を一体化する)}}
 
=== 1990年代の言及 ===
1992年に[[Association for Computing Machinery|ACM]]からプログラミング言語史編纂の一環として執筆を依頼されたアラン・ケイは、翌年の「The Early History Of Smalltalk」でオブジェクト指向の原点としての[[Smalltalk]]について解説している<ref name="EarlyHistoryOfSmalltalk" />。冒頭の序章で設計理念が説明され、第一章から第三章まではその着想元になった[[バロース B5000|バロースB5000]]、[[Sketchpad]]、[[Simula]]、Flex machine、[[LISP]]などの技術史が綴られ、第四章から第六章まではSmalltalkの開発史が記されている。ここでは長い説明を避けて序章から特徴的な要点のみを抜粋する。
{{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]]は一度も登場していない。
Smalltalkオブジェクトが備えている全体像への可逆性とは、自身で対応不可なメッセージを受け取ったオブジェクトが積極的な[[委譲]]を繰り返して最終的には処理を全うするという仕組みを指している。これによってあらゆる計算可能性が表現できるとされている。第四章では、実際のSmalltalk言語仕様が六つの要約にまとめられており、以下の六項目には上述の再帰構成および自己再帰の計算性質が随所に盛り込まれている。{{Quotation|1, ''EverythingIsAnObject.
 
インスタンス化とは原型クラスの抽象内容を全て具体化して新たな抽象内容を付け足すという作業である。抽象内容が未付加ならばそこが末端インスタンスになる。これとは別にサブクラス化とは原型クラスの抽象内容をそのままにして新たな抽象内容と具象内容を付け足すという作業である。これは[[継承 (プログラミング)|継承]]と呼ばれるが、Smalltalkは当初これを採用しなかった。第四章では、Smalltalkをより汎化したような言語仕様が六つの要約にまとめられており、以下六項目には上述の再帰構成および自己再帰の計算性質が随所に盛り込まれている。{{Quotation|1, EverythingIsAnObject.
2, ''Objects communicate by sending and receiving messages (in terms of objects).
 
32, ''Objects havecommunicate theirby ownsending memoryand receiving messages (in terms of objects).
 
23, ''Objects communicatehave bytheir sendingown and receiving messagesmemory (in terms of objects).
4, ''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).
5, ''The class holds the shared behavior for its instances (in the form of objects in a program list).
 
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.}}この和訳は以下のようになるが、ここでは長い説明を避けて再帰構成にまつわる要点のみを解説する。
 
6, ''To eval a program list, control is passed to the first object and the remainder is treated as its message.}}この和訳は以下のようになるが、ここでは長い説明を避けて再帰構成にまつわる要点のみを解説する。
 
# すべてはオブジェクトである。
54 ⟶ 56行目:
# プログラムリストの評価では、制御は最初のオブジェクトに渡され、残りはそのメッセージとして扱われる。
 
'''(2)'''のコミュニケーションとは、オブジェクトの呼出ないし[[委譲]]による自己再帰、相互再帰、巡回再帰の流れを指していると見てよい。'''(3)'''の記憶とはつまりデータであるが、キーと値のマッピングによる辞書データとして実装されて[[動的型付け]]性質になり、値=オブジェクトなので即ちオブジェクトの記憶とはオブジェクトの再帰構成になる。'''(4)'''は、[[クラス (コンピュータ)|クラス]]もまた[[メタクラス]]の[[インスタンス]]であり、メタクラスもまたメタメタクラスのインスタンスになるという再帰構成を意味している。全内容が具象化済みのオブジェクトが末端インスタンスになり、その上のクラス→メタクラス→メタメタクラスの順に抽象内容が多くなっていく。'''(5)'''の振る舞いとはプレースホルダを内包しているプログラムリストであることを意味している。プレースホルダは[[インスタンス変数]]箇所であり実体化されたインスタンス別に変数内容が定まる。プログラムリストとは[[LISP]]のフォームリストに因んだものであり、関数変数シンボルとアトムと数値を連ねたデータ列で、これをコードとして解釈演算するのが評価(eval)である。数値とアトム(文字列)はオブジェクトである。アトムとシンボルは表裏一体の存在であり、双方は文脈によって自在に切り替わる。変数シンボルはただ評価されて束縛先オブジェクトになり、関数シンボルは引数/空引数と共にプロセス付帯評価されて返り値オブジェクトになる。'''(6)'''は、シンボル・アトム・数値などはその時の並べられた順序によっていずれもがメッセージになり、又はそれを受け取る制御オブジェクトになるか、それに渡されるメッセージになるという再帰構成(卵が先か鶏が先か)を意味している。
 
=== 2000年代の言及 ===
61 ⟶ 63行目:
上記はケイ本来のオブジェクトの在り方を述べたものであり、特に解説はしない。
{{Quotation|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, ...<br/>(僕はデータを取り除きたかった。これを[[バロース B5000|バロースB5000]]は驚くべきHWアーキテクチャでほとんど実現していた。僕は気付いた。細胞/全体コンピュータメタファはデータを除去できるであろうと、)}}
ここでプログラムからデータを取り除きたいという独特の考えが提示されている。なお、HWアーキテクチャとは前節で説明した再帰構成の先駆的仕組みに似た技術のようであり、る。細胞/全体(cell/whole)といったワードもそれと同等と見てよい。
{{Quotation|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.<br/>(僕の数学専攻経験がこれを気付かせた。各オブジェクトは幾つかの関連付けられた代数を持ち、またその系統群もあるかもしれない。それらは大変有用になるだろうと)}}
ここで代数というワードが登場する。これは数学で言われる[[代数的構造]]のプログラミング応用例と解釈してよい。
69 ⟶ 71行目:
ここで[[抽象データ型]](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.<br/>([[ユタ大学|ユタ]]での専攻知識で僕が解決した最初期の問題はメソッドとオブジェクトのみを用いてのデータの消滅だった。1960年代末にBob Balzerはデータレス・プログラミングというものを書き示した。直後の1970年にJohn Reynoldsは[[ラムダ式]]を用いての手順によるデータ抽象化の正しい方法を書き示した)}}
非データ手順(non-data-procedure)のプログラミング実践例としては、ポイントフリースタイルや自由[[モナド (プログラミング)|モナド]]などが挙げられる。いずれも数学の[[代数的構造]]のプログラム応用例であり、純然たる[[宣言型プログラミング|宣言型]]および純粋[[関数型プログラミング|関数型]]の分野になる。これにケイの生物学専攻を背景にしたバイオ/ネット(bio/net)なる考えが加えられているが、これは前述の細胞/全体(cell/whole)と同等の似たような再帰構成的な概念と見てよい。[[プロセス代数]]は[[並行計算]]の実装理論として重視されており、メッセージングはこれにも近い概念になっている。
{{Quotation|The people who liked objects as non-data were smaller in number,<br/>(非データとしてのオブジェクトを好む者は少なかった、)}}
ここで歴史に戻る。1960年代になると[[ソフトウェア危機]]としても語られるプログラム規模拡大に対応するために、サブルーチンとデータをまとめた[[モジュール]]という機能が登場した。このモジュールを土台にして1967年に[[オルヨハン・ダール]]らは[[クラス (コンピュータ)|クラス]]という機能を備えた[[Simula|Simula67]]を開発し、1969年から[[エドガー・ダイクストラ]]は真珠のネックレスという概念を備えた[[構造化プログラミング]]を提唱した。1974年から[[IBM|IBM社]]中心の研究者たちが[[構造化分析設計技法|構造化設計]]と総称される技法を発表し、構造化プログラミングはこちらに取って代わられた。1972年からアラン・ケイはメッセージングという概念を備えたオブジェクト指向を誕生させている。オブジェクト指向は後に[[クラスベース|クラス・パラダイム]]にマウントされている。