Selfの概略
Selfは、プロトタイプの考え方に基づいた
オブジェクト指向プログラミング言語であり、
1980年代から
1990年代にかけて多くの実験的な言語設計が行われてきました。近年も開発は続いており、特にSelf言語で構築されたSelfバーチャルマシンのKleinプロジェクトが進行中です。2006年にはバージョン4.3がリリースされ、その更新も注目されています。
歴史
Selfは
1986年、
パロアルト研究所でデビッド・アンガーとRandall Smithによって設計されました。この言語は、当時注目を集めていたSmalltalk-80を背景に、
オブジェクト指向プログラミングの研究の一環として進められました。彼らは
スタンフォード大学に移り、
1987年には最初のコンパイラを完成させ、Selfのシステム全体の構築に力を入れました。
1990年に一般向けの初リリースがあり、すぐ後に
サン・マイクロシステムズに移籍し、その開発を継続しました。
続いていくつかのバージョンがリリースされ、1995年のバージョン4.0をもって活動は一時期停止しましたが、
2004年にはバージョン4.2がリリースされ、Mac OS Xと
Solarisでの動作が確認されています。また、Selfは他の
プログラミング言語にも影響を与えており、特に
JavaScriptやNewtonScriptなど、様々な言語にその概念が取り入れられています。
プロトタイプベース・プログラミング
オブジェクト指向の伝統的なアプローチでは、「クラス」と「オブジェクト」の関係に依存していますが、Selfではプロトタイプベースのアプローチが採用されています。これは、オブジェクトをコピーして修正することで新しいオブジェクトを作成する方法です。例えば、「Vehicle」クラスを使ったとき、「Porsche 911」という特定のインスタンスを作成する際には、そのプロトタイプを変更することで特性を持たせることができます。これにより、クラスの階層を事前に設計する必要がなく、柔軟な開発が可能になります。
言語の特徴
Selfでは、オブジェクトが「スロット」と呼ばれる値の集まりから構成されています。スロットに対してメッセージを送ることによって、値を取得したり変更したりできます。Selfでは、メッセージの種類に応じて構文が異なり、例えば単項、二項、キーワードのメッセージを利用することができます。また、Selfの文法はSmalltalkに類似しており、スロットアクセスの構文もほぼ同様です。
NewObjectの生成においては、例えば`labelWidget copy label: 'Hello, World!'` と記述することで、既存のオブジェクトからプロトタイプを作成し、新しい属性を設定可能です。
Selfの特徴として、通常のオブジェクトは自身のメッセージしか認識しないものですが、「親」オブジェクトを指し示すスロットを持つことで、未定義のメッセージを親に
委譲することができます。この
委譲によって、クラスベースの言語と同様の継承機能を実現することが可能です。
Selfの仮想マシンは、
C言語と比較しても一定の性能を持っており、高度な
ガベージコレクション機能を備えています。世代型の
ガベージコレクションにより、より効率的にメモリを管理し、メモリ使用の最適化が図られています。
さらに、実行時環境は最適化を行うことで、JITコンパイルを使用した際にはより高い性能を発揮することが可能です。
結論
Selfは、プロトタイプベースの
オブジェクト指向プログラミングの先駆けとして、その設計思想と影響力において特筆すべき存在です。多くの言語にその概念が受け継がれており、今なお進化を続けるこの言語の特徴は、
プログラミング言語の多様性を示す重要な一例と言えるでしょう。