「オブジェクト指向プログラミング」の版間の差分
削除された内容 追加された内容
編集の要約なし |
Goldensundown2 (会話 | 投稿記録) |
||
(同じ利用者による、間の8版が非表示) | |||
9行目:
'''オブジェクト指向プログラミング'''(オブジェクトしこうプログラミング、{{Lang-en-short|object-oriented programming}}; OOP)は、[[オブジェクト指向]]の[[プログラミングパラダイム|考え方]]<ref>コンピュータ・プログラミングのパラダイムについては『新しいプログラミング・パラダイム』などを参照: http://www.kyoritsu-pub.co.jp/bookdetail/9784320024939</ref>を取り入れた[[プログラミング (コンピュータ)|コンピュータ・プログラミング]]技法である。プログラムを「[[オブジェクト (プログラミング)|オブジェクト]]」の集合体として構築し、オブジェクトはデータ(状態)を主とし、コード(動作)を従として構成され、無数のオブジェクトが相互に作用し合うようにして任意の処理が実行される。オブジェクトとは対象物を意味し、CPU演算処理(コード)が参照ないし変動の対象とするデータ全般と考える事が出来る。「どの様にデータを扱うか」ではなく「データがどの様に扱われるか」を念頭に置いてプログラムを組み立てる手法がOOPという事になる。
オブジェクト指向プログラミングは、ソフトウェアの大規模化に伴い、より効率的な開発手法が模索される中で1960年代から70年代に
== 機能 ==
OOP環境の主な機能は以下の通りである。
* [[カプセル化]] (''encapsulation'')
* [[継承 (プログラミング)|継承]] (''inheritance'')
* [[ポリモーフィズム|多態性]] (''polymorphism'')
**
**
**[[派生型|派生型付け]] (''subtyping'') - <small>動的なもののみ</small>
**[[仮想関数]] (''virtual function'')
**[[多重ディスパッチ]] (''multiple dispatch'')
* [[メッセージ (コンピュータ)|メッセージパッシング]] (''message passing'') ; カプセル化
31 ⟶ 32行目:
また、プログラム内の膨大な数のデータは通常グループ化(構造体)されて扱われていたが、各構造体間にまたがる共通のデータ集合が多数出現し、その冗長性と整合の頻雑さの問題が浮き彫りとなっていた。これを解決する為にOOPは、構造体=オブジェクトを複数の'''階層要素'''に分け、共通のデータ集合を親階層とし、派生する子階層に親階層の参照アドレスを持たせて連結する構造とした。A階層から成る親オブジェクトから派生した子オブジェクトはA+B階層として構成され、これが'''継承'''と呼ばれた。コードから参照されたデータがB階層に無い時は、次のA階層に有るか探す仕組みとなり、この連鎖によって傍からは一つのオブジェクトとして存在した。なお、派生クラスで任意のデータとメソッドを追加出来る継承の機能は、同時にコードの再利用性を高めるとも見なされたが、深い継承がもたらす構成把握の難化がネックとなってほぼ否定されるに到った。{{いつ範囲|date=2019年2月|現在}}では深い継承は回避される様になり、代わりに共通メソッド呼出テーブル(Javaのinterfaceなど)を実装させる横に長い継承が主流となっている。また、Simula系統のOOP言語では多態性を実現する為の重要な手段として用いられている。
; 多態性
様々なオブジェクトタイプ(型)が扱われるソースコード記述の頻雑性を回避する為に、呼出引数の型に応じたメソッドをコンパイル時に選択する'''多重定義'''と、型引数に応じたクラスorメソッドをコンパイル時に生成する'''パラメータ多相'''の機能が備えられた。これらは
; メッセージパッシング
57 ⟶ 58行目:
== OOP言語一覧 ==
オブジェクト指向
オブジェクト指向プログラミング言語の形態には、オブジェクト指向と他の[[プログラミングパラダイム|パラダイム]]が同居している'''ハイブリッドOOP'''と、オブジェクト指向に基づくコードプロセスだけが許容される'''ピュアOOP'''の双方が存在する。前者には「C++」「Objective-C」「Java」「C#」などが、後者には「Smalltalk」「Eiffel」「Self」「Swift」などがある。言語仕様の中でオブジェクト指向の存在感が比較的高い代表的なプログラミング言語を以下に列挙する。
<big>形成期(1967~1984)</big>
[[Simula|'''Simula 67''']] 1967年
: 1962年に公開された[[Simula]]の後継版であり、[[クラス (コンピュータ)|クラス仕様]]を導入した最初の言語。現実世界の擬似モデルを観測するシミュレーション・プログラム記述用に開発され、後に汎用化された。C++、Java、C♯に代表される'''クラス主体OOP'''のルーツとされる。
'''[[Smalltalk]]''' 1980年
: オブジェクト間の相互作用を担う[[メッセージパッシング|メッセージ仕様]]を導入した最初の言語。オブジェクト指向という言葉は、Smalltalk開発者がその言語仕様を説明する中で生み出された。'''メッセージ主体OOP'''の元祖であり、高度に柔軟なオブジェクトの連携動作を表現できた。また、後に仮想マシンと呼ばれる専用のランタイム環境も用意された。
: [[C言語]]にクラス主体OOPに基づく言語仕様を追加したもの。クラス仕様によってカプセル化、継承、多態性を表現している。また[[ジェネリックプログラミング|ジェネリック]]に相当する[[テンプレート (プログラミング)|テンプレート機能]]も備えていた。元がC言語である為、OOPから逸脱した原始的コーディングも多用できる点が物議を醸したが、その是非はプログラマ次第であるという結論に落ち着いた。
'''[[Objective-C]]''' 1984年
:[[C言語]]にメッセージ主体OOPに基づく言語仕様を追加したもの。メッセージ仕様が注目を集めた。OOP言語的には前述のC++よりも正統であると見なされた。他のプログラミング・パラダイムも共存しており、Smalltalkよりもコーディングし易くなった。
<big>派生期(1985~1994)</big>
[[Object Pascal|'''Object Pascal''']] 1986年
:[[Pascal]]にクラス主体OOPに基づく言語仕様を追加したもの。
'''[[Eiffel]]''' 1986年
:[[Pascal]]をベースにしてクラス主体OOPに基づく言語仕様と[[ジェネリックプログラミング|ジェネリック]]のパラダイムを追加した。型付けは静的に限られ、単純な数値もオブジェクトとして扱えるようにし、非参照データを自動解放する[[ガーベジコレクション]]を備え、多重継承時の問題を回避する仕組みや、共有コード実行時のタイミング同一性を保証するなど、より高い堅牢性を目指した仕様も盛り込まれている。これらは後のJavaやC♯の手本となった。
: クラス主体OOPに分類される。従来の[[クラスベース]]に対して、システムが用意したオブジェクトを継承して利用できる[[プロトタイプベース]]の仕様を初めて実装した。その場コンパイラ(just-in-time)を行う専用のランタイム環境で実行された。これは[[Java仮想マシン]]や[[.NET Framework]]の手本となった。
'''[[CLOS]]''' 1988年
:[[Common Lisp]]にクラス主体OOPに基づく言語仕様を追加したもの。
'''[[Python]]''' 1990年
: クラス主体OOPに分類される。[[インタプリタ]]式で動作する。言語仕様を簡素化し自動メモリ管理機能を実装して扱いやすく理解しやすいOOPを目指している。後のOOPスクリプト言語の手本となった。
'''[[Perl|Perl 5.0]]''' 1994年
: 従来の[[Perl]]に、クラス主体OOPに基づく簡便な言語仕様が追加された。
<big>発展期(1995~2004)</big>
'''[[Java]]''' 1995年
:最も高い知名度を誇るOOP言語。クラス仕様主体であり、メッセージ仕様も部分的に導入されている。ここでの詳細は割愛する。
:[[Object Pascal]]の最も普及した商用版。
:[[Ada]]にクラス主体OOPに基づく言語仕様が追加された。
'''[[Ruby]]''' 1995年
: クラス主体OOPに分類されるスクリプト言語である。[[インタプリタ]]式で動作する。[[ソフトウェアコンポーネント]]による開発の効率化を目指した[[Mixin]]を特徴とする。スクリプトでありながら、マルチスレッド、ガーベジコレクタ、例外処理など利便性の高い機能も備えている。
'''[[JavaScript]]''' 1996年
:[[ウェブアプリケーション]]開発を主な目的とするOOPスクリプト言語。クラス主体OOPに分類され、クラスベースだけでなく、[[プロトタイプベース]]のオブジェクトも扱えるようにして開発の効率化を図っている。後者は[[ソフトウェアコンポーネント]]の活用を促進させた。
[[PHP (プログラミング言語)|'''PHP 4''']] 2000年
: 従来の[[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言語の仕組み ==
|