「オブジェクト指向」の版間の差分
rvv タグ: 手動差し戻し |
m 冒頭 |
||
(17人の利用者による、間の38版が非表示) | |||
1行目: | 1行目: | ||
{{独自研究|date=2019年2月}} |
{{独自研究|date=2019年2月}} |
||
'''オブジェクト指向'''(オブジェクトしこう、{{lang-en-short|''object-oriented''}})は、[[ソフトウェア開発]]と[[コンピュータプログラミング]]のために用いられる考え方である。元々は特定の[[プログラミングパラダイム]]を説明するために考案された言葉 |
'''オブジェクト指向'''(オブジェクトしこう、{{lang-en-short|''object-oriented''}})は、[[ソフトウェア開発]]と[[コンピュータプログラミング]]のために用いられる考え方である。元々は特定の[[プログラミングパラダイム]]を説明するために考案された言葉であり、その当時の革新的技術であったGUI([[グラフィカル・ユーザー・インターフェース|グラフィカル・ユーザーインターフェース]])とも密接に関連していた。明確な用語としては1970年代に誕生し、1981年頃から知名度を得て、1986年頃からソフトウェア開発のムーブメントと化した後に、1990年頃にはソフトウェア開発の総合技術としての共通認識を確立している。ソフトウェア開発における一つの標語のような扱い方もされている。 |
||
オブジェクトとは、プログラミング視点では[[データ構造]]とその専属[[プロシージャ|手続き]]を一つにまとめたものを指しており、分析/設計視点では情報資源とその処理手順を一つにまとめたものを指している。[[データ]]と[[プロセス]]を個別に扱わずに、双方を一体化した[[オブジェクト (プログラミング)|オブジェクト]]を基礎要素にし、[[メッセージ (コンピュータ)|メッセージ]]と形容されるオブジェクト間の相互作用を重視して、ソフトウェア全体を構築しようとする考え方がオブジェクト指向である。{{main|オブジェクト指向プログラミング}} |
|||
== オブジェクト指向の来歴 == |
== オブジェクト指向の来歴 == |
||
[[ファイル:Alan Kay (3097597186) (cropped).jpg|サムネイル|222x222ピクセル| |
[[ファイル:Alan Kay (3097597186) (cropped).jpg|サムネイル|222x222ピクセル|アラン・ケイ]] |
||
オブジェクト指向(''object-oriented'')という言葉自体は、1972年から80年にかけてプログラミング言語「[[Smalltalk]]」を開発した[[ゼロックス|ゼロックス社]][[パロアルト研究所]]の計算機科学者[[アラン・ケイ]]がその言語設計を説明する中で初めて生み出されている<ref name="EarlyHistoryOfSmalltalk">{{Cite web|url=http://worrydream.com/EarlyHistoryOfSmalltalk/|title=The Early History Of Smalltalk|accessdate=2019-01|publisher=}}</ref>。本人の述懐によると、大学院時代のケイがプログラミング言語「[[Simula]]」に感化されて日夜プログラミング・アーキテクチャの思索に耽っていた1967年頃、今何をしているのかと尋ねてきた知人に対して「''object-oriented programming''だよ」と咄嗟の造語で答えたのが発端だという。このオブジェクト指向が知名度を得るようになったのは1981年頃からであり、当時のマイコン専門誌[[バイト (雑誌)|BYTE]]によるSmalltalkの誌上紹介が契機になっている。オブジェクト指向の中でケイ自身は[[メッセージング]]という考え方を重視していたが、世間の技術的関心は[[クラス (コンピュータ)|クラス]]と[[インスタンス]]の仕組みの方に集まり、オブジェクト指向の解釈はケイの考えとは異なる方向性で推移していった。[[クラス (コンピュータ)|クラス]]を初めて導入した言語はSimulaの1967年版だったので、こちらも後付けでオブジェクト指向の源流に位置付けられている<ref>[http://kristennygaard.org/FORSKNINGSDOK_MAPPE/F_OO_start.html How Object-Oriented Programming Started]</ref>。Simulaに結び付けられたオブジェクト指向と、Smalltalkで提唱されたオブジェクト指向の性格は全く異なるものだったので、双方の解釈に数々の齟齬を生じさせている<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|accessdate=2019-02|publisher=}}</ref>。1983年に計算機科学者[[ビャーネ・ストロヴストルップ]]がSimulaのオブジェクト指向をモデルにした言語「[[C++]]」を公開し、このC++が人気を博した事でオブジェクト指向は本来のSmalltalkではなく、後付けのSimulaスタイルの方で認識されるようになった。 |
|||
=== オブジェクト指向プログラミングの発案 === |
|||
1986年から[[Association for Computing Machinery|ACM]](計算機協会)が[[OOPSLA]](オブジェクト指向会議)を年度開催するようになり、オブジェクト指向は[[コンピュータサイエンス]]の一つのムーブメントになった。[[OOPSLA]]初期のチェアパーソンは、[[Smalltalk]]が生まれた[[ゼロックス|ゼロックス社]][[パロアルト研究所]]のフェローが務めることが多かった。Smalltalkは正確にはプログラミング言語と[[グラフィカルユーザインタフェース|GUI]]運用環境を合わせた[[フレームワーク]]であり、[[Alto|ゼロックスAlto]]機上の[[オペレーティングシステム|OS]]または[[ミドルウェア]]として開発されていた。Smalltalkは70年代の[[アラン・ケイ]]が構想していた[[ダイナブック]]のための[[グラフィカルユーザインタフェース|GUI]]環境でもあった。[[ダイナブック]]はパーソナルコンピュータの原型に位置付けられているものである。[[Alto|ゼロックスAlto]]は[[GUI]]を初めて汎用的にサポートしたコンピュータと[[オペレーティングシステム|OS]]であり、かの[[スティーブ・ジョブズ|スティーブ・ジョブス]]を啓発して[[Macintosh]]のモデルになったことはよく知られている。こうした背景からオブジェクト指向は、上述のプログラミング云々よりも、[[グラフィカルユーザインタフェース|GUI]](グラフィカル・ユーザー・インターフェース)を始めにした当時の先進的な[[ソフトウェア設計|ソフトウェアデザイン]]と[[ソフトウェアアーキテクチャ]]のための開拓的なモデル理論として受け止められる方が好まれた。[[デザインパターン (ソフトウェア)|デザインパターン]]、[[リファクタリング (プログラミング)|リファクタリング]]、[[モデル駆動工学]]、[[ドメインモデル]]、[[ドメイン固有言語]]、[[アジャイルソフトウェア開発]]といった数々のトピックが[[OOPSLA]]から生まれている。具体的に応用された最初の例は、[[データベース]]開発と[[NEXTSTEP|NeXTSTEP]]などの[[オペレーティングシステム]]開発および各種システムに向けた[[ユーザーインターフェース]]デザインであった。 |
|||
オブジェクト指向(''object-oriented'')という言葉自体は、1972年から80年にかけてプログラミング言語「[[Smalltalk]]」を開発した[[ゼロックス|ゼロックス社]][[パロアルト研究所]]の計算機科学者[[アラン・ケイ]]が、その言語設計を説明する過程で誕生している<ref name="EarlyHistoryOfSmalltalk">{{Cite web|url=http://worrydream.com/EarlyHistoryOfSmalltalk/|title=The Early History Of Smalltalk|accessdate=2019-01|publisher=}}</ref>。本人の述懐によると、大学院時代のケイがプログラミング言語「[[Simula]]」に感化されて日夜プログラミング・アーキテクチャの思索に耽っていた1967年頃、今何をしているのかと尋ねてきた知人に対して「object-oriented programmingだよ」とその時の造語で答えたのが原点であるという。このオブジェクト指向が知名度を得るようになったのは1981年頃からであり、当時の著名なマイコン専門誌[[バイト (雑誌)|BYTE]]によるSmalltalkの誌上紹介が契機になっている。オブジェクト指向の中でケイは[[メッセージング]]という考え方を重視していたが、世間の技術的関心は[[クラス (コンピュータ)|クラス]]と[[インスタンス]]の仕組みの方に集まり、オブジェクト指向の解釈はケイの考えとは異なる方向性で推移していった。[[クラス (コンピュータ)|クラス]]を初めて導入した言語はSimulaの1967年版だったので、こちらも後付けでオブジェクト指向の源流に位置付けられることになった<ref>[http://kristennygaard.org/FORSKNINGSDOK_MAPPE/F_OO_start.html How Object-Oriented Programming Started]</ref>。Simulaに結び付けられたオブジェクト指向と、Smalltalkで提唱されたオブジェクト指向の性格は全く異なるものだったので、後のオブジェクト指向の解釈に数々の齟齬を生じさせている。1983年に計算機科学者[[ビャーネ・ストロヴストルップ]]がSimulaをモデルにした言語「[[C++]]」を公開し、このC++が人気を博した事や、Smalltalkでも実際の開発に対応するためにSimulaスタイルの継承などの機能が取り入れられたことで、[[オブジェクト指向プログラミング]]はSimulaスタイルの方で認識されるようになった<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|accessdate=2019-02|publisher=}}</ref>。 |
|||
=== オブジェクト指向開発の始動 === |
|||
1989年には[[IBM|IBM社]]、[[アップル (企業)|アップル社]]、[[ヒューレット・パッカード|ヒューレットパッカード社]]、[[サンマイクロシステムズ|サンマイクロシステムズ社]]、[[アメリカン航空]]などの11社がコンピュータ産業共同事業団体[[Object Management Group|OMG]](Object Management Group)を設立した。OMGの目的は、企業システムネットワークの基盤になる[[分散コンピューティング]]を構築するための基礎要素になる分散オブジェクト設計の標準化を図ることであった。ここでのオブジェクトもデータとメソッド(=コード)の組み合わせと定義されていたので、この業務用システムないしネットワークの構築を目的にした技術アーキテクチャも人々の共通認識としてオブジェクト指向にそのまま包括された。1991年に分散オブジェクトの規格パラダイムとなる[[CORBA]]が公開された。また1997年に[[Object Management Group|OMG]]が標準モデリング言語として採用した[[統一モデリング言語|UML]]は、[[オブジェクト指向ソフトウェア工学]]に準拠したものとして発表されている。 |
|||
1986年から[[Association for Computing Machinery|ACM]](計算機協会)が[[OOPSLA]](オブジェクト指向会議)を年度開催するようになり、オブジェクト指向は[[コンピュータサイエンス]]の一つのムーブメントになった。[[OOPSLA]]初期のチェアパーソンは、[[Smalltalk]]が生まれた[[ゼロックス|ゼロックス社]][[パロアルト研究所]]のフェローが務めることが多かった。Smalltalkは正確には[[プログラミング言語]]と[[グラフィカルユーザインタフェース|GUI]][[ソフトウェアフレームワーク|フレームワーク]]を合わせた統合開発運用環境であり、[[Alto|ゼロックスAlto]]機上の[[オペレーティングシステム|OS]]または[[ミドルウェア]]として制作されていた。[[Alto|ゼロックスAlto]]は[[GUI]]を初めて汎用的にサポートしたコンピュータと[[オペレーティングシステム|OS]]であり、かの[[スティーブ・ジョブズ|スティーブ・ジョブス]]を啓発して[[Macintosh]]のモデルになったことはよく知られている。1980年代前半のコンピュータ界隈は、[[キャラクタユーザインタフェース|CUI]](キャラクタ・ユーザーインターフェース)から[[グラフィカルユーザインタフェース|GUI]](グラフィカル・ユーザーインターフェース)への過渡期であったので、すでに[[プログラミングパラダイム]]とGUIデザイン理論をミックスさせていたオブジェクト指向は、その当時における次世代的なソフトウェア開発技術になり得るものとして関心を集めていた。 |
|||
また別の背景としては、1970年代からの主流である[[構造化プログラミング|構造化開発]]が拡張を続けていた中で、様々な[[データ構造図]]や[[データフロー図]]の技法および[[データモデリング]]の手法がやや乱立気味になっていたという事情があり、その見直しを兼ねて一からの仕切り直しによるソフトウェア開発技術の標準化(standardization)を図りたいとする産業界や計算機科学界の思惑もあった。オブジェクト指向はそのためのスローガンとしても最適であった。こうした経緯から技術的以外の意味も与えられたオブジェクト指向は同時に[[バズワード]]化することにもなっている。[[構造化分析設計技法|構造化開発]]が[[機能モデル|機能]]を中心にして[[機能モデル|機能]]と[[データモデル|データ構造]]を個別にデザインする[[段階的詳細化法|段階的詳細化]]を基礎にしていたのに対し、オブジェクト指向はデータと機能を一つにまとめた[[オブジェクト (プログラミング)|object]]をソフトウェアデザインの中心にした上で[[エドガー・ダイクストラ]]発案の[[構造化プログラミング|抽象データ構造]]及び[[バーバラ・リスコフ]]提唱の[[抽象データ型]]を基礎にしていた。これは前述の[[Simula]]スタイル由来である。オブジェクト指向開発(object-oriented development)という言葉を最初に引用したのは、1986年のソフトウェア技術者[[グラディ・ブーチ]]であったとされる。その最初の活用対象になったのは、[[データベース]]開発と[[オペレーティングシステム]]開発および[[ユーザーインターフェース]]設計であった。 |
|||
==オブジェクト指向の分野== |
|||
オブジェクト指向は[[プログラミングパラダイム]]として誕生した理論である。そのデータ([[変数 (プログラミング)|変数]]またはプロパティ)とコード([[関数 (プログラミング)|関数]]またはメソッド)のセットを基本要素にして物事を解析する考え方が1980年代から大きく注目され始めたことで、[[ソフトウェア開発]]の様々な局面に''object-oriented''を接頭辞にした分野が立ち上げられた。大まかな特徴としては情報資源と処理手順を別々にして分析ないし設計を行っていた従来の標準的な手法に対し、オブジェクト指向と名が付く分野ではこの双方をひとまとめにして物事の解析と組み立てを行う点が共通している。 |
|||
=== オブジェクト指向方法論の進展 === |
|||
[[OOPSLA]]の開催と連動してまず[[オブジェクト指向設計]](OOD)と[[オブジェクト指向分析設計|オブジェクト指向分析]](OOA)が立ち上げられた。これは[[構造化プログラミング|構造化開発]]のSDとSAに倣っていた。1980年代後半からOOPSLA界隈の識者たちによって様々な分析メソッドと設計メソッドが発表されるようになった。この分析/設計メソッドから導出される[[コンセプトモデル|概念モデル]]を、形式的にチャート化ないし[[ダイアグラム|ダイアグラム化]]するという作業がモデリングであり、[[構造化分析設計技法|構造化開発]]でも[[機能モデル]]や[[データモデル]]や[[実体関連モデル]](ER図)などが存在していたが、抽象化を尊ぶオブジェクト指向開発では特にこのモデリングが重視されたのが特徴である。1988年のオブジェクト指向システム分析(OOSA)、1990年からの[[ピーター・コード|Coad]]&[[エドワード・ヨードン|Yourdon]]法、1991年の[[Booch法]]と[[オブジェクトモデル化技法]](OMT)、1992年の[[オブジェクト指向ソフトウェア工学]](OOSE)、1993年のフュージョンメソッドとMartin&Odell法といった数々のオブジェクト指向方法論(object-oriented methodology)による[[オブジェクト指向モデリング|モデリング手法]]が発表され、いずれも[[形式言語]]化されていたのでオブジェクト指向では、[[モデリング言語]]と[[プログラミング言語]]が並んでソフトウェア開発の両輪になった。 |
|||
1990年前後から認知されるようになったオブジェクト指向方法論とは、[[オブジェクト指向分析設計|要求分析]]・[[オブジェクト指向設計|概念設計]]・[[オブジェクト指向モデリング|モデリング]]・[[オブジェクト指向プログラミング|プログラミング]]といった一連の工程を総括的に形式化した理論体系であり、ソフトウェア開発の総合技術としてのオブジェクト指向を体現していた。1994年にモデリング言語をプログラム設計に直接適用した[[ギャング・オブ・フォー (情報工学)|GOF]][[デザインパターン (ソフトウェア)|デザインパターン]]が初回発表された。Booch法とOMTとOOSEの考案者([[スリーアミーゴス]])は、後の[[IBM]]ブランドになる[[ラショナル|ラショナルソフトウェア]]で合流して[[統一モデリング言語]](UML)を制作し、1995年のOOPSLAで初回発表した。オブジェクト指向は[[ソフトウェア開発工程]]の分野にも広がり、[[モデル駆動工学]]、[[ドメイン固有言語]]、[[リファクタリング (プログラミング)|リファクタリング]]、[[アジャイルソフトウェア開発]]といった数々のトピックも[[OOPSLA]]から誕生している。[[ラショナル|IBMラショナル]]はオブジェクト指向開発工程フレームワークを標榜する[[ラショナル統一プロセス]]を2003年に公開した。 |
|||
1989年には[[IBM|IBM社]]、[[Apple]]社、[[ヒューレット・パッカード|ヒューレットパッカード社]]、[[サンマイクロシステムズ|サンマイクロシステムズ社]]、[[アメリカン航空]]などの11社がコンピュータ産業共同事業団体[[Object Management Group|OMG]](Object Management Group)を設立した。その主な目的は、企業システムネットワークの基盤になる[[分散コンピューティング]]を構築するための分散オブジェクト設計の標準化を図ることであった。ここでのオブジェクトもデータとメソッドの複合体と定義されていた。1991年に分散オブジェクトの規格パラダイムとなる[[CORBA]]が発表された。1997年に[[Object Management Group|OMG]]の標準モデリング言語は[[統一モデリング言語|UML]]に策定された。モデリングの[[形式体系]]化に力を注いでいたOMGは[[モデル駆動工学]]のメソッド確立を進めて、2001年に[[モデル駆動型アーキテクチャ|モデル駆動アーキテクチャ]]を発表している。 |
|||
==オブジェクト指向の種類== |
|||
* [[オブジェクト指向プログラミング]] - 1970年代から |
* [[オブジェクト指向プログラミング]] - 1970年代から |
||
* [[オブジェクトデータベース]] - 1980年代から |
* [[オブジェクトデータベース]] - 1980年代から |
||
**[[オブジェクト関係データベース]] - 1990年代から |
|||
* {{仮リンク|オブジェクト指向オペレーティングシステム|en|Object-oriented operating system|label=}} - 1980年代から |
* {{仮リンク|オブジェクト指向オペレーティングシステム|en|Object-oriented operating system|label=}} - 1980年代から |
||
* {{仮リンク|オブジェクト指向ユーザーインターフェース|en|Object-oriented user interface|label=}} - 1980年代から |
* {{仮リンク|オブジェクト指向ユーザーインターフェース|en|Object-oriented user interface|label=}} - 1980年代から |
||
**オブジェクト指向ユーザーエクスペリエンス - 2010年代から |
|||
* [[Common Object Request Broker Architecture|CORBA]] - 1991年から |
|||
* |
*[[オブジェクト指向分析設計|オブジェクト指向設計]] - 1980年代から |
||
* |
*[[オブジェクト指向分析設計|オブジェクト指向分析]] - 1980年代から |
||
* |
*[[オブジェクト指向モデリング]] - 1980年代から |
||
*オブジェクト指向方法論 - 1990年代から |
|||
* [[統一モデリング言語|UML]] - 1997年から ←([[Booch法|ブーチメソッド]]、[[オブジェクトモデル化技法]]) |
|||
* |
**Meyer法(オブジェクト指向ソフトウェア構築 - OOSC) |
||
**Shlaer and Mellor法(オブジェクト指向システム分析 - OOSA) |
|||
**Wirfs-Brock法(責任駆動設計 - RDD) |
|||
**Coad and Yourdon法 |
|||
**[[Booch法]] |
|||
**[[オブジェクトモデル化技法]](OMT) |
|||
**[[オブジェクト指向ソフトウェア工学]](OOSE) |
|||
**Gibson and Goldberg法(オブジェクト動作分析 - OBA) |
|||
**フュージョンメソッド ← Booch法・RDD・OMT・OOSE |
|||
**Martin and Odell法 |
|||
**Graham法(意味論オブジェクトモデル化導入論 - SOMA) |
|||
**Henderson-Sellers法(オブジェクト指向システムソフトウェア工学方法論 - MOSES) |
|||
**[[統一モデリング言語]](UML)← Booch法・OMT・OOSE |
|||
**Openモデリング言語(OML)← フュージョンメソッド・SOMA・MOSES |
|||
**オブジェクト工学プロセス(OEP)← UML・OMT・OOSE |
|||
**[[ラショナル統一プロセス]](RUP)← UML・OMT・OOSE |
|||
* {{仮リンク|オブジェクト指向存在論|en|Object-oriented ontology}} - 哲学分野 |
* {{仮リンク|オブジェクト指向存在論|en|Object-oriented ontology}} - 哲学分野 |
||
==アラン・ケイのオブジェクト指向とは== |
==アラン・ケイのオブジェクト指向とは== |
||
=== 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/>(双方の事例において私達は、オブジェクト(対象)を第一とし、欲求を第二とする。これは高い満足度で具象と抽象を一体化する)}}80年代前半までのオブジェクト指向はプログラミングとGUIの融合思想と言った方が適当であり、オペレータがプログラミングでカスタマイズした結果をGUIビュー環境でほぼ同時に確認できるという特性は、コマンドライン実行とキャラクタ文字環境が当然であった時代において革新的であった。プログラミングはコンピュータとの潜在的な対話であり、GUIは顕在的な対話であると形容されている。長じてアイコン選択とメニュー処理を適宜に連携させるGUIの考え方をプログラミングにも応用したものが、後述のオブジェクトとメッセージ式になっている。 |
|||
=== |
=== 1990年代の言及 === |
||
1992年に[[Association for Computing Machinery|ACM]]からプログラミング言語史編纂の一環として執筆を依頼されたアラン・ケイは、翌93年の「The Early History Of Smalltalk」でオブジェクト指向の原点としての[[Smalltalk]]について解説している<ref name="EarlyHistoryOfSmalltalk" />。冒頭の序章で設計理念が説明され、第一章から第三章まではその着想元になった[[バロース B5000|バロースB5000]]、[[Sketchpad]]、[[Simula]]、Flex machine、[[LISP]]などの技術史が記され、第四章から第六章まではSmalltalkの開発史が綴られている。ここでは序章から特徴的な要点のみを抜粋する。 |
|||
1970年代に[[ゼロックス|ゼロックス社]][[パロアルト研究所]]で誕生し、1981年頃から知名度を得るようになったオブジェクト指向(''object-oriented'')は同時に発案者である[[アラン・ケイ]]の手を離れて[[プログラミングパラダイム]]から[[ソフトウエア工学知識体系|ソフトウェア工学]]分野へと認識拡大し、1986年以降は[[Association for Computing Machinery|ACM]](計算機協会)開催の[[OOPSLA]](オブジェクト指向会議)が中心的な担い手の役割を果たしていた。70年代から80年代前半にかけてのオブジェクト指向は[[Smalltalk]]言語仕様の一環としてそれに当たることで一定の理解を得られたが、80年代後半以降は事情が異なっている。ここではアラン・ケイの語るオブジェクト指向についてをまとめる。 |
|||
{{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の設計―及び存在―とは、私たちの思い描ける全てが、自己の状態とプロセスの結合を内部隠蔽した個々の振る舞い組立ブロックの再帰構成によって表現され、徹底的なメッセージの交換のみによって処理されるということだ。)}}再帰構成すなわち[[再帰]]の概念は、後続文にも繰り返し登場している。もっとも再帰は一般知識であり、例えば[[ジョン・マッカーシー]]も[[LISP]]の設計を<code>recursive functions of symbolic expressions and their computation by machine.</code>(記号式の再帰関数群と機械によるその計算)と概略していた。メッセージ交換は、徹底的な[[疎結合]]および{{仮リンク|情報隠蔽|en|Information hiding|redirect=1}}を示唆している。{{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のオブジェクトはそれぞれが計算の総体可能性を備えた再帰要素になる。)}}ケイが理想とする計算の総体可能性の反対である劣化要素への分割とは、いわゆる[[型システム]]の導入を指している。他の論考でもケイは特に静的な[[型システム]]に対して否定的な見解を示していた。{{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世紀の物理・生物学思考との共通点を見出せる。オブジェクトの構築は、[[イデア論|イデア]]から現象が創生されるという全くの[[プラトン|プラトニック]]である。)}} |
|||
第四章では、Smalltalkの言語仕様が六つに概略されている。{{Quotation|1, EverythingIsAnObject. |
|||
==== 1989年頃 ==== |
|||
1989年に発表されたUser Interface A Personal Viewという記事の中でアラン・ケイは、Smalltalkのオブジェクト指向性は大変示唆的であると前置きした上でこう述べている<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>。{{Quotation|''object-oriented means that the object knows what it can do.''<br/>(オブジェクト指向とは、オブジェクトが出来るなにかを知っていることを意味している)|Alan Kay}}オブジェクトを指向(重視)することの意味について、ケイは抽象的シンボル視点のプロセスと、具体的ユーザーインターフェース視点のプロセスを対照させながら説明している。前者では我々はまずオブジェクトの名前を示し、次にそのオブジェクトが行なうなにかを理解させるメッセージを続かせることになる。後者では我々はまず対象を選択し、次にその対象が提供するなにかの一覧を表示させることになる。この双方を踏まえた上でケイはこう結論している。{{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/>(具象と抽象の両視点においてオブジェクト(対象)を第一とし、欲求を第二とする。これは高い満足度で具象と抽象を一体化する)|Alan Kay}}オブジェクトの重視と並行して、ケイはあらゆる物事からモード(''mode'')を取り除くべきだとするモードレス(''modeless'')の考え方も提唱している。ここでのモードとは決められた作業手順を指しており、モーダルはタスクの指向(重視)を意味することになる。モードレスは作業手順が特に決められていないことを意味している。オブジェクトとモードレスを融合させたユーザーインターフェースのデザインについて、ケイはテキストエディタの操作を例にした興味深い説明を加えている。テキストエディタの「挿入」「削除」「置換」といった操作はモーダルに当たる。それらは余りに基本的であるがゆえに対象と欲求に分解してのモードレスに再解釈できる余地がないように見える。ケイはこの命題から''Thus, there could be a zero-width selection, and thus every operation could be a replace.(もしゼロ幅選択枠というものがあるならば、全ての操作は置換になるだろう)といった解答を示している。「''ゼロ幅選択枠」という抽象的対象を導入することで「挿入」は、始めに任意の文字間にあるゼロ幅選択枠を指定し、次に置換→任意の文字列という欲求を伝えるという対象第一の操作に変える事ができる。「削除」は始めに任意の選択文字列を指定して、次に置換→ゼロ幅選択枠という欲求を伝えるという対象第一の操作に変える事ができる。「置換」は選択文字列→置換→文字列である。文字実体のない抽象的なオブジェクトであるゼロ幅選択枠が、モーダルな操作をモードレスに再解釈する役目を果たしている。始めに対象を選択しても自由に他の対象または他の表示中の操作にも移れることがモードレスと言われる所以である。これが具象と抽象の一体化であると説明されている。 |
|||
2, Objects communicate by sending and receiving messages (in terms of objects). |
|||
==== 1993年頃 ==== |
|||
1992年に[[Association for Computing Machinery|ACM]]からプログラミング言語史編纂の一環として執筆を依頼された[[アラン・ケイ]]は、翌年のACM刊行記事においてオブジェクト指向の構想を改めて六つの要約にまとめて説明した<ref name="EarlyHistoryOfSmalltalk" />。{{Quotation|1, ''EverythingIsAnObject. |
|||
3, Objects have their own memory (in terms of objects). |
|||
4, Every object is an instance of a class (which must be an object). |
|||
3, ''Objects have their own memory (in terms of objects). |
|||
5, The class holds the shared behavior for its instances (in the form of objects in a program list). |
|||
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.}}この和訳は以下のようになるが、ここでは長い説明を避けて特徴的な要点のみを解説する。 |
|||
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}}この和訳は以下のようになる。 |
|||
# すべてはオブジェクトである。 |
# すべてはオブジェクトである。 |
||
# オブジェクトはメッセージの送信と受信によってコミュニケーションする。 |
# オブジェクトはメッセージの送信と受信によってコミュニケーションする。 |
||
# オブジェクトは自身の記憶を持つ。 |
# オブジェクトは自身の記憶を持つ。 |
||
# すべてのオブジェクトはクラスのインスタンスである。クラスもまたオブジェクト |
# すべてのオブジェクトはクラスのインスタンスである。クラスもまたオブジェクトである。 |
||
# クラスはそのインスタンス |
# クラスはその各インスタンスで共有される振る舞いを保持する。振る舞いとはプログラムリスト・オブジェクトである。 |
||
# プログラムリストの評価では、制御は最初のオブジェクトに渡され、残りはそのメッセージとして |
# プログラムリストの評価では、制御は最初のオブジェクトに渡され、残りはそのメッセージとして扱われる。 |
||
メッセージと記憶はオブジェクトの独自用語とされておりその解釈は先送りする。プログラムリストは[[LISP]]風の万能文法(LISPではリスト)であり、計算シンボル、関数シンボル、変数シンボル、数列、数値をトークン単位で連ねたデータ列である。データ列をそのままコード列として解釈演算するのが評価(''eval'')である。評価の管理が制御(''control'')であり、この場合はどのプログラムスコープで管理されるかを意味する。プログラムリストはメッセージとして処理されると示されているので、すなわちメッセージを送られたオブジェクトのスコープでその評価は制御される事になる。スコープはコンテキストとも読み替えられ、同じシンボルでもコンテキストによって意味が変わった。オブジェクトの記憶の''have''に対して、振る舞いの''hold''の違いにも留意する必要がある。 |
|||
==== 1998年頃 ==== |
|||
1998年にAn Introduction To Object-Oriented Programming''を出版した[[オレゴン大学]]コンピュータサイエンス教授ティム・バッドによると、この時期のアラン・ケイの構想はこのようになっていた''<ref>{{Cite web|url=http://wiki.c2.com/?AlanKaysDefinitionOfObjectOriented|title=Alan Kays Definition Of Object Oriented|accessdate=2020-1|publisher=}}</ref>''。''{{Quotation|1, ''EverythingIsAnObject. |
|||
2, ''Communication is performed by objects communicating with each other, requesting that objects perform actions. Objects communicate by sending and receiving messages. A message is a request for action, bundled with whatever objects may be necessary to complete the task. |
|||
3, ''Objects have their own memory, which consists of other objects. |
|||
4, ''Every object is an instance of a class. A class simply represents a grouping of similar objects, such as integers or lists. |
|||
5, ''The class is the repository for behavior associated with an object. That is, all objects that are instances of the same class can perform the same actions. |
|||
6, ''Classes are organized into a singly-rooted tree structure, called the inheritance hierarchy. Memory and behavior associated with instances of a class are available to any class associated with a descendent in this tree structure.|Alan Kay}}この和訳は以下のようになる。'' |
|||
# すべてはオブジェクトである。 |
|||
# コミュニケーションはオブジェクトに動作実効を要求するオブジェクトの相互通信で実効される。オブジェクトはメッセージの送受信でコミュニケーションする。メッセージはタスク遂行に必要なオブジェクトが付帯された動作要求である。 |
|||
# オブジェクトは自身の記憶を持つ。記憶は他のオブジェクトたちで構成されている。 |
|||
# すべてのオブジェクトはクラスのインスタンスである。クラスは数値集合やリスト集合といったように類似オブジェクトのグループ化をシンプルに表現する。 |
|||
# クラスはオブジェクトに関連付けられた振る舞いのリポジトリである。同じクラスのインスタンスである全てのオブジェクトは共通動作を実効できる。 |
|||
# クラスは継承階層と呼ばれる単一ツリー構造で組成される。クラスのインスタンスの記憶と振る舞いは、ツリー構造下の子孫であるクラスからも利用できる。 |
|||
オブジェクトに動作を求めるメッセージ自体にもオブジェクトが含まれていることや、オブジェクトの記憶もオブジェクトの集合であることが示されており、メッセージと記憶の意味がより明らかにされている。また、プログラムリストを評価するなどの構想が、単一継承を重視する考えに置き換えられている。 |
|||
'''(2)'''は様々に解釈されるが、コミュニケーションする[[オブジェクト (プログラミング)|オブジェクト]]は、[[プロセス計算|プロセス]]や[[アクターモデル|アクター]]としての性格が強くなる。'''(3)'''の記憶は簡単に言うと[[フィールド (計算機科学)|フィールド]]や[[プロパティ (プログラミング)|プロパティ]]や[[属性 (コンピューティング)|属性]]であるが、オブジェクトの振る舞いを制約するための私的環境を示唆している。'''(4)'''は、[[クラス (コンピュータ)|クラス]]もまた[[メタクラス]]の[[インスタンス]]化であるという再帰構成を示唆している。'''(5)'''の振る舞いは簡単に言うと[[メソッド (計算機科学)|メソッド]]であるが、[[LISP]]のフォームリストに似たオブジェクトとして保持されることを示唆している。'''(6)'''は、[[式 (プログラミング)|式]]内のオブジェクトはその時の並べられた順序によって、いずれもがコントローラ(関数式)になり、いずれもがそれへのメッセージ(引数)になることを示唆している。 |
|||
==== 2003年頃 ==== |
|||
=== 2000年代の言及 === |
|||
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>。{{Quotation|''OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.'' |
|||
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>。このメールは60年代末からの構想をさり気なく簡潔にまとめたものとしてしばしば引用される。ここでは文章順に各要点を抜粋していく。 |
|||
<br>(僕にとってのオブジェクト指向とは、メッセージング、ステートプロセスの局所保持かつ保護かつ隠蔽、徹底的な遅延バインディング、なんとこれだけの意味だった。)|Alan Kay}} |
|||
{{Quotation|I thought of objects being like biological cells and/or individual computers on a network, only able to communicate with messages.<br/>(さながら生物の細胞、もしくはネットワーク上の銘々のコンピュータ、それらはただメッセージによってコミュニケーションする存在、僕はオブジェクトをそう考えている)}} |
|||
上記はケイ本来のオブジェクトの在り方を述べたものであり、特に解説はしない。 |
|||
{{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アーキテクチャでほとんど実現していた。僕は気付いた。細胞/全体コンピュータメタファはデータを除去できるであろうと、)}} |
|||
ここでプログラムからデータを取り除きたいという考えが提示されている。 |
|||
{{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/>(僕の数学専攻経験がこれを気付かせた。各オブジェクトは幾つかの関連付けられた代数を持ち、またその系統群もあるかもしれない。それらは大変有用になるだろうと)}} |
|||
ここでの代数は、[[プロセス代数]]か、プログラミングに適用した[[代数的構造]]とも解釈できる。 |
|||
{{Quotation|OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.<br/>(僕にとってのOOPとは、メッセージング、ステートプロセスの局所保持かつ保護かつ隠蔽、徹底的な遅延バインディング、これだけの意味だった)}} |
|||
メッセージングは造語に近く、[[メッセージパッシング]]に類似の概念であり、ただの[[リモートプロシージャコール]]とは異なることが明言されている。ステートプロセスは、データとコードの一元化概念であり、これも造語である。[[動的束縛|遅延バインディング]]は、シンボルと実体の結合をランタイムで決定する概念である。 |
|||
{{Quotation|One of the things I should have mentioned is that there were two main paths that were catalysed by Simula. The early one (just by accident) was the bio/net non-data-procedure route that I took. The other one, which came a little later as an object of study was abstract data types, and this got much more play.<br/>(僕が触れるべきだった一つは、Simulaを触媒にした二本の道があったということだ。最初の一本はバイオ/ネットな非データ手順で僕が選んだ方。少し遅れたもう一本は抽象データ型でこっちの方がずっと賑わっている)}} |
|||
ここで[[抽象データ型]]に対しての、非データ手順(non-data-procedure)というワードが登場する。振る舞いを通してデータを扱うというデータ抽象の概念を、更に抽象化したものが非データであり、[[代数学]]で言う[[写像]]だけでデータを表現するという概念を指している。これにケイの[[生物学]]専攻を背景にしたバイオ/ネット(bio/net)なる考えが加えられている。 |
|||
{{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)に関連付けられるものとしては、[[代数的構造]]、[[圏論]]の[[射 (圏論)|射]]や[[関手]]の構造、{{仮リンク|Futuresとpromises|en|Futures and promises}}、{{仮リンク|ポイントフリースタイル|en|point-free style}}、[[プロセス代数]]、[[アクターモデル]]、自由[[モナド (プログラミング)|モナド]]などが挙げられる。 |
|||
{{Quotation|The people who liked objects as non-data were smaller in number,<br/>(非データとしてのオブジェクトを好む者は少なかった、)}} |
|||
ここで歴史に戻る。1970年前後になると[[ソフトウェア危機]]としても語られるプログラム規模拡大に対応するために、サブルーチンとデータをまとめた[[モジュール|プログラムモジュール]]という機能が登場した。それと同時期の1967年に[[オルヨハン・ダール]]らは[[クラス (コンピュータ)|クラス]]という機能を備えた[[Simula|Simula67]]を開発し、1969年から[[エドガー・ダイクストラ]]は抽象データ構造という概念を備えた[[構造化プログラミング]]を提唱した。1974年から[[IBM|IBM社]]中心の研究者たちが[[構造化分析設計技法|構造化分析/設計]]と総称される技法を発表し、構造化プログラミングはこちらに取って代わられた。1972年からアラン・ケイはメッセージングという概念を備えたオブジェクト指向を誕生させている。オブジェクト指向は後に[[クラスベース|クラス・パラダイム]]にマウントされている。 |
|||
[[構造化プログラミング|構造化設計]]は、サブルーチン複合体とデータ構造を扱っている具象データ(concrete data)技術である。Simula発のクラスとダイクストラ発の抽象データ構造は、プログラムモジュールに[[カプセル化]]・[[継承 (プログラミング)|継承]]・[[多態性]]を備えて抽象体として扱おうとする抽象データ(abstract data)技術である。そしてアラン・ケイ本来のオブジェクトとは、プログラムモジュールを[[生物学]]と[[代数学]]の観点から再解釈した非データ(non data)技術であった。構造化開発は1980年代までの主流であり、続けてオブジェクト指向が主流になったが、現在においてもクラスをただのデータとメソッドの複合体として扱っているようなオブジェクト指向は、構造化開発と大差ないものになり「具象データ」から「抽象データ」への思考転換の難しさを物語っている。モジュールの抽象化が提唱され始めたのは1970年代であったが、同時期にアラン・ケイは「抽象データ」を更に抽象化した「非データ」を構想していた。 |
|||
「''messaging''」「''state-process''」「''late-binding''」のうち一番目と二番目は、''object-oriented''と同様にケイの造語なので注意が必要である。一番目はオブジェクト同士のコミュニケーションを指しており[[メッセージパッシング]]に類似の言葉であるが、プログラム用語的にはケイの造語である。二番目のステートプロセスは状態処理が適訳と思われるが、元々が造語であるため詳細は漠然としている。 |
|||
=== 2020年の言及 === |
|||
Q&Aサイトの[[Quora]]で「66~67年のオブジェクト指向という造語を発したアラン・ケイに誰かが影響を与えていたのか?」という質問に対して本人がこう回答している。なお、rotationとは「一つのコンピュータはどこかのコンピュータができることをできる、相互通信によってあらゆる規模の計算可能性を表現できる」を意味している。{{Quotation|''In the 1960s, software composites that were more complex than arrays, were often called “objects”, and all the schemes I had seen involved structures that included attached procedures. A month or so after the “rotation” someone asked me what I was doing, and I foolishly said “object-oriented programming”.'' |
|||
<br>(60年代、配列より複雑なソフトウェア構成体はしばしばオブジェクトと呼ばれていた。手続きを付けた構造体を僕もそう見ていた。rotation構想の後、今何をしているのかと尋ねられた僕は愚かにもこう言った。オブジェクト指向プログラミングと。)|Alan Kay}} |
|||
{{Quotation|''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はプロセスと呼んでいた。これはいい。プロセス指向プログラミングの方がずっと良かったんじゃないか?)|Alan Kay}} |
|||
Q&Aサイトの[[Quora]]で「1966~67年のオブジェクト指向という造語を発したアラン・ケイに誰かが影響を与えていたのか?」という質問に対して本人がこう回答している。なお、強調されている“rotation”は「The Early History of Smalltalk」などにその経緯が記された1966年頃の彼自身による“オブジェクト”の、特にソフトウエアの基本構成単位としての発見(念のため、この時点ではSimulaはまだ「オブジェクト」ではなく後述のように相当するエンティティを「プロセス」という用語で表現していた)とその後の彼の中での発想の大転換を意味する。{{Quotation|''In the 1960s, software composites that were more complex than arrays, were often called “objects”, and all the schemes I had seen involved structures that included attached procedures. A month or so after the “rotation” someone asked me what I was doing, and I foolishly said “object-oriented programming”.''<br>(60年代、配列より複雑なソフトウェア構成体はしばしばオブジェクトと呼ばれており、僕のスキームにあった手続き付きの構造体もそうだった。私の中での“発想の転換”が起こった後、今何をしているのかと尋ねられた僕は愚かにもこう言った。オブジェクト指向プログラミングと。)<br> |
|||
=== その解釈 === |
|||
''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はプロセスと呼んでいた。こっちがよかったな。プロセス指向プログラミングの方がずっと良かったと思わないかい?) |
|||
}} |
|||
== 脚注 == |
== 脚注 == |
||
104行目: | 121行目: | ||
*[[仮想マシン]] |
*[[仮想マシン]] |
||
*[[アクターモデル]] |
*[[アクターモデル]] |
||
*[[オブジェクト関係マッピング]] |
|||
==外部リンク== |
==外部リンク== |
||
114行目: | 130行目: | ||
[[Category:オブジェクト指向|*]] |
[[Category:オブジェクト指向|*]] |
||
[[Category:ソフトウェア工学]] |
[[Category:ソフトウェア工学]] |
||
[[Category: |
[[Category:アラン・ケイ]] |
2024年6月22日 (土) 04:37時点における最新版
この記事には独自研究が含まれているおそれがあります。 |
オブジェクト指向(オブジェクトしこう、英: object-oriented)は、ソフトウェア開発とコンピュータプログラミングのために用いられる考え方である。元々は特定のプログラミングパラダイムを説明するために考案された言葉であり、その当時の革新的技術であったGUI(グラフィカル・ユーザーインターフェース)とも密接に関連していた。明確な用語としては1970年代に誕生し、1981年頃から知名度を得て、1986年頃からソフトウェア開発のムーブメントと化した後に、1990年頃にはソフトウェア開発の総合技術としての共通認識を確立している。ソフトウェア開発における一つの標語のような扱い方もされている。
オブジェクトとは、プログラミング視点ではデータ構造とその専属手続きを一つにまとめたものを指しており、分析/設計視点では情報資源とその処理手順を一つにまとめたものを指している。データとプロセスを個別に扱わずに、双方を一体化したオブジェクトを基礎要素にし、メッセージと形容されるオブジェクト間の相互作用を重視して、ソフトウェア全体を構築しようとする考え方がオブジェクト指向である。
オブジェクト指向の来歴
[編集]オブジェクト指向プログラミングの発案
[編集]オブジェクト指向(object-oriented)という言葉自体は、1972年から80年にかけてプログラミング言語「Smalltalk」を開発したゼロックス社パロアルト研究所の計算機科学者アラン・ケイが、その言語設計を説明する過程で誕生している[1]。本人の述懐によると、大学院時代のケイがプログラミング言語「Simula」に感化されて日夜プログラミング・アーキテクチャの思索に耽っていた1967年頃、今何をしているのかと尋ねてきた知人に対して「object-oriented programmingだよ」とその時の造語で答えたのが原点であるという。このオブジェクト指向が知名度を得るようになったのは1981年頃からであり、当時の著名なマイコン専門誌BYTEによるSmalltalkの誌上紹介が契機になっている。オブジェクト指向の中でケイはメッセージングという考え方を重視していたが、世間の技術的関心はクラスとインスタンスの仕組みの方に集まり、オブジェクト指向の解釈はケイの考えとは異なる方向性で推移していった。クラスを初めて導入した言語はSimulaの1967年版だったので、こちらも後付けでオブジェクト指向の源流に位置付けられることになった[2]。Simulaに結び付けられたオブジェクト指向と、Smalltalkで提唱されたオブジェクト指向の性格は全く異なるものだったので、後のオブジェクト指向の解釈に数々の齟齬を生じさせている。1983年に計算機科学者ビャーネ・ストロヴストルップがSimulaをモデルにした言語「C++」を公開し、このC++が人気を博した事や、Smalltalkでも実際の開発に対応するためにSimulaスタイルの継承などの機能が取り入れられたことで、オブジェクト指向プログラミングはSimulaスタイルの方で認識されるようになった[3]。
オブジェクト指向開発の始動
[編集]1986年からACM(計算機協会)がOOPSLA(オブジェクト指向会議)を年度開催するようになり、オブジェクト指向はコンピュータサイエンスの一つのムーブメントになった。OOPSLA初期のチェアパーソンは、Smalltalkが生まれたゼロックス社パロアルト研究所のフェローが務めることが多かった。Smalltalkは正確にはプログラミング言語とGUIフレームワークを合わせた統合開発運用環境であり、ゼロックスAlto機上のOSまたはミドルウェアとして制作されていた。ゼロックスAltoはGUIを初めて汎用的にサポートしたコンピュータとOSであり、かのスティーブ・ジョブスを啓発してMacintoshのモデルになったことはよく知られている。1980年代前半のコンピュータ界隈は、CUI(キャラクタ・ユーザーインターフェース)からGUI(グラフィカル・ユーザーインターフェース)への過渡期であったので、すでにプログラミングパラダイムとGUIデザイン理論をミックスさせていたオブジェクト指向は、その当時における次世代的なソフトウェア開発技術になり得るものとして関心を集めていた。
また別の背景としては、1970年代からの主流である構造化開発が拡張を続けていた中で、様々なデータ構造図やデータフロー図の技法およびデータモデリングの手法がやや乱立気味になっていたという事情があり、その見直しを兼ねて一からの仕切り直しによるソフトウェア開発技術の標準化(standardization)を図りたいとする産業界や計算機科学界の思惑もあった。オブジェクト指向はそのためのスローガンとしても最適であった。こうした経緯から技術的以外の意味も与えられたオブジェクト指向は同時にバズワード化することにもなっている。構造化開発が機能を中心にして機能とデータ構造を個別にデザインする段階的詳細化を基礎にしていたのに対し、オブジェクト指向はデータと機能を一つにまとめたobjectをソフトウェアデザインの中心にした上でエドガー・ダイクストラ発案の抽象データ構造及びバーバラ・リスコフ提唱の抽象データ型を基礎にしていた。これは前述のSimulaスタイル由来である。オブジェクト指向開発(object-oriented development)という言葉を最初に引用したのは、1986年のソフトウェア技術者グラディ・ブーチであったとされる。その最初の活用対象になったのは、データベース開発とオペレーティングシステム開発およびユーザーインターフェース設計であった。
オブジェクト指向方法論の進展
[編集]OOPSLAの開催と連動してまずオブジェクト指向設計(OOD)とオブジェクト指向分析(OOA)が立ち上げられた。これは構造化開発のSDとSAに倣っていた。1980年代後半からOOPSLA界隈の識者たちによって様々な分析メソッドと設計メソッドが発表されるようになった。この分析/設計メソッドから導出される概念モデルを、形式的にチャート化ないしダイアグラム化するという作業がモデリングであり、構造化開発でも機能モデルやデータモデルや実体関連モデル(ER図)などが存在していたが、抽象化を尊ぶオブジェクト指向開発では特にこのモデリングが重視されたのが特徴である。1988年のオブジェクト指向システム分析(OOSA)、1990年からのCoad&Yourdon法、1991年のBooch法とオブジェクトモデル化技法(OMT)、1992年のオブジェクト指向ソフトウェア工学(OOSE)、1993年のフュージョンメソッドとMartin&Odell法といった数々のオブジェクト指向方法論(object-oriented methodology)によるモデリング手法が発表され、いずれも形式言語化されていたのでオブジェクト指向では、モデリング言語とプログラミング言語が並んでソフトウェア開発の両輪になった。
1990年前後から認知されるようになったオブジェクト指向方法論とは、要求分析・概念設計・モデリング・プログラミングといった一連の工程を総括的に形式化した理論体系であり、ソフトウェア開発の総合技術としてのオブジェクト指向を体現していた。1994年にモデリング言語をプログラム設計に直接適用したGOFデザインパターンが初回発表された。Booch法とOMTとOOSEの考案者(スリーアミーゴス)は、後のIBMブランドになるラショナルソフトウェアで合流して統一モデリング言語(UML)を制作し、1995年のOOPSLAで初回発表した。オブジェクト指向はソフトウェア開発工程の分野にも広がり、モデル駆動工学、ドメイン固有言語、リファクタリング、アジャイルソフトウェア開発といった数々のトピックもOOPSLAから誕生している。IBMラショナルはオブジェクト指向開発工程フレームワークを標榜するラショナル統一プロセスを2003年に公開した。
1989年にはIBM社、Apple社、ヒューレットパッカード社、サンマイクロシステムズ社、アメリカン航空などの11社がコンピュータ産業共同事業団体OMG(Object Management Group)を設立した。その主な目的は、企業システムネットワークの基盤になる分散コンピューティングを構築するための分散オブジェクト設計の標準化を図ることであった。ここでのオブジェクトもデータとメソッドの複合体と定義されていた。1991年に分散オブジェクトの規格パラダイムとなるCORBAが発表された。1997年にOMGの標準モデリング言語はUMLに策定された。モデリングの形式体系化に力を注いでいたOMGはモデル駆動工学のメソッド確立を進めて、2001年にモデル駆動アーキテクチャを発表している。
オブジェクト指向の種類
[編集]- オブジェクト指向プログラミング - 1970年代から
- オブジェクトデータベース - 1980年代から
- オブジェクト関係データベース - 1990年代から
- オブジェクト指向オペレーティングシステム - 1980年代から
- オブジェクト指向ユーザーインターフェース - 1980年代から
- オブジェクト指向ユーザーエクスペリエンス - 2010年代から
- オブジェクト指向設計 - 1980年代から
- オブジェクト指向分析 - 1980年代から
- オブジェクト指向モデリング - 1980年代から
- オブジェクト指向方法論 - 1990年代から
- Meyer法(オブジェクト指向ソフトウェア構築 - OOSC)
- Shlaer and Mellor法(オブジェクト指向システム分析 - OOSA)
- Wirfs-Brock法(責任駆動設計 - RDD)
- Coad and Yourdon法
- Booch法
- オブジェクトモデル化技法(OMT)
- オブジェクト指向ソフトウェア工学(OOSE)
- Gibson and Goldberg法(オブジェクト動作分析 - OBA)
- フュージョンメソッド ← Booch法・RDD・OMT・OOSE
- Martin and Odell法
- Graham法(意味論オブジェクトモデル化導入論 - SOMA)
- Henderson-Sellers法(オブジェクト指向システムソフトウェア工学方法論 - MOSES)
- 統一モデリング言語(UML)← Booch法・OMT・OOSE
- Openモデリング言語(OML)← フュージョンメソッド・SOMA・MOSES
- オブジェクト工学プロセス(OEP)← UML・OMT・OOSE
- ラショナル統一プロセス(RUP)← UML・OMT・OOSE
- オブジェクト指向存在論 - 哲学分野
アラン・ケイのオブジェクト指向とは
[編集]1980年代の言及
[編集]1989年に発表された「User Interface A Personal View」という記事の中でアラン・ケイは、Smalltalkのオブジェクト指向性は大変示唆的であると前置きした上で、そのプログラミング言語でのOOPと、そのGUIフレームワークでのOOUIを照応させながらこう述べている[4]。これは人とコンピュータの対話形式としてのオブジェクト指向に沿ったものになっている。1970年代から80年代にかけてのオブジェクト指向は、GUI(グラフィカルユーザーインターフェース)と半ば表裏一体で扱われていたという技術史背景がある。
object-oriented means that the object knows what it can do.
(オブジェクト指向とは、オブジェクトが出来る「なにか」を知っていることを意味している)
これは認知心理学のアフォーダンスにつながる考え方と解釈されている。その説明の中でケイは、Smalltalkプログラミングを抽象シンボル舞台と形容しており、GUIフレームワークを具象ユーザーインターフェース舞台と形容している。前者の抽象シンボル舞台では、我々は最初にオブジェクトの名前(識別子)をコーディングし、次にそのオブジェクトが実行する「なにか」を伝えるメッセージをコーディングすることになる。後者の具象ユーザーインターフェース舞台では、我々は最初に操作する対象(アイコン)を選択し、次にその対象が提供する「なにか」のメニュー欄を表示選択することになる。この双方を踏まえた上でケイはこう結論している。
In both case we have the object first and the desire second. this unifies the concrete with the abstract in highly satisfying way.
(双方の事例において私達は、オブジェクト(対象)を第一とし、欲求を第二とする。これは高い満足度で具象と抽象を一体化する)
80年代前半までのオブジェクト指向はプログラミングとGUIの融合思想と言った方が適当であり、オペレータがプログラミングでカスタマイズした結果をGUIビュー環境でほぼ同時に確認できるという特性は、コマンドライン実行とキャラクタ文字環境が当然であった時代において革新的であった。プログラミングはコンピュータとの潜在的な対話であり、GUIは顕在的な対話であると形容されている。長じてアイコン選択とメニュー処理を適宜に連携させるGUIの考え方をプログラミングにも応用したものが、後述のオブジェクトとメッセージ式になっている。
1990年代の言及
[編集]1992年にACMからプログラミング言語史編纂の一環として執筆を依頼されたアラン・ケイは、翌93年の「The Early History Of Smalltalk」でオブジェクト指向の原点としてのSmalltalkについて解説している[1]。冒頭の序章で設計理念が説明され、第一章から第三章まではその着想元になったバロースB5000、Sketchpad、Simula、Flex machine、LISPなどの技術史が記され、第四章から第六章まではSmalltalkの開発史が綴られている。ここでは序章から特徴的な要点のみを抜粋する。
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.
(Smalltalkの設計―及び存在―とは、私たちの思い描ける全てが、自己の状態とプロセスの結合を内部隠蔽した個々の振る舞い組立ブロックの再帰構成によって表現され、徹底的なメッセージの交換のみによって処理されるということだ。)
再帰構成すなわち再帰の概念は、後続文にも繰り返し登場している。もっとも再帰は一般知識であり、例えばジョン・マッカーシーもLISPの設計をrecursive functions of symbolic expressions and their computation by machine.
(記号式の再帰関数群と機械によるその計算)と概略していた。メッセージ交換は、徹底的な疎結合および情報隠蔽を示唆している。
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.
(Smalltalkは計算概念の自己再帰である。コンピュータプログラムをその全体からの劣化要素―データ構造、手続き、関数といった言語機能の諸々に分割していくのではなく、Smalltalkのオブジェクトはそれぞれが計算の総体可能性を備えた再帰要素になる。)
ケイが理想とする計算の総体可能性の反対である劣化要素への分割とは、いわゆる型システムの導入を指している。他の論考でもケイは特に静的な型システムに対して否定的な見解を示していた。
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.
(哲学面でのSmalltalkオブジェクトは、ライプニッツのモナドや20世紀の物理・生物学思考との共通点を見出せる。オブジェクトの構築は、イデアから現象が創生されるという全くのプラトニックである。)
第四章では、Smalltalkの言語仕様が六つに概略されている。
1, EverythingIsAnObject.2, 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).
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.
この和訳は以下のようになるが、ここでは長い説明を避けて特徴的な要点のみを解説する。
- すべてはオブジェクトである。
- オブジェクトはメッセージの送信と受信によってコミュニケーションする。
- オブジェクトは自身の記憶を持つ。
- すべてのオブジェクトはクラスのインスタンスである。クラスもまたオブジェクトである。
- クラスはその各インスタンスで共有される振る舞いを保持する。振る舞いとはプログラムリスト・オブジェクトである。
- プログラムリストの評価では、制御は最初のオブジェクトに渡され、残りはそのメッセージとして扱われる。
(2)は様々に解釈されるが、コミュニケーションするオブジェクトは、プロセスやアクターとしての性格が強くなる。(3)の記憶は簡単に言うとフィールドやプロパティや属性であるが、オブジェクトの振る舞いを制約するための私的環境を示唆している。(4)は、クラスもまたメタクラスのインスタンス化であるという再帰構成を示唆している。(5)の振る舞いは簡単に言うとメソッドであるが、LISPのフォームリストに似たオブジェクトとして保持されることを示唆している。(6)は、式内のオブジェクトはその時の並べられた順序によって、いずれもがコントローラ(関数式)になり、いずれもがそれへのメッセージ(引数)になることを示唆している。
2000年代の言及
[編集]2003年にアラン・ケイはオブジェクト指向の貢献でチューリング賞を受賞し、知人から改めてオブジェクト指向の意味を尋ねられたケイは以下のようにメール返信している[5]。このメールは60年代末からの構想をさり気なく簡潔にまとめたものとしてしばしば引用される。ここでは文章順に各要点を抜粋していく。
I thought of objects being like biological cells and/or individual computers on a network, only able to communicate with messages.
(さながら生物の細胞、もしくはネットワーク上の銘々のコンピュータ、それらはただメッセージによってコミュニケーションする存在、僕はオブジェクトをそう考えている)
上記はケイ本来のオブジェクトの在り方を述べたものであり、特に解説はしない。
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は驚くべきHWアーキテクチャでほとんど実現していた。僕は気付いた。細胞/全体コンピュータメタファはデータを除去できるであろうと、)
ここでプログラムからデータを取り除きたいという考えが提示されている。
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.
(僕の数学専攻経験がこれを気付かせた。各オブジェクトは幾つかの関連付けられた代数を持ち、またその系統群もあるかもしれない。それらは大変有用になるだろうと)
ここでの代数は、プロセス代数か、プログラミングに適用した代数的構造とも解釈できる。
OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.
(僕にとってのOOPとは、メッセージング、ステートプロセスの局所保持かつ保護かつ隠蔽、徹底的な遅延バインディング、これだけの意味だった)
メッセージングは造語に近く、メッセージパッシングに類似の概念であり、ただのリモートプロシージャコールとは異なることが明言されている。ステートプロセスは、データとコードの一元化概念であり、これも造語である。遅延バインディングは、シンボルと実体の結合をランタイムで決定する概念である。
One of the things I should have mentioned is that there were two main paths that were catalysed by Simula. The early one (just by accident) was the bio/net non-data-procedure route that I took. The other one, which came a little later as an object of study was abstract data types, and this got much more play.
(僕が触れるべきだった一つは、Simulaを触媒にした二本の道があったということだ。最初の一本はバイオ/ネットな非データ手順で僕が選んだ方。少し遅れたもう一本は抽象データ型でこっちの方がずっと賑わっている)
ここで抽象データ型に対しての、非データ手順(non-data-procedure)というワードが登場する。振る舞いを通してデータを扱うというデータ抽象の概念を、更に抽象化したものが非データであり、代数学で言う写像だけでデータを表現するという概念を指している。これにケイの生物学専攻を背景にしたバイオ/ネット(bio/net)なる考えが加えられている。
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.
(ユタでの専攻知識で僕が解決した最初期の問題はメソッドとオブジェクトのみを用いてのデータの消滅だった。1960年代末にBob Balzerはデータレス・プログラミングというものを書き示した。直後の1970年にJohn Reynoldsはラムダ式を用いての手順によるデータ抽象化の方法を書き示した)
非データ手順(non-data-procedure)に関連付けられるものとしては、代数的構造、圏論の射や関手の構造、Futuresとpromises、ポイントフリースタイル、プロセス代数、アクターモデル、自由モナドなどが挙げられる。
The people who liked objects as non-data were smaller in number,
(非データとしてのオブジェクトを好む者は少なかった、)
ここで歴史に戻る。1970年前後になるとソフトウェア危機としても語られるプログラム規模拡大に対応するために、サブルーチンとデータをまとめたプログラムモジュールという機能が登場した。それと同時期の1967年にオルヨハン・ダールらはクラスという機能を備えたSimula67を開発し、1969年からエドガー・ダイクストラは抽象データ構造という概念を備えた構造化プログラミングを提唱した。1974年からIBM社中心の研究者たちが構造化分析/設計と総称される技法を発表し、構造化プログラミングはこちらに取って代わられた。1972年からアラン・ケイはメッセージングという概念を備えたオブジェクト指向を誕生させている。オブジェクト指向は後にクラス・パラダイムにマウントされている。
構造化設計は、サブルーチン複合体とデータ構造を扱っている具象データ(concrete data)技術である。Simula発のクラスとダイクストラ発の抽象データ構造は、プログラムモジュールにカプセル化・継承・多態性を備えて抽象体として扱おうとする抽象データ(abstract data)技術である。そしてアラン・ケイ本来のオブジェクトとは、プログラムモジュールを生物学と代数学の観点から再解釈した非データ(non data)技術であった。構造化開発は1980年代までの主流であり、続けてオブジェクト指向が主流になったが、現在においてもクラスをただのデータとメソッドの複合体として扱っているようなオブジェクト指向は、構造化開発と大差ないものになり「具象データ」から「抽象データ」への思考転換の難しさを物語っている。モジュールの抽象化が提唱され始めたのは1970年代であったが、同時期にアラン・ケイは「抽象データ」を更に抽象化した「非データ」を構想していた。
2020年の言及
[編集]Q&AサイトのQuoraで「1966~67年のオブジェクト指向という造語を発したアラン・ケイに誰かが影響を与えていたのか?」という質問に対して本人がこう回答している。なお、強調されている“rotation”は「The Early History of Smalltalk」などにその経緯が記された1966年頃の彼自身による“オブジェクト”の、特にソフトウエアの基本構成単位としての発見(念のため、この時点ではSimulaはまだ「オブジェクト」ではなく後述のように相当するエンティティを「プロセス」という用語で表現していた)とその後の彼の中での発想の大転換を意味する。
In the 1960s, software composites that were more complex than arrays, were often called “objects”, and all the schemes I had seen involved structures that included attached procedures. A month or so after the “rotation” someone asked me what I was doing, and I foolishly said “object-oriented programming”.
(60年代、配列より複雑なソフトウェア構成体はしばしばオブジェクトと呼ばれており、僕のスキームにあった手続き付きの構造体もそうだった。私の中での“発想の転換”が起こった後、今何をしているのかと尋ねられた僕は愚かにもこう言った。オブジェクト指向プログラミングと。)
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?
(愚かしいこのオブジェクトは僕の考えを表現するのにとても悪い言葉だった。不活性的でデータを過剰に意識させたからだ。Simulaはプロセスと呼んでいた。こっちがよかったな。プロセス指向プログラミングの方がずっと良かったと思わないかい?)
脚注
[編集]出典
- ^ a b “The Early History Of Smalltalk”. 2019年1月閲覧。
- ^ How Object-Oriented Programming Started
- ^ “OO History: Simula and Smalltalk”. 2019年2月閲覧。
- ^ “User Interface A Personal View”. 2020年1月閲覧。
- ^ “Dr. Alan Kay on the Meaning of “Object-Oriented Programming””. 2019年1月閲覧。