このキーワード
友達に教える
URLをコピー

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

この記事には複数の問題があります改善ノートページでの議論にご協力ください。

  • 出典がまったく示されていないか不十分です。内容に関する文献や情報源が必要です。(2019年2月)
  • 独自研究が含まれているおそれがあります。(2018年2月)
  • 正確性に疑問が呈されています。(2019年2月)

オブジェクト指向プログラミング(オブジェクトしこうプログラミング、: object-oriented programming、略語:OOP)は、オブジェクト指向に基づいたコンピュータプログラミング手法である。オブジェクトは概ねデータ(変数プロパティ)とコード(関数メソッド)の複合体を指す見解で一致しているが、その詳細の解釈は様々である。オブジェクト指向のプログラムはこのオブジェクトの集合として組み立てられる事になるが、その実装スタイルもまた千差万別である。

オブジェクト指向プログラミングという言葉自体は、計算機科学者アラン・ケイによって生み出されている。彼は1967年に公開されたSimula67の言語設計を見た際にobject-orientedという造語を咄嗟に口にしたとされ、その造語はケイ自身が1972年から80年にかけて開発したSmalltalkの言語設計を説明する中で初めて発信された。しかし、ケイが示したメッセージパッシングを中心にする元祖オブジェクト指向の考え方は広く認知される事はなく、オブジェクトというプログラム概念を注目させるだけに留まった。同時にケイの手から離れたオブジェクト指向は、やがて抽象データ型を中心にした解釈へと推移していく。そうした中で1983年に公開されたC++の言語設計が注目を集めた事が契機になり、日本では一般にOOPの三大要素と呼ばれているカプセル化継承多態性パラダイムが確立されている。しかし近年ではその存在感も薄れており、新たな解釈が議題に上げられつつあるが、抽象データ型を中心にする考えは変わらず受け継がれている。

特徴

現行のオブジェクト指向プログラミングは事実上、1974年にバーバラ・リスコフらが提唱した抽象データ型を基底概念にする方向性で定着している。抽象データ型のプログラム実装スタイルを具体的に規定したものが1~3であり、日本では一般に三大要素と呼ばれている。これに沿った言語仕様を備えたプログラミング言語がオブジェクト指向準拠と判別されている。4と5は、アラン・ケイが重視する元祖的なコンセプトであり、現在では部分的に受け継がれてるに過ぎないが、オブジェクト指向の源流思想として蛇足ながら紹介を加える。

  1. カプセル化(encapsulation)
  2. 継承(inheritance)
  3. 多態性(polymorphism)
  4. メッセージング(messaging)
  5. 遅延バインディング(late binding)

カプセル化

一定の関連性を持つデータ(変数、プロパティ)と、それらを操作するコード(関数、プロシージャ)をひとまとめにしてオブジェクトとし、外部に対して必要とされるデータとコードのみを公開し、その他は内部に隠蔽する仕組みがカプセル化と呼ばれる。オブジェクトが持つコードは一般に「メソッド」と呼ばれる事が多い。オブジェクトの設計はデータ構成を中心にしてそれに関連したメソッドを定義するのが基本になる。公開されたデータは外部のメソッドから直接参照ないし変更する事できる。公開されたメソッドは同様に外部のメソッドから直接呼び出す事ができる。隠蔽されたデータとメソッドは外部からアクセスできず、これは情報隠蔽と呼ばれる。

継承

既存オブジェクトのデータ構成とメソッド構成を引き継いで、新しい派生オブジェクトを定義する仕組みが継承と呼ばれる。引き継ぐ際には新たなデータとメソッドを自由に追加できるので、派生オブジェクトの構成は既存内容+追加内容になる。既存束縛で真になる式は派生束縛でも真になるというリスコフの置換原則が継承の根幹にされている。オブジェクトはソースコード上ではクラスとして定義されるので、継承元の親クラスはスーパークラス、継承先の子クラスはサブクラスと呼ばれる。クラスは自身のスーパークラスを複数個指定する事もできる。一つのスーパークラスを継承するのは単一継承、複数のスーパークラスを継承してそれぞれの構成内容を引き継ぐのは多重継承と呼ばれる。

多態性

異なる種類のオブジェクトに同一の操作インターフェースを持たせる仕組みが多態性と呼ばれる。オブジェクト指向下の多態性は、クラスの派生関係またはオブジェクトの動的バインディングを利用した実行時変化プロセスであるサブタイピングを指す。サブタイピング(派生法)は仮想関数多重ディスパッチ動的ディスパッチの三手法に分類される。最もよく知られる仮想関数は多態性と同義に説明される事が多い。仮想関数は、メソッドが所属するクラスの派生関係のみに焦点を当てたシングルディスパッチであり、スーパークラス抽象メソッドへの呼び出しから、その実行時のサブクラス実装メソッドに多方向分岐させるプロセスを指す。その際はVtableと呼ばれる関数へのポインタに近い仕組みが用いられる。多重ディスパッチは、メソッドが所属するクラスの派生関係に加えて、メソッドの各引数のクラスの派生関係にも注目した形態である。各引数は実行時に型ダウンキャストされて、その引数の型パターンに対応したルーチンに枝分かれする。前述の仮想関数による枝分かれがその前に入る形態もあれば、入らない形態もある。入らない場合は単一引数だとシングルディスパッチになる。多重ディスパッチの中でもプロセス分岐に関与するクラスが二つに限定されたものは、ストリームアルゴリズムで多用される為にダブルディスパッチと個別定義されている。動的ディスパッチは、プロトタイプベースのOOPで用いられるものであり、実行時におけるオブジェクトのメソッド参照の切り替えカスタマイズによるプロセス変化を指す。また、クラスベースのOOPでもクラスの定義内容を操作できるリフレクション機能によってこれが再現される事もある。

メッセージング

元祖オブジェクト指向の根幹とされるメッセージングはやや哲学的なプログラム概念である。仕組み的にはオブジェクトのメソッド呼び出しと同じものと考えてよいが、メッセージングではイメージ的にオブジェクトそのものをメソッドとして呼び出す点が異なっている。それは各オブジェクトが一般にレシーバーと呼ばれるデフォルトメソッドを持つ事で実現されている。オブジェクトの呼び出しとは、このレシーバーを呼び出すのと同義となる。メソッドはなるべく引数を持たないようにデザインするのが好まれるが、メッセージングは原則的に引数を必要とする。元祖オブジェクト指向では「EverythingIsAnObject」の通り、プリミティブからデータストラクチャコードブロックまでのあらゆるプログラム要素がオブジェクトとされる。ここにオブジェクトA、Bがあるとすると、メッセージングの基本構文は「A B」のようになる。これは「Bを引数にしてAを呼び出す」の意味であり、イメージ的に「Aに対してBというメッセージを送る」と形容される。引数Bを受け取ったAのレシーバー内で任意の処理が行われた後に結果値としてのオブジェクトが返される。Aそのものが返される事もあれば、別のオブジェクトが返される事もある。この流れがメッセージングと呼ばれるものである。返値オブジェクトに対して別のメッセージを送る事も可能であり、また返値オブジェクトをメッセージにして別のオブジェクトに送る事も出来る。こうしたメッセージングの連鎖はそれぞれのレシーバー内でも同様に行なわれるので、それぞれのオブジェクトもまたメッセージング連鎖の集合体になる事がある。そのオブジェクトがただのプリミティブ値であっても決して例外ではないとされる。メッセージング概念下でのオブジェクトは独自の「記憶」を備えた言わば変換式であり、これらオブジェクトのコミュニケーションとは高階関数第一級関数の仕組みと同じものである。ただし「記憶」を備えているので参照透過性とは正反対の方向性を持つ。レシーバーでの処理をコードとすると、メッセージング概念下での「データ」はメッセージング連鎖によるコードの集合体であり、その各コードは他のデータ群を参照しており、その各データもまたコードの集合体~という風になる。最後は末端オブジェクトの定形データに行き着いてそれが値算出の原点になるが、こうなるとイメージ的にコードとデータが融合して両者の区別はなくなる。プログラムの要点になるオブジェクトほど定型値または決定値を持たず「あいまい」にデザインされるのが望ましいとされる。あいまい(fuzzy)なオブジェクトはいかなるデータを表現する際にも一人ではそれを決定できず、他のオブジェクトと引き合わされるメッセージングによって始めて一つのデータが正式に体現され、同時に一つのプロセスが発生する。オブジェクトのあいまいさは微妙な余白に形容されている。このメッセージングの特徴に関して、アラン・ケイは日本語の「間」(The Japanese have a small word - ma )を引き合いに出している。

I thought of objects being like biological cells and/or individual computers on a network, only able to communicate with messages. (さながら生物の細胞、もしくはネットワーク上の銘々のコンピュータ、それらはただメッセージによって繋がり合う存在、僕はオブジェクトをそう考えている) — Alan Kay

このメッセージングもケイの手から離れて様々な解釈を生むようになり、規定のメソッド名に囚われない柔軟なレスポンスを行えるメッセージ転送機構を取り入れたレシーバーの仕組み自体や、遠隔プロシージャ呼出で行なわれるバイトデータ列の送受信がメッセージングの代表例と見なされるようにもなっている。また、ただのメソッド呼び出しもメッセージングであると説明される事もある。特に混同を招いてるものに並行計算、並列処理を指向するアクターモデルのメッセージングパッシングがあるが、元祖オブジェクト指向のそれと一定の親和性を見て取る意見もあり、OOP言語の中で同期性(synchronous)に対する並列性(concurrency)が重視されるに従いその方面の探求も進められている。

遅延バインディング

データの結び付け(binding)先になる「型」をコンパイル時ではなく実行時に決めるこの遅延バインディングの手法でよく知られるものは、Vtableによる仮想関数と、インスタンス埋込情報または特別な参照値マッピングによる実行時のダウンキャストである。いずれも静的な型(static type)として定義されたクラスを利用した仕組みである。しかし元祖オブジェクト指向では、オブジェクトを静的なクラスに結び付けるデザインには否定的である。例えば型チェックでは、トレイトプロパティによってオブジェクトを調べるダックタイピングが好まれており、動的な型付け(dynamic typing)が重視されている。静的な型によるオブジェクト分類の否定は、データがデータを表わすという当たり前的な考えの否定にもつながってくる。静的な型とは、事前定義という言わば存在の見えない分別コードによって様々なデータ参照を平易化ないし最適化する仕組みなので、それにあえて逆行する事になるからである。上述のメッセージングは、データをコードの集合体として表わす仕組みなので静的な型の放棄を補完できる。同時にこれはデータの型のみならず「実値」でさえも実行時に決定されるという徹底的な遅延バインディング(extreme late-binding)を実現する。

I realized that the cell/whole-computer metaphor would get rid of data, ... (僕はこう気付いた、細胞であり全体でもあるコンピュータメタファーはデータを除去するであろうと、) — Alan Kay
... 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を触媒にした二本の道筋があった。初めの一本は細胞組織に倣った非データ型の手法、僕が選んだ方だ。少し遅れたもう一本は抽象データ型、こっちの方がはるかに賑わってるね。) — Alan Kay

歴史

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

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

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

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

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

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

C++の創始者ビャーネ・ストロヴストルップは、Smalltalkが目指したある種の理想の追求には興味が無く、現用としての実用性を重視した。そのため、C++の再定義した「オブジェクト指向」は既存言語の拡張としてオブジェクト指向機能を実装できることでブレイクスルーを迎え急速に普及する。Smalltalkが単なるメソッドの動的呼び出しをメッセージ送信に見立て、呼び出すメソッドが見つからないときのみメッセージをハンドリングできるようにした「省コスト版」の機構を発明し以降それを採用するに至った経緯も手伝って、メッセージ送信という考え方はやや軽視されるようになり、オブジェクト指向とはC++の再定義したものと広く認知されるようになった。

1980年代後半に次々と生まれたオブジェクト指向分析・設計論は、Smalltalkを源流とするオブジェクト指向を基に組み立てられた。そのころSmalltalkは商用展開こそされていたが広く普及しているとは言えず、一般にはC++での実装が多くを占めた。しかしC++はSmalltalkと思想的にかなり異なる点や、同様のことを実現する際の実装面での複雑さや制約が問題とされた。このニーズを受けC++の提示した抽象データ型にクラスを適用する現実的な考え方と親しまれたALGOL系の構文を踏襲しつつ、内部的には柔軟なSmalltalkのオブジェクトモデルを採用し、メソッドなどの一部用語やリフレクション、実行時動的性などSmalltalk色も取り入れたJavaが注目を集めた(1995年に登場。元々はモバイル機器向け言語処理系として開発された)。程なくSmalltalkやSELFで達成された仮想マシン(バイトコードインタープリタ)高速化技術の転用により実用的速度を得、バランス感覚に長けたJavaの台頭によってオブジェクト指向開発に必要な要素の多くが満たされ、1990年代後半からオブジェクト指向は広く普及するようになった。

オブジェクト指向言語一覧

オブジェクト指向言語の系譜

オブジェクト指向を総体的または部分的にサポートする機能を備えたプログラミング言語の公開は、1980年代後半から顕著になった。オブジェクト指向言語の分類法は複数あるが、Smalltalkをルーツとするメッセージパッシングの構文が重視されてるか否かでまず大別され、そうでないものは更にクラスベースプロトタイプベースで分類される事が多い。

クラスベースでは「C++」「Java」「C#」「Swift」がその代表とされる。プロトタイプベースでは「Python」「JavaScript」「Ruby」が有名である。メッセージ構文重視では「Smalltalk」「Objective-C」「Self」などがある。言語仕様の中でオブジェクト指向の存在感が比較的高い代表的なプログラミング言語を以下に列挙する。

Simula 67 1967年
1962年に公開されたSimulaの後継版であり、クラスのプログラム概念を導入した最初の言語である。現実世界の擬似モデルを観測するシミュレーション・プログラム制作用に開発されたもので、クラスを実メモリに展開したオブジェクトは、その観測対象要素となった。Simulaのクラスは、プロシージャに専用変数と補助ルーチンを加えた小型モジュールに近いものであったが、継承と仮想関数という先進的な設計を備えていた事でオブジェクト指向言語の草分けと見なされるようになった。C++、Javaの源流になった。
Smalltalk 1972年
メッセージパッシングのプログラム概念を導入した最初の言語。数値、真偽値から変数、構造体、コードブロック、メタデータまでのあらゆる要素をオブジェクトとするデザインを編み出した最初の言語でもある。オブジェクト指向という言葉は、Smalltalk開発者がその言語設計を説明する中で生み出された。オブジェクトの基礎的な振る舞いを規定する限られた予約語の他は、オブジェクトとメッセージのやり取りで制御構造を含めたあらゆるプロセスを表現出来た。また、専用のランタイム環境上でプログラムを実行する設計を応用して動的な多態性とセキュリティに繋がるモニタリングも実現した。これは後に仮想マシンと呼ばれるものとなり、JavaやC#に踏襲された。
C++ 1983年
C言語クラスベースのオブジェクト指向を追加したもの。Simulaの影響を受けている。静的なクラスの仕組みが備えられて、カプセル化、継承、多態性の三仕様を実装している。テンプレート機能関数&演算子オーバーロード例外処理などのプログラミングパラダイムも導入された。元がC言語であるため、オブジェクト指向から逸脱したコーディングも多用できる点が物議を醸したが、その是非はプログラマ次第であるという結論に落ち着いた。
Objective-C 1984年
C言語メッセージ構文重視のオブジェクト指向を追加したもの。こちらはSmalltalkの影響を受けており、それに準じたメッセージパッシングリフレクションの仕組みが備えられた。オブジェクト指向的には前述のC++よりも正統であると見なされた。制御構文が追加され、メッセージの仕様もやや簡素化されるなど実践上の利便性が図られており、Smalltalkよりもコーディングし易くなった。
Object Pascal 1986年
Pascalにクラスベースのオブジェクト指向を追加したもの。
Eiffel 1986年
Pascalにクラスベースのオブジェクト指向を追加したもの。契約プログラミング方針と厳格な名前付け方針による静的な型定義を重視した言語である。引数パターンによるオーバーローディングが除外されている。継承されたクラス名はその都度ユニーク名にクローンされて多重継承時の問題を回避している。自動メモリ管理のガーベジコレクタの導入も特徴であり堅牢性が重視されている。なお、ジェネリックプログラミングも採用されており利便性も図られている。
Self 1987年
メッセージ構文重視のオブジェクト指向言語。動的な型付けを重視した言語であり、予め用意されたオブジェクトを複製して任意の拡張を施すプロトタイプベースの仕組みを初めて実装した。Smalltalkと同様に専用のランタイム環境で実行されたが、これも実用面では初となる実行時コンパイラ(just-in-time compiler)の機能が備えられて速度面でも画期的なものとなった。
CLOS 1988年
Common Lispにクラスベースのオブジェクト指向を追加したもの。
R言語 1993年
インタプリタ式で動作する。オブジェクト指向と関数型プログラミングと動的なジェネリックプログラミングをミックスさせている。動的なジェネリックは遅延バインディングとほぼ同義であり多重ディスパッチの表現に相当している。オブジェクトは関数の引数または返値として扱われる対象データ存在であり、関数の引数と返値は随時総称型にできる。オブジェクト指向と関数型を連携させたプログラミングの先駆けとされる。
Python 1994年
プロトタイプベースクラスベースの双方を兼ねたオブジェクト指向スクリプト言語である。インタプリタ式動作のランタイム環境が可能にする柔軟な動的バインディング機能が、扱いやすく奥の深いオブジェクト指向プログラミングを実現している。言語仕様が比較的簡素化され、ガーベジコレクションも実装されており高い堅牢性を持つ。リフレクションに相当するクラスと関数のメタデータ・カスタマイズは保守性と利便性を高めている。後のオブジェクト指向スクリプト言語の手本になり、2019年現在ではJavaを凌ぐ人気を博すようになった。
Java 1995年
C++をモデルにしつつ堅牢性とセキュリティを重視したクラスベースのオブジェクト指向言語。その二つの理念を実現するために、静的な型定義の重視、仮想マシン上の実行、ガーベジコレクションサンドボックスモデル例外処理などを採用し、ポインタと直アドレス変数、多重継承、ジェネリックプログラミング、演算子オーバーロードなどを破棄した。アップデートに伴いリフレクション分散オブジェクト、コレクション用ジェネリクス並列処理関数型プログラミングなど様々なパラダイムも追加されている。非常に整えられたハイブリッド言語である。
Delphi 1995年
Object Pascalを発展させたもので、データベースの操作プログラム開発などを主な用途とした。一時期Javaの対抗馬になった。
Ruby 1995年
Pythonを意識して開発されたオブジェクト指向スクリプト言語。日本で誕生してグローバル化したプログラミング言語であり、日本人の思考にマッチしてると言われる。ミックスインの採用が特徴である。
JavaScript 1996年
WEBアプリケーション開発を主な目的とするオブジェクト指向スクリプト言語。Smalltalkの思想を受け継いでいる。プロトタイプベースの巧みな導入が、オブジェクトのカスタマイズを理解しやすいものにして万人向けの道を開いた。静的な型定義が放棄され、動的な型付けおよび動的バインディングを平易化した言語設計がプログラミング上の高い利便性と保守性を実現している。2019年現在では、Python、Javaと並んでOOP御三家に位置付けられている。ECMAScriptとして標準化されている。ECMAScript 2015ではクラスベース向けの構文もサポートするようになった。
C# 2000年
Javaを強く意識してマイクロソフト社が開発したクラスベースのオブジェクト指向言語。.NET Frameworkなどの共通言語基盤上で実行される。言語仕様面で数々の野心的な拡張が施されており、高度なコーディングスタイルを実現している。こちらもよく整えられたマルチパラダイム言語として知られる。
Scala 2003年
クラスベースのオブジェクト指向と関数型プログラミングを連携させた言語。オブジェクトは関数の引数または返値として扱われる対象データ存在になるだけでなく、オブジェクトにもラムダ計算的解釈が適用できるので主体的な評価式存在にもなれる。関数、オブジェクト、オブジェクトメソッドの三者にそれぞれ高階関数、第一級関数、評価式の役割を自在に演じさせてモナド的な関数連鎖を織りなす柔軟なプログラミングが可能である。結果的に関数型と抽象データ型の親和性を世に証明する言語になった。
Kotlin 2011年
Javaバイトコードを出力し、Java仮想マシン上で動作するJavaテクノロジー互換言語である。グローバル関数、グローバル変数の使用も容認されており、オブジェクト指向プログラミングを手続き型プログラミングのスタイルに崩したかのようにデザインされている。
TypeScript 2012年
JavaScriptを強く意識してマイクロソフト社が開発したオブジェクト指向スクリプト言語。Typeの名が示す通り、静的な型定義による抽象データ型の有用性を改めて世に問うべく登場した。
Swift 2014年
最新スタイルのマルチパラダイムプログラミング言語。クラスベースのオブジェクト指向も導入されている。

用語と解説

クラス

詳細は「クラス (コンピュータ)」を参照

クラスベース

詳細は「クラスベース」を参照

クラス (class) は大多数のオブジェクト指向プログラミング言語で提供されている仕組みであり、上記の機能のほとんど全てに関わりがある。概念的にはクラスはオブジェクトの種類を表す。このためオブジェクトはクラスに属するという言い方をする。あるクラスに属するオブジェクトのことをそのクラスのインスタンス (instance) と呼ぶ。データ型の理論から見た場合クラスは型を定義する手段の一つである。クラスによってオブジェクトを記述する言語をクラスベース (class-based) のオブジェクト指向プログラミング言語と呼ぶ。

ハイブリッド型オブジェクト指向プログラミング言語では在来のレコード型(Cでは構造体)の構文を拡張してクラスの定義を行うようにしたものが多い。

多くのオブジェクト指向プログラミング言語ではクラスをデータメンバメソッドの集まりとして記述する。平たく言えばデータ・メンバの集まりはオブジェクトが保持するデータの形式を定め、各メソッドはそれぞれオブジェクトが処理する特定のメッセージの処理方法を定める。しばしばデータ・メンバとメソッドには個別にアクセス権が設定できるようになっていて、そのクラスに属するオブジェクトが内部的に利用するものと他のクラスに属するオブジェクトに公開するものを分類できるようになっている。多くの場合、公開されたメソッドの集まりは全体として処理可能なメッセージのカタログの機能、即ちインタフェースを提供する。各言語によって異なるが特定の名前のメソッドを定めて、オブジェクトの生成や初期化時の処理、廃棄時の処理などを記述できるようにすることも多い。

多くの言語でクラスは言語の要素として直接実現されているが、これは実行効率のためであり、そのように実現することが必須というわけではない。実際、各クラスをそれぞれオブジェクトとして提供する言語も存在する(例:Smalltalk)。このような言語ではある種のリフレクション (reflection) が可能となる。即ち必要があればプログラムで実行時にクラスの動作を変更することが可能である。これは非常に大きな柔軟性を提供するが、言語処理系による最適化が難しいため実行効率は低下することが多い。近年では柔軟性と効率性を両立させるために基本的に言語要素としてクラスを提供した上で、リフレクション機能が必要なプログラムに対しては必要に応じて各クラスに対応するクラス・オブジェクトをプログラムが獲得できるようにしている言語が現れてきている。(例:JavaのリフレクションAPI)

プロトタイプベース

詳細は「プロトタイプベース」を参照

クラスは非常に多くのオブジェクト指向プログラミング言語で提供されている機能ではあるが、オブジェクト指向プログラミング

・・・・・・・・・・・・・・・・・・
出典:wikipedia
2020/04/10 01:25

HAPPY Wikipedia

あなたの考える「オブジェクト指向プログ…」の意味を投稿しよう
「オブジェクト指向プログラミング」のコンテンツはまだ投稿されていません。
全部読む・投稿 

オブジェクト指向プログラミングスレッド一覧

・・・・・・・・・・・・・・・・・・
「オブジェクト指向プログラミング」のスレッドを作成する
オブジェクト指向プログラミングの」
友達を探す
掲示板を探す
このページ
友達に教える
URLをコピー

注目のキーワード

錦織圭/北島康介/2014_FIFAワールドカップ・アジア予選/サッカー日本女子代表/消費税/東京スカイツリー/ダルビッシュ有/イチロー/香川真司/野田内閣/復興庁/石川遼/HKT48/AKB48/ワールド・ベースボール・クラシック日本代表/黒田博樹/尖閣諸島/バレンタインデー/ONE_PIECE

キーワードで探す

 
友達を探す
掲示板を探す
ハッピーWiki
ハッピーメール
ハッピーランド
HAPPY NEWS
2010Happy Mail