「オブジェクト指向」の版間の差分
削除された内容 追加された内容
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|
これは[[認知心理学]]の[[アフォーダンス]]につながる考え方と解釈されている。その説明の中でケイは、Smalltalkプログラミングを抽象シンボル舞台と形容しており、GUIフレームワークを具象ユーザーインターフェース舞台と形容している。前者の抽象シンボル舞台では、我々は最初にオブジェクトの名前(識別子)をコーディングし、次にそのオブジェクトが実行する「なにか」を伝えるメッセージをコーディングすることになる。後者の具象ユーザーインターフェース舞台では、我々は最初に操作する対象(アイコン)を選択し、次にその対象が提供する「なにか」のメニュー欄を表示
{{Quotation|
=== 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)が
ここでの[[モナド (哲学)|モナド]]はオブジェクトの情報隠蔽を示唆しており、[[イデア論]]はクラスのインスタンス化を示唆している。クラスもまたメタクラスのインスタンス化であり、メタクラスもまたそのメタクラスのインスタンス化である。メタクラスの木構造を上方に辿っていき適切な分岐点で別系統の下方に降りていくといった[[委譲]]サーチが全体像への可逆性といった表現につながる。この委譲サーチをメッセージとするならば、この記事当時のメッセージは横つながりのネット的な連携よりも、縦つながりのヒエラルキー的な連携が主体であったことになる。実際にこのThe Early History Of Smalltalkにおいて[[ARPA]]は度々登場するが、[[ARPANET]]は一度も登場していない。
インスタンス化とは原型クラスの抽象内容を全て具体化して新たな抽象内容を付け足すという作業である。抽象内容が未付加ならばそこが末端インスタンスになる。これとは別にサブクラス化とは原型クラスの抽象内容をそのままにして新たな抽象内容と具象内容を付け足すという作業である。これは[[継承 (プログラミング)|継承]]と呼ばれるが、Smalltalkは当初これを採用しなかった。第四章では、Smalltalkをより汎化したような言語仕様が六つの要約にまとめられており、以下六項目には上述の再帰構成および自己再帰の計算性質が随所に盛り込まれている。{{Quotation|1, EverythingIsAnObject.
2, ''Objects communicate by sending and receiving messages (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).▼
▲5,
6, ''To eval a program list, control is passed to the first object and the remainder is treated as its message.}}この和訳は以下のようになるが、ここでは長い説明を避けて再帰構成にまつわる要点のみを解説する。▼
▲6,
# すべてはオブジェクトである。
54 ⟶ 56行目:
# プログラムリストの評価では、制御は最初のオブジェクトに渡され、残りはそのメッセージとして扱われる。
'''(2)'''のコミュニケーションとは、オブジェクトの呼出ないし[[委譲]]による自己再帰、相互再帰、巡回再帰の流れを指していると見てよい。'''(3)'''の記憶とはつまりデータであるが、キーと値のマッピングによる辞書データとして実装されて[[動的型付け]]性質になり、値=オブジェクトなので即ちオブジェクトの記憶とはオブジェクトの再帰構成になる。'''(4)'''は、[[クラス (コンピュータ)|クラス]]もまた[[メタクラス]]の[[インスタンス]]であり、メタクラスもまたメタメタクラスのインスタンスになるという再帰構成を意味している
=== 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アーキテクチャとは前節で
{{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年からアラン・ケイはメッセージングという概念を備えたオブジェクト指向を誕生させている。オブジェクト指向は後に[[クラスベース|クラス・パラダイム]]にマウントされている。
|