オブジェクト指向プログラミングを構成する3原則のうち,前回は「ポリモーフィズム」を学びました。今回はオブジェクト指向の歴史を復習した後,残りの「データ抽象」と「継承」について解説します。

(ネットワーク応用通信研究所 まつもと ゆきひろ)

 オブジェクト指向プログラミングを構成する3原則は「ポリモーフィズム」,「データ抽象」,「継承」であると言われます。3原則を別の名前で呼ぶこともあります。例えば,「ポリモーフィズム」を「動的結合」と呼んだり,「データ抽象」を「情報隠ぺい」,「カプセル化」と呼んだりします。しかし,名前が違っても指し示すものは同じです。多くの人はオブジェクト指向プログラミングにこれらの原則が重要であると考えているようです*1

オブジェクト指向の歴史

 最近になってオブジェクト指向という単語を耳にした人にとっては,オブジェクト指向というのは新しい単語が山のように出てくる難しい概念だ,という印象を持たれることが多いようです。実際,オブジェクト指向を15年以上追ってきた私にとっても,最近のオブジェクト指向関連のトピックの中には,難しい,とっつきにくいと感じるものもたくさんあります。

 オブジェクト指向という考え方は,1960年代後半から40年近くかけて段階的に発展してきたものです。少しずつ発展してきた成果を一度に眺めると,その量に圧倒されそうになるかもしれません。しかし,基本に立ち返って歴史に沿って概念を学んでいけば,難しそうに見えるオブジェクト指向が解きほぐれ,思いのほか理解しやすくなるものです。

 まず,オブジェクト指向の歴史をざっと眺めてみましょう。歴史の中に知らない単語が出てきても心配しないでください。後できちんと解説します。

●Simulaの「発明」

 前回触れたように,オブジェクト指向プログラミングという考え方は,1960年代後半のスウェーデンで開発されたSimulaというシミュレーション用プログラミング言語が発祥だとされています。シミュレーションする対象を表現するデータと,実際のシミュレーション手続きとを分け,別々に管理して,常に適切な組み合わせ処理できるようプログラマが責任を持つのは大変です。そこで,Simulaでは,データとそれに対する適切な手続きを組み合わせた抽象データ型が導入されました。それに伴い,クラスや継承の機能も用意されていました。実に1960年代末には現代のオブジェクト指向プログラミング言語が備える基本的な機能が,既に実現されていたのです。

●Smalltalkの開発

 Simulaで生まれたオブジェクト指向プログラミングという考えはあちこちに伝わっていきました。1970年代から1980年代前半にかけての米Xerox社のパロアルト研究所(PARC)では,Smalltalkという言語が開発されていました。「子供にも使えるプログラミング言語」をテーマに開発されていたSmalltalkは,Simulaから受け継いだオブジェクト指向という考え方と,LispやLOGOから受け継いだ考え方をベースにして,既存のどの言語とも違う独自の言語になりました。それだけでなく,言語を取り巻く非常に優れたGUI環境をも産み出したのです。この独創的な言語により,オブジェクト指向プログラミングという考え方が世界中に認知されるようになります。

●Lispの発展

 一方,アメリカ東海岸のMITやその周辺では,Lispがオブジェクト指向の考えを取り込んでいきます。FORTRAN,COBOLと並んで最も古い言語の一つであるLispは,同時期に登場した他の言語と違ってきちんとした数学的バックグラウンドを持つため,言語自身を拡張させていく機能を備えていました。Lispのオブジェクト指向機能も,Lisp自身で記述されていたのです。そのため,言語仕様の変更・拡張・実験が進めやすく,さまざまな先進的なアイディアが生まれました。多重継承,Mix-in,マルチメソッドなどオブジェクト指向にまつわる重要な概念の多くがLispのオブジェクト指向機能から誕生しています。

●C言語との出会い

 各地でオブジェクト指向に対する研究が行われていた1980年代,米AT&T社のベル研究所では,C言語にオブジェクト指向機能を追加した「C with Class」という言語が開発されていました。開発したのは,Simulaが生まれたスウェーデンから遠くないデンマーク出身のBjarne Stroustrupです。イギリス・ケンブリッジ大学在学中にSimulaのユーザーであったStroustrupはベル研究所に加わった後,Cの高速さとSimulaのオブジェクト指向機能を兼ね備えた言語を作りたいという思いから「C with Class」を開発したと述べています。

 当時のSimulaの処理系は大変遅かったので,彼の研究には使えなかったのだそうです。この「C with Class」が後の「C++」になりました。このような経緯がありますから,C++はSimulaからの直接の影響が見られ,Smalltalkの影響はあまり見受けられません。

●Javaの誕生

 Cとの互換性を強調したC++には,低レベルなことも記述できるというメリットと,低レベルなことも記述しなければならないというデメリットが共存していました。その点を改善するべく1990年代になって登場したのがJavaです。JavaはC++からCへの互換性(とそれに伴う制約)を取り除き,その代わりにLispなどからより良い機能をいくつか取り込んで誕生しました。また,JVM(Java Virtual Machine)という仮想マシンを経由することで,1つのプログラムが再コンパイルなく,あらゆるプラットフォームで動作するとうたわれていました。

 今やJavaは1990年代に誕生した言語の中では最も成功した言語として世界中で広く用いられています。

 このようにオブジェクト指向プログラミングはプログラミング言語とともに発展してきました。1990年代になると,オブジェクト指向という考え方はソフトウエア開発の上流領域であるソフトウエア設計や分析の分野にも進出していきました。1994年,当時主要なオブジェクト指向分析・設計技法であったBooch法を開発したGrady Booch,OMT(Object Modeling Technique)のJim Rumbaugh,OOSE(Object Oriented Software Engineering)のIvar Jacobsonが協力してUML(Unified Modeling Language)を作り上げます。UMLはオブジェクト指向アプローチで設計されるソフトウエアのモデルを記述するための記法であり,またそれを用いた分析・設計の方法論でもあります。

 UMLは信頼性の高いソフトウエアをオブジェクト指向を用いて設計する際に有益な方法ではありますが,UML全体はそれなりに複雑で周辺の概念の数も多く,初心者には難しいという印象を与えてしまいました。

 オブジェクト指向の基本概念は当初から確立されており,その後登場したプログラミング言語はその発展形だということが分かります。