オブジェクト指向言語

オブジェクト指向プログラミング

'''オブジェクト指向プログラミング''' ('''OOP'''、) とは相互に'''メッセージ''' () を送りあう'''オブジェクト''' () の集まりとしてプログラムを構成する技法である。この技法をサポートするプログラミング言語は'''オブジェクト指向プログラミング言語''' () と呼ばれる。オブジェクト指向プログラミングには必ずしもオブジェクト指向プログラミング言語を用いる必要は無いが、オブジェクト指向プログラミング言語の備えるクラスとその継承などの仕組みを利用するほうが格段に開発効率は向上する。
次のエントリ[ 特徴 ]
【動画】プログラミング言語 Go:Google DevFest 2010 Japan
プログラミング言語 Go:Google DevFest 2010 Japan
Google DevFest 2010 Japan セッション:プログラミング言語 Go スピーカ:鵜飼 文敏Google は 2009 年 11 月 10 日、プログラミング言語 Go をオープンソースで公開しました。Python のような動的言語での開発スピードをもちながら、C や C++ のようなコンパイル言語の性能を持っています。コンパイル速度は非常に速...

特徴

オブジェクト指向プログラミングとは、オブジェクトと呼ばれる機能の部品でソフトウェアを構成させるものであり、一般的に以下の機能や特徴を活用したプログラミング技法のことをいう。

  • カプセル化 (振る舞いの隠蔽とデータ隠蔽)

  • インヘリタンス (継承) -- クラスベースの言語

  • ポリモフィズム (多態性多相性) -- 型付きの言語

  • ダイナミックバインディング (動的束縛) -- インタープリタの言語


  • この機能を文法的にサポートしたプログラミング言語は、オブジェクト指向プログラミング言語 ('''OOPL'''; object-oriented programming language) と呼ばれる。

    ただし、カプセル化(可視性の定義)やポリモフィズムとダイナミックバインディングはオブジェクト指向言語に固有の概念というわけではなく、非オブジェクト指向言語の中にもこの性質を備えるものもある。
    次のエントリ[ 背景 ]
    【動画】Google Developer Day 2010 Japan : プログラミング言語 Go
    Google Developer Day 2010 Japan : プログラミング言語 Go
    Google Developer Day 2010 Japan セッション:プログラミング言語 Go スピーカー: 鵜飼 文敏プログラミング言語 Go は Google が 2009 年秋にオープンソースで公開した新しいプログラミング言語です。C や C++ のようなコンパイル言語の良さをもちつつ、Python のような動的言語でのプログラムの書き易さを兼ねそなえた...

    背景

    オブジェクト指向プログラミングという考え方が生まれた背景には、計算機の性能向上によって従来より大規模なソフトウェアが書かれるようになってきたということが挙げられる。大規模なソフトウェアが書かれコードも複雑化してゆくにつれ、ソフトウェア開発コストが上昇し、1960年代には「ソフトウェア危機 ()」といったようなことも危惧されるようになってきた。そこでソフトウェアの再利用部品化といったようなことを意識した仕組みの開発や、ソフトウェア開発工程の体系化('''ソフトウェア工学''' () の誕生)などが行われるようになった。

    このような流れの中で、プログラムを構成するコードとデータのうちコードについては手続き関数といった仕組みを基礎に整理され、その構成単位をブラックボックス とすることで再利用性を向上し、部品化を推進する仕組みが提唱され'''構造化プログラミング''' () として1967年エドガー・ダイクストラ () らによってまとめあげられた(プログラミング言語の例としてはPascal 1971年)。しかしデータについては相変わらず主記憶上の記憶場所に置かれている限られた種類の基本データ型の値という比較的低レベルの抽象化から抜け出せなかった。これはコードはそれ自身で意味的なまとまりを持つがデータはそれを処理するコードと組み合わせないと十分に意味が表現できないという性質があるためであった。

    そこでデータを構造化し、ブラックボックス化するために考え出されたのが、データ形式の定義とそれを処理する手続きや関数をまとめて一個の構成単位とするという考え方で'''モジュール''' () と呼ばれる概念である(プログラミング言語の例としてはModula-2 1979年)。しかし定義とプログラム内の実体が一対一に対応する手続きや関数とは異なり、データはその形式の定義に対して値となる実体(インスタンスと呼ばれる)が複数存在し、各々様々な寿命を持つのが通例であるため、そのような複数の実体をうまく管理する枠組みも必要であることがわかってきた。そこで単なるモジュールではなく、それらのインスタンスを整理して管理する仕組み(例えばクラスとその継承など)まで考慮して生まれたのがオブジェクトという概念である(プログラミング言語の例としてはSimula 1962年)

    Simulaのオブジェクトとクラスというアイデアは異なる二つの概念に継承される。一つはシステム全てをオブジェクトの集合と捉え、オブジェクトの相互作用を'''メッセージ'''に喩えた「オブジェクト指向」である。オブジェクト間の相互作用をメッセージの送受と捉えることで、オブジェクトは受信したメッセージに見合った手続き単位(≒関数)を自身で起動すると考える。結果オブジェクトは自身の持つ手続きのカプセル化を行うことができ、メッセージが同じでもレシーバオブジェクトによって行われる手続きは異なる――多相性 (ポリモーフィズム) を実現した(このメッセージを受け実行される手続き単位は、メッセージで依頼されたことを行うための「手法」の意味でメソッドと呼ばれる)。この思想に基づき作られたのがSmalltalk1972年)であり、オブジェクト指向という言葉はこのとき作られた。

    一方、Smalltalkとは別にSimulaの影響を受け作られたC++1979年)は抽象データ型のスーパーセットとしてのクラス、オブジェクトに注目し、オブジェクト指向をカプセル化、継承、多相性をサポートするものと再定義した(その際、実行時速度重視及びコンパイラ設計上の制約により、変数メタファである動的束縛の特徴は除外された)。これらは当初抽象データ型派生仮想関数と呼ばれ、オブジェクトのメンバ関数を実体ではなくポインタとすることで、継承関係にあるクラスのメンバ関数のオーバーライド(上書き)を可能にしたことで、多相性を実現した(この流儀では'''メッセージメタファ'''はオブジェクト指向に必須ではないものと定義し、オブジェクトの持つ手続きをメソッドとは呼ばずメンバ関数と呼ぶ)。この他、Smalltalkにある動的束縛の類似的な機能としてオーバーロード(多重定義)が実装されている。

    Smalltalkはこの「全てをオブジェクトとその相互作用で表現する」というデザインに立ち設計されたため、全てをファイルと捉える'''ファイル指向オペレーティングシステム'''からの脱却と、プログラムをフロー制御された手続きと捉える'''手続き型言語'''からの脱却が行われた。そのためSmalltalkは自身が'''オブジェクト指向オペレーティングシステム'''でもあること、メッセージ式のみで構成される文法などの特徴を持った。これは当時のプログラム言語としては特異的であり、ガベージコレクタを必要としインタプリタ形式で実行される処理の重さも手伝って先進的ではありながら普及しがたいものであると捉えられた。また、メッセージでの多相性は、変数へのオブジェクトの動的束縛が前提となるため、静的型チェックが必要な実行時性能重視のコンパイラ言語にとって、実装から除外すべき特徴となった。

    C++の創始者は、Smalltalkのような論理美の追求よりも、現用としての実用性を重視した。そのため、C++の再定義した「オブジェクト指向」はこれらの問題を全てクリアにし、既存言語の拡張としてオブジェクト指向機能を実装できることでブレイクスルーを迎え急速に普及する。これにより'''メッセージ送信'''という考え方はやや軽視されるようになり、オブジェクト指向とはC++の再定義したものと広く認知されるようになった。

    1980年代後半に次々と生まれたオブジェクト指向分析・設計論は、Smalltalkを源流とするオブジェクト指向を基に組み立てられた。このときSmalltalkは健在であったが広く普及しているとは言えずC++実装する機会が多かったが、C++はSmalltalkとは思想的にやや異なることと、C++がマルチパラダイム言語として設計されたことに起因する文法の複雑さが問題とされた。このニーズを受けC++の提示した現実解と、Smalltalk的理想論を融合するものとして、文法面ではシンプル化しながらも強くC++の影響を受けつつ、一方で用語や思想面でSmalltalk色を濃くしたJava1991年)が作られた。バランス感覚に長けたJavaの登場によってオブジェクト指向開発に必要な要素が全てそろい、1990年代後半からオブジェクト指向は広く普及するようになった。

    2007年現在、今後のオブジェクト指向プログラミングの流れとしてオブジェクト指向を補完するエージェント指向アスペクト指向といった方法論や、RubyPythonGroovyといった動的言語 () の
    認知度が上がり、普及への萌芽が見られる。
    次のエントリ[ オブジェクト指向プログラミング言語一覧 ]
    【動画】『カジノゲームシステム』の開発
    『カジノゲームシステム』の開発
    【中央情報経理専門学校高崎校】SEゼミ卒業研究作品オブジェクト指向言語の代表格であるJavaを用いて、仮想世界でミニゲームを体験するソフトを開発しました。 (平成21年度SEゼミ卒業研究:Eグループ)
    【動画】☆ Sakura is introduced in 5 languages! ☆
    ☆ Sakura is introduced in 5 languages! ☆
    こんにちはみんな!私はこのビデオでは5つの言語を話すよ^ ^英語、日本語、スペイン語、マンダリン語、ポルトガル語*オブジェクト指向* 希望をお楽しみください! ;]

    オブジェクト指向プログラミング言語一覧

    オブジェクト指向プログラミングをサポートする機能を備える代表的なプログラミング言語オブジェクト指向プログラミング言語)としては以下のようなものが挙げられる:

    Simula 1962年
      オブジェクトクラスを導入した最初の言語。またC++が再定義したオブジェクト指向プログラミング言語の要件を満たすことから、最初のオブジェクト指向プログラミング言語とされることもある。クラスベース。当初はシミュレーション記述用で後に汎用化。
    Smalltalk 1972年
      オブジェクト間の相互作用に'''メッセージ'''というメタファを導入した最初の言語。オブジェクト指向と言う言葉はSmalltalkのプログラミングスタイルを説明するために作られた。動的な型付けにより高い柔軟性を持つ。
    C++ 1979年
      C言語のオブジェクト指向拡張、Simula言語風にクラスを定義でき、C言語の型システムを強化している。当初はC言語に対して上位互換であった他、強い型付けによりC言語譲りの実行効率の高いコードが生成できる。
    Objective-C 1983年
      C言語のオブジェクト指向拡張。C言語のコードとSmalltalk型のオブジェクトシステムを混在させたもの。オブジェクトシステム自体はCで書かれたランタイム。
    Eiffel 1986年
      強い型付けを行う型システム表明など堅牢性を強く意識して設計されたオブジェクト指向プログラミング言語。C++にテンプレートが導入される前に総称型を導入していた。
    Self 1987年
      最初のインスタンスベースオブジェクト指向プログラミング言語。
    CLOS 1988年
      関数型言語Common Lispのオブジェクト指向仕様。
    Modula-3 1988年
      モジュールを実現していたModula-2言語のオブジェクト指向拡張。
    Python 1990年
      最初のオブジェクト指向スクリプト言語
    Sather 1990年
      Eiffelを拡張したもの。実行効率面での工夫が見られる。
    NewtonScript 1993年
      PDA環境用に修正されたSelf言語。PDAの性質を生かすため永続オブジェクトをサポートしている。
    Ruby 1993年
      オブジェクト指向スクリプト言語。クラスのMix-inなどのユニークな機能を持つほか、正規表現に渡るまで全てがクラスとして実装されていることが特徴。
    Perl 1994年
      Perl 5.0にてオブジェクト指向に対応。既存のPerl言語に後付けで拡張されたため記法は特殊だが、機能面では他のオブジェクト指向言語に引けを取らない。
    Adaのオブジェクト指向拡張 1995年
      恐らく最も仕様が複雑なオブジェクト指向プログラミング言語。
    Java 1995年
      仮想マシンJava仮想マシン)上で動作することによる高い可搬性リフレクションスレッドの標準サポートと充実したライブラリ群に定評があり、人気のあるオブジェクト指向プログラミング言語。
    Object Pascal (Delphi) 1995年
      Pascal言語のオブジェクト指向拡張。
    JavaScript 1996年
      ウェブページ上で実行することを主目的に開発されたスクリプト言語。プロトタイプベースの言語である。
    OCaml 1996年
      関数型言語MLのオブジェクト指向拡張。クラス型推論機構に組み込まれているという特徴がある。
    C 2000年
      Javaとよく似た作りでJavaと同じく仮想マシン上で動作するが細かく色々と拡張されている。.NET Framework上で動く。
    COBOL 2002年
      2002年に制定された国際規格に、オブジェクト指向機能が採用された。1994年には、国際規格案を先取りした商用コンパイラ上で利用可能になった。オブジェクト指向構文を使わないCOBOLプログラムと混在できる。

    これらは次の2つに分類できる。
    ● ハイブリッド型オブジェクト指向プログラミング言語 ()
      非オブジェクト指向プログラミング言語にオブジェクト指向機能を拡張したもの。Simula、C++およびObjective-C、CLOS、Object Pascal、COBOLなど。(Objective-CやCLOSはオブジェクト指向部分そのものは純粋。C++などは既存文法の拡張に当たる)。
    ● 純粋なオブジェクト指向プログラミング言語 ()
      当初からオブジェクト指向プログラミング言語として設計されたもの。Smalltalk、Eiffel、Self、Java、Rubyなど。

    これらの言語では、クラスの定義、インスタンスの生成、オブジェクト間の通信を構文または専用の関数などでサポートしている。

    オブジェクト指向プログラミング言語では継承の利用とあいまってオブジェクトへの参照ポインタが多用される関係で、オブジェクトのメモリへの割り当てのため自動ガベージコレクション機能を備えているものが多い。しかしすべての言語が備えているわけではない。例えば、C++はガベージコレクションを備えていない。

    また、言語ではないがGObjectというC言語をオブジェクト指向に拡張するライブラリがあり、これを使用すればC言語でもオブジェクト指向プログラミングが可能である。
    次のエントリ[ オブジェクト指向の応用 ]

    オブジェクト指向の応用

    オブジェクト指向は従来の技法と比べよりプログラムを抽象的に扱える性質を持つことから、システムや機能、大まかなデータなどを扱う抽象的な上流設計にも応用されるようになった。
    結果、抽象的なオブジェクト指向の応用例として以下の技法やノウハウが生まれた。
  • 情報処理システム全体の設計からオブジェクトを意識する'''オブジェクト指向設計''' ()

  • システムが対象とする業務のモデリング技法としての'''オブジェクト指向モデリング''' ()

  • 顧客の要求から、オブジェクト指向のモデルを見出す方法として'''オブジェクト指向分析''' () と呼ばれる各種の技法(例:OMT, UML


  • 現在ではオブジェクト指向という言葉は、これらオブジェクトを中心とした枠組みを用いる総称として使われており、プログラミング技法としてのオブジェクト指向は'''オブジェクト指向プログラミング'''という名で区別されるようになっている。
    次のエントリ[ オブジェクト指向プログラミング言語の仕組み ]

    出典:フリー百科事典『ウィキペディア(Wikipedia)』

    別のワードで検索!
    まずは検索→

    トレンドマガジン [マグゥ]でオブジェクト指向言語を検索
    オブジェクト指向言語

    オブジェクト指向言語
    といえば…

    オブジェクト指向言語の記事

    書籍『実践 F# 関数型プログラミング入門』を書きました【IT求人情報】システムプロジェクトメンバー(リーダー候補)/社名非公開(【関東】東京都 港区(東京 都 世田谷 区 の 評判 山本クリニックの毎日の日記帳平成23年2月15日(火曜日)Ruby基本文法講座 複数バージョンのScala開発をサポートするインストーラー/バージョン切り替え「svm」
    人気の話題TOP10

    [2012/2/16 14:19更新]
    1時間前:圏外(568pt)
    1時間前:圏外(488pt)
    1時間前:圏外(479pt)
    1時間前:2位(478pt)
    1時間前:圏外(456pt)
    1時間前:圏外(440pt)
    1時間前:32位(376pt)
    1時間前:31位(373pt)
    1時間前:圏外(371pt)
    1時間前:20位(357pt)
    続きはこちら
    >>
    ▼おすすめキーワード▼
    ▼人気の話題ランキング▼