オブジェクト指向プログラミングが開発されたのはいつ
オブジェクト指向プログラミング
Simula 1962年 オブジェクトとクラスを導入した最初の言語。また、C++が再定義したオブジェクト指向プログラミング言語の要件を満たすことから、最初のオブジェクト指向プログラミング言語とされることもある。クラスベース。当初はシミュレーション記述用に開発されたものであったが、後に汎用化された。 Smalltalk 1972年 オブジェクト間の相互作用に<b data-parsoid='{"dsr":[7033,7044,3,3]}'>メッセージ</b>という機構を導入した最初の言語。オブジェクト指向と言う言葉は、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のオブジェクト指向拡張。クラスが型推論機構に組み込まれているという特徴がある。 PHP 2000年 動的にWebページを生成することを主目的としたスクリプト言語。バージョン4からオブジェクト指向に対応し、バージョン5でアクセス権やインターフェースなど、オブジェクト指向の強化が行われている。 C# 2000年 Javaとよく似た作りでJavaと同じく仮想マシン上で動作するが様々な部分で拡張されている。.NET Framework上で動く。 Visual Basic.NET 2002年 既存のVisual Basic（6.0以前）を大きく改訂してオブジェクト指向に対応。C＃同様.NET Framework上で動く。 COBOL 2002年 2002年に制定された国際規格に、オブジェクト指向機能が採用された。1994年には、国際規格案を先取りした商用コンパイラ上で利用可能になった。オブジェクト指向構文を使わないCOBOLプログラムと混在できる。 Ceylon 2011年 Java をもとにつくられ、Java のもつ長所と短所を考慮しつつ、商用言語として再設計された言語。 Swift 2014年 Objective-Cのオブジェクトを引き継ぎながらも、ベースのC言語を取り除いて新しく再設計された言語。
オブジェクト指向プログラミング
このような場合、各オブジェクトがそれぞれメッセージ処理のコード（前述の「振る舞い」に当たる）を独自に備えていては無駄である。そこでオブジェクト指向プログラミング言語がオブジェクトを実現する際には多くの場合、内部的にはオブジェクトを2つの部分に分けている。