「オブジェクト指向プログラミング」の版間の差分

削除された内容 追加された内容
編集の要約なし
(同じ利用者による、間の8版が非表示)
9行目:
'''オブジェクト指向プログラミング'''(オブジェクトしこうプログラミング、{{Lang-en-short|object-oriented programming}}; OOP)は、[[オブジェクト指向]]の[[プログラミングパラダイム|考え方]]<ref>コンピュータ・プログラミングのパラダイムについては『新しいプログラミング・パラダイム』などを参照: http://www.kyoritsu-pub.co.jp/bookdetail/9784320024939</ref>を取り入れた[[プログラミング (コンピュータ)|コンピュータ・プログラミング]]技法である。プログラムを「[[オブジェクト (プログラミング)|オブジェクト]]」の集合体として構築し、オブジェクトはデータ(状態)を主とし、コード(動作)を従として構成され、無数のオブジェクトが相互に作用し合うようにして任意の処理が実行される。オブジェクトとは対象物を意味し、CPU演算処理(コード)が参照ないし変動の対象とするデータ全般と考える事が出来る。「どの様にデータを扱うか」ではなく「データがどの様に扱われるか」を念頭に置いてプログラムを組み立てる手法がOOPという事になる。
 
オブジェクト指向プログラミングは、ソフトウェアの大規模化に伴い、より効率的な開発手法が模索される中で1960年代から70年代に考案かけて確立された。OOP言語は歴史的にクラス構造を中心とする[[Simula]]系統と、メッセージ機能を主体とする[[Smalltalk]]系統に分けられるが、後に[[C++]]や[[Java]]などの言語の派生元となった前者が主流となった。この前者のオブジェクト指向が示す「[[カプセル化]]」「[[継承 (プログラミング)|継承]]」「[[ポリモーフィズム|多態性]]」の三大機能を備えていれば、OOP言語であると見なされる。
 
== 機能 ==
OOP環境の主な機能は以下の通りである。
 
* [[カプセル化]] (''encapsulation'') - 情報隠蔽を含む
* [[継承 (プログラミング)|継承]] (''inheritance'')
* [[ポリモーフィズム|多態性]] (''polymorphism'')
** [[多重定義]] (''overloading'') - <small>演算子オーバーローディングも含む</small>
** {{仮リンク|パラメータ多相|en|Parametric polymorphism}} (''parametric polymorphism'') - <small>[[ジェネリックプログラミング]]</small>
**[[派生型|派生型付け]] (''subtyping'') - <small>動的なもののみ</small>
** [[メソッド (計算機科学)|仮想関数 / 仮想メソッド]] (virtual function / virtual method)
**[[仮想関数]] (''virtual function'')
** [[多重ディスパッチ]] (multiple dispatch)
**[[多重ディスパッチ]] (''multiple dispatch'')
* [[メッセージ (コンピュータ)|メッセージパッシング]] (''message passing'')
 
; カプセル化
31 ⟶ 32行目:
また、プログラム内の膨大な数のデータは通常グループ化(構造体)されて扱われていたが、各構造体間にまたがる共通のデータ集合が多数出現し、その冗長性と整合の頻雑さの問題が浮き彫りとなっていた。これを解決する為にOOPは、構造体=オブジェクトを複数の'''階層要素'''に分け、共通のデータ集合を親階層とし、派生する子階層に親階層の参照アドレスを持たせて連結する構造とした。A階層から成る親オブジェクトから派生した子オブジェクトはA+B階層として構成され、これが'''継承'''と呼ばれた。コードから参照されたデータがB階層に無い時は、次のA階層に有るか探す仕組みとなり、この連鎖によって傍からは一つのオブジェクトとして存在した。なお、派生クラスで任意のデータとメソッドを追加出来る継承の機能は、同時にコードの再利用性を高めるとも見なされたが、深い継承がもたらす構成把握の難化がネックとなってほぼ否定されるに到った。{{いつ範囲|date=2019年2月|現在}}では深い継承は回避される様になり、代わりに共通メソッド呼出テーブル(Javaのinterfaceなど)を実装させる横に長い継承が主流となっている。また、Simula系統のOOP言語では多態性を実現する為の重要な手段として用いられている。
 
; 多態性(ポリモーフィズム)
 
様々なオブジェクトタイプ(型)が扱われるソースコード記述の頻雑性を回避する為に、呼出引数の型に応じたメソッドをコンパイル時に選択する'''多重定義'''と、型引数に応じたクラスorメソッドをコンパイル時に生成する'''パラメータ多相'''の機能が備えられた。これらは'''静的な多態性''' (static polymorphism) '')とも呼ばれる。'''動的な多態性''' (dynamic polymorphism) '')としては、特定の場面で扱われるオブジェクト群が共通して持つ階層要素の部分で一括りにして順次処理を行い、条件分岐をより柔軟かつ簡素にする目的で、特定の階層のコードの存在を抽象化して呼び出しポイントとし、オブジェクト共通の階層要素が持つ呼び出しポイントから、それぞれ異なる派生先階層の実装コードを呼び出すという'''仮想関数'''の仕組みが実装された。また、オブジェクトが特定の階層要素を持つかチェックした上でその階層に準じた動的な'''派生変化付け'''を行い、その型変化させたオブジェクトを引数にした多重定義と仮想関数呼び出しの併せ技である'''多重ディスパッチ'''の機能も編み出され、データがコードを制御するというOOPの理念は明確に表現された。
 
; メッセージパッシング
57 ⟶ 58行目:
 
== OOP言語一覧 ==
オブジェクト指向プログラミング総体的または部分的にサポートする機能仕様を備える代表的な[[プログラミング言語]]([[の公開は、1980年代後半から顕著となった。オブジェクト指向プログラミング言語のスタイルは、[[クラス (コンピュータ)|クラス仕様]]を中心しては以下する'''Simula系統'''と、[[メッセージパッシング|メッセージ仕様]]を主体とする'''Smalltalk系統'''よう二通りに分けられる。前者には「C++」「Java」「C#」ものどが、後者には「Smalltalk」「Objective-C」「Swift」などが挙げられる
 
オブジェクト指向プログラミング言語の形態には、オブジェクト指向と他の[[プログラミングパラダイム|パラダイム]]が同居している'''ハイブリッドOOP'''と、オブジェクト指向に基づくコードプロセスだけが許容される'''ピュアOOP'''の双方が存在する。前者には「C++」「Objective-C」「Java」「C#」などが、後者には「Smalltalk」「Eiffel」「Self」「Swift」などがある。言語仕様の中でオブジェクト指向の存在感が比較的高い代表的なプログラミング言語を以下に列挙する。
; [[Simula]] [[1962年]]
 
: [[オブジェクト (プログラミング)|オブジェクト]]と[[クラス (コンピュータ)|クラス]]を導入した最初の言語。また、C++が再定義したオブジェクト指向プログラミング言語の要件を満たすことから、最初のオブジェクト指向プログラミング言語とされることもある。[[クラスベース]]。当初はシミュレーション記述用に開発されたものであったが、後に汎用化された。
<big>形成期(1967~1984)</big>
; [[Smalltalk]] [[1972年]]
 
: オブジェクト間の相互作用に'''メッセージ'''という機構を導入した最初の言語。オブジェクト指向と言う言葉は、Smalltalkのプログラミングスタイルを説明するために作られた。[[動的な型付け]]により高い柔軟性を持つ。
[[Simula|'''Simula 67''']] 1967年
; [[C++]] [[1979年]]
: 1962年に公開された[[Simula]]の後継版であり、[[クラス (コンピュータ)|クラス仕様]]を導入した最初の言語。現実世界の擬似モデルを観測するシミュレーション・プログラム記述用に開発され、後に汎用化された。C++、Java、C♯に代表される'''クラス主体OOP'''のルーツとされる。
: [[C言語]]のオブジェクト指向拡張。Simula言語風にクラスを定義でき、C言語の型システムを強化している。当初はC言語に対して上位互換であった。また、[[強い型付け]]によりC言語譲りの実行効率の高いコードが生成できる。
 
; [[Objective-C]] [[1983年]]
'''[[Smalltalk]]''' 1980年
: C言語のオブジェクト指向拡張。C言語のコードとSmalltalk型のオブジェクトシステムを混在させたもの。オブジェクトシステム自体はCで書かれたランタイム。
: オブジェクト間の相互作用を担う[[メッセージパッシング|メッセージ仕様]]を導入した最初の言語。オブジェクト指向という言葉は、Smalltalk開発者がその言語仕様を説明する中で生み出された。'''メッセージ主体OOP'''の元祖であり、高度に柔軟なオブジェクトの連携動作を表現できた。また、後に仮想マシンと呼ばれる専用のランタイム環境も用意された。
; [[Eiffel]] [[1986年]]
 
: [[強い型付け]]を行う[[型システム]]や[[表明]]など堅牢性を強く意識して設計されたオブジェクト指向プログラミング言語。C++に[[テンプレート (プログラミング)|テンプレート]]が導入される前に[[総称型]]を導入していた。
; '''[[SelfC++]]''' [[19871983]]
: [[C言語]]にクラス主体OOPに基づく言語仕様を追加したもの。クラス仕様によってカプセル化、継承、多態性を表現している。また[[ジェネリックプログラミング|ジェネリック]]に相当する[[テンプレート (プログラミング)|テンプレート機能]]も備えていた。元がC言語である為、OOPから逸脱した原始的コーディングも多用できる点が物議を醸したが、その是非はプログラマ次第であるという結論に落ち着いた。
: 最初の[[プロトタイプベース|インスタンスベース]]のオブジェクト指向プログラミング言語。
 
; [[CLOS]] [[1988年]]
'''[[Objective-C]]''' 1984年
: [[関数型言語]][[Common Lisp]]のオブジェクト指向仕様。
:[[C言語]]にメッセージ主体OOPに基づく言語仕様を追加したもの。メッセージ仕様が注目を集めた。OOP言語的には前述のC++よりも正統であると見なされた。他のプログラミング・パラダイムも共存しており、Smalltalkよりもコーディングし易くなった。
; [[Modula-3]] [[1988年]]
 
: モジュールを実現していた[[Modula-2]]言語のオブジェクト指向拡張。
<big>派生期(1985~1994)</big>
; [[Python]] [[1990年]]
 
: 最初のオブジェクト指向[[スクリプト言語]]。
[[Object Pascal|'''Object Pascal''']] 1986年
; [[Sather]] [[1990年]]
:[[Pascal]]にクラス主体OOPに基づく言語仕様を追加したもの。
: Eiffelを拡張したもの。実行効率面での工夫が見られる。
 
; [[NewtonScript]] [[1993年]]
'''[[Eiffel]]''' 1986年
: [[携帯情報端末|PDA]]環境用に修正されたSelf言語。PDAの性質を生かすため[[永続オブジェクト]]をサポートしている。
:[[Pascal]]をベースにしてクラス主体OOPに基づく言語仕様と[[ジェネリックプログラミング|ジェネリック]]のパラダイムを追加した。型付けは静的に限られ、単純な数値もオブジェクトとして扱えるようにし、非参照データを自動解放する[[ガーベジコレクション]]を備え、多重継承時の問題を回避する仕組みや、共有コード実行時のタイミング同一性を保証するなど、より高い堅牢性を目指した仕様も盛り込まれている。これらは後のJavaやC♯の手本となった。
; [[Ruby]] [[1993年]]
 
: オブジェクト指向スクリプト言語。クラスのMix-inなどのユニークな機能を持つほか、[[正規表現]]に渡るまで全てがクラスとして実装されていることが特徴。
; '''[[PerlSelf]]''' [[19941987]]
: クラス主体OOPに分類される。従来の[[クラスベース]]に対して、システムが用意したオブジェクトを継承して利用できる[[プロトタイプベース]]の仕様を初めて実装した。その場コンパイラ(just-in-time)を行う専用のランタイム環境で実行された。これは[[Java仮想マシン]]や[[.NET Framework]]の手本となった。
: Perl 5.0にてオブジェクト指向に対応。既存のPerl言語に後付けで拡張されたため記法は特殊だが、機能面では他のオブジェクト指向言語に引けを取らない。
 
; [[Ada]]のオブジェクト指向拡張 [[1995年]]
'''[[CLOS]]''' 1988年
: 恐らく最も仕様が複雑なオブジェクト指向プログラミング言語。
:[[Common Lisp]]にクラス主体OOPに基づく言語仕様を追加したもの。
; [[Java]] [[1995年]]
 
: [[仮想機械|仮想マシン]]([[Java仮想マシン]])上で動作することによる高い[[移植性|可搬性]]、[[リフレクション]]や[[スレッド (コンピュータ)|スレッド]]の標準サポートと充実した[[ライブラリ]]群で知られているオブジェクト指向プログラミング言語。
'''[[Python]]''' 1990年
; [[Object Pascal]] ([[Delphi]]) [[1995年]]
: クラス主体OOPに分類される。[[インタプリタ]]式で動作する。言語仕様を簡素化し自動メモリ管理機能を実装して扱いやすく理解しやすいOOPを目指している。後のOOPスクリプト言語の手本となった。
: [[Pascal]]言語のオブジェクト指向拡張。
 
; [[JavaScript]] [[1996年]]
'''[[Perl|Perl 5.0]]''' 1994年
: [[ウェブページ]]上で実行することを主目的に開発されたスクリプト言語。[[プロトタイプベース]]の言語である。
 
; [[OCaml]] [[1996年]]
: 従来の[[Perl]]に、クラス主体OOPに基づく簡便な言語仕様が追加された。
: 関数型言語[[プログラミング言語ML|ML]]のオブジェクト指向拡張。[[クラス (コンピュータ)|クラス]]が[[型推論]]機構に組み込まれているという特徴がある。
 
; [[PHP (プログラミング言語)|PHP]] [[2000年]]
<big>発展期(1995~2004)</big>
: 動的にWebページを生成することを主目的としたスクリプト言語。バージョン4からオブジェクト指向に対応し、バージョン5でアクセス権やインタフェースなど、オブジェクト指向の強化が行われている。
 
; [[C Sharp|C#]] [[2000年]]
'''[[Java]]''' 1995年
: Javaとよく似ており、Javaと同じく仮想マシン上で動作するが、DelphiやC++類似の言語機能も多い。[[.NET Framework]]上で動く。
:最も高い知名度を誇るOOP言語。クラス仕様主体であり、メッセージ仕様も部分的に導入されている。ここでの詳細は割愛する。
; [[Microsoft Visual Basic .NET|Visual Basic.NET]] [[2002年]]
 
: 既存のVisual Basic(6.0以前)を大きく改訂してオブジェクト指向に対応。C#同様[[.NET Framework]]上で動く。
; '''[[COBOLDelphi]]''' [[20021995]]
:[[Object Pascal]]の最も普及した商用版。
: 2002年に制定された国際規格に、オブジェクト指向機能が採用された。1994年には、国際規格案を先取りした商用コンパイラ上で利用可能になった。オブジェクト指向構文を使わないCOBOLプログラムと混在できる。
; [[CeylonAda|'''Ada 95''']] [[20111995]]
:[[Ada]]にクラス主体OOPに基づく言語仕様が追加された。
: Java をもとにつくられ、Java のもつ長所と短所を考慮しつつ、商用言語として再設計された言語。
 
; [[Swift (プログラミング言語)|Swift]] [[2014年]]
'''[[Ruby]]''' 1995年
: [[Objective-C]]のオブジェクトを引き継ぎながらも、ベースのC言語を取り除いて新しく再設計された言語。
: クラス主体OOPに分類されるスクリプト言語である。[[インタプリタ]]式で動作する。[[ソフトウェアコンポーネント]]による開発の効率化を目指した[[Mixin]]を特徴とする。スクリプトでありながら、マルチスレッド、ガーベジコレクタ、例外処理など利便性の高い機能も備えている。
また、以下のような分類もある。
 
; ハイブリッド型オブジェクト指向プログラミング言語 ({{Lang|en|hybrid object-oriented language}})
'''[[JavaScript]]''' 1996年
: 「ハイブリッド」という用語をどう定義するかによるが、たとえば「手続き型や関数型などの既存の他のパラダイムを主とした言語に、オブジェクト指向機能を拡張した」という言語を「ハイブリッドだ」、と言う者もいれば、「当初からオブジェクト指向を含む、複数のパラダイムを指向する言語として設計された」という言語を「ハイブリッドだ」と言う者もいる。例としては、以上のどちらの基準か、それとも別の定義によるものかは知らないが、OCaml、C++およびObjective-C、CLOS、Object Pascal、object-oriented COBOLなどを挙げる者がいる。
:[[ウェブアプリケーション]]開発を主な目的とするOOPスクリプト言語。クラス主体OOPに分類され、クラスベースだけでなく、[[プロトタイプベース]]のオブジェクトも扱えるようにして開発の効率化を図っている。後者は[[ソフトウェアコンポーネント]]の活用を促進させた。
; 純粋なオブジェクト指向プログラミング言語 ({{Lang|en|pure object-oriented language}})
[[PHP (プログラミング言語)|'''PHP 4''']] 2000年
: 「純粋」という用語をどう定義するかによるが、たとえば[[Smalltalk]]や[[Ruby]]のように「あらゆる対象がオブジェクトである」という言語(たとえば、Rubyではnilも、ヌルポインタのようなものではなく、NilClassのインスタンスというオブジェクトである。この場合対照例としては、通常の数値型などがオブジェクトでない[[Java]]であろう)を「純粋だ」と言う者もいれば、「当初からオブジェクト指向プログラミング言語として設計された」言語を「純粋だ」と言う者もいる(こちらの定義ではJavaも含まれるだろうか)。例としては、以上のどちらの基準か、それとも別の定義によるものかは知らないが、[[Smalltalk]]、[[Eiffel]]、[[Self]]、[[Ruby]]、[[Swift (プログラミング言語)|Swift]]などを挙げる者がいる。
: 従来の[[PHP (プログラミング言語)|PHP]]に、クラス主体OOPに基づく言語仕様が追加された。
[[C Sharp|'''C#''']] 2000年
:[[Java]]と並んで高い知名度を誇るOOP言語。[[.NET Framework]]上で実行される。クラス仕様主体であり、メッセージ仕様も部分的に導入されている。ここでの詳細は割愛する。
[[Microsoft Visual Basic .NET|'''Visual Basic.NET''']] 2002年
: 従来の[[Microsoft Visual Basic|Visual Basic]]にクラス主体OOPに基づく言語仕様が追加された。[[.NET Framework]]上で実行される。
[[COBOL|'''COBOL 2002''']] 2002年
:[[COBOL]]にクラス主体OOPに基づく言語仕様が追加された。Object COBOLとも呼ばれる。
 
<big>最新系(2005~ )</big>
 
'''[[Ceylon]]''' 2011年
:[[Java]]を元に制作され、その長所と短所を見直しつつ再設計されたOOP言語。Javaの改造版である。また[[JavaScript]]にもコンバートできる。
[[Swift (プログラミング言語)|'''Swift''']] 2014年
:[[Objective-C]]の進化版。メッセージ主体OOPに分類される。
 
== OOP言語の仕組み ==