Self
1986年、パロアルト研究所で働いていたデビッド・アンガーとRandall SmithがSelfを設計した。Smalltalk-80が一般にリリースされて産業界から真剣に受け止められ始めていることから、オブジェクト指向プログラミング言語の研究をさらに進めることを目的として行われた。彼らはスタンフォード大学に移り、Selfの作業を進め、1987年に最初のコンパイラを完成させた。そして、言語だけではなくSelfのシステム全体を構築することに注力することになった。
一般への最初のリリースは1990年であり、翌年には彼らチームはサン・マイクロシステムズに移り、さらに Selfに関する作業を続けた。その後、何回かのリリースが行われ、1995年のバージョン 4.0リリースで長い活動休止状態に入った。最近のバージョン 4.2は2004年にリリースされ、Mac OS XとSolaris上で動作した。
Selfはいくつかの言語に概念的な影響を与えた。特筆すべきものとしては、Apple NewtonのNewtonScriptと、動的ウェブページ構築に使われるJavaScriptがある。他に、Io言語、Cel言語、Agoraなどがある。
本来のオブジェクト指向言語は以下の双対関係に基づいている:
クラスはオブジェクトの基本的な機能と振る舞いを定義する。
オブジェクト・インスタンスはあるクラスの個別の具現である。
例えば、Vehicle クラスのオブジェクトが「名前」を持ち、「運転」とか「建材を運ぶ」といった機能を持つとする。Porsche 911 が Vehicle クラスの1つのオブジェクト(インスタンス)で、「ポルシェ 911」という「名前」を持つとする。理論的には Porsche 911 に対して「建材を運べ」というメッセージを送ることができる。
この例はオブジェクト指向のはらんでいる問題を示している。ポルシェはどう考えても建材を運ぶのには適さないが、モデル化された Vehicle にはその機能が与えられている。より適したモデルを生成するには Vehicle に特殊化を施したサブクラスを使えばよい。例えば、Sports Car とか Flatbed Truck である。この場合、Flatbed Truck クラスのオブジェクトだけが「建材を運ぶ」という機能を持てばよい。一方、Sports Car にその機能を与えるのは間違いであり、単に高速に運転できればよい。
このような問題がプロトタイプという考え方を生む要因となった。クラスやオブジェクトが将来どのような機能を持つようになるか確実に予測できないと、クラス階層を正しく設計することはできないのである。Smalltalkのような初期のオブジェクト指向言語では、この手の問題が頻繁に生じた。