Oberon-2は、
プログラミング言語Oberonをベースに、
オブジェクト指向プログラミングの概念を取り入れた拡張言語です。
1991年に、
チューリッヒ工科大学のニクラウス・ヴィルトとHanspeter Mössenböckによって開発されました。
Oberon-2は、
Oberonの上位互換であり、Object
Oberon(
Oberonにオブジェクト指向の概念を導入した最初の試み)の再設計でもありました。
Oberon-2は、
Oberonから単一継承(型拡張)を受け継いでいますが、効果的な仮想メソッド(型束縛
プロシージャ)を追加しています。メソッド呼び出しは、
C++のような仮想メソッドテーブルを使って実行時に確定します。
Smalltalkなどの完全なオブジェクト指向言語と比較すると、
Oberon-2の基本データ型はオブジェクトではなく、クラスもオブジェクトではありません。多くの操作がメソッドとして提供されておらず、メッセージパッシングの概念もありません。
ポリモーフィズムも限定的であり(Smalltalkや
Rubyのようなダックタイピングがなく、
Javaのようなインタフェースも定義できません)、オブジェクト/クラスレベルでの
カプセル化はサポートされていませんが、
モジュールをその目的で使用することができます。
Oberon-2のリフレクションは、メタオブジェクトを使用せず、実行ファイルに含まれる型記述子を読み取り、それが型や
プロシージャを定義している
モジュールに渡されます。構造体の形式が言語レベルで渡される場合(例えば、
Oberon System 3の場合)、ライブラリレベルでのリフレクションの実装が可能です。そのため、言語コードを変更せずにライブラリレベルでほとんどすべてを実行できます。実際、
Oberon System 3は言語レベルとライブラリレベルの両方でリフレクションを多用しています。
主な拡張機能
型束縛プロシージャ:プロシージャは、レコード型(またはポインタ型)に束縛できます。これはオブジェクト指向用語で言うインスタンスメソッドと同等です。
リードオンリーのエクスポート:エクスポートされた変数やレコードのフィールドについて、参照のみへのアクセスを制限できます。これは、visibility flagに「-」を付与することで示されます。
Open arrays:Oberonでは正式なパラメータ型としてのみ宣言可能でしたが、Oberon-2ではポインタベースの型として宣言できます。
FOR文:
Pascalや
Modula-2に存在したFOR文が、
Oberon-2で復活しました。
実行時型チェック:Oberon-2には、オブジェクトの型を動的にチェックする機能がいくつか用意されています。例えば、BirdオブジェクトのインスタンスとしてDuckやCuckooがある場合、実行時にオブジェクトの実際の型に応じた処理が可能です。
型束縛システム:従来の型束縛システムを使用する方法です。
WITH文:変数の動的な派生型を直接チェックする方法です。派生型を特定した後、プログラマーはその派生型に適切な型束縛プロシージャまたは型束縛変数を使用できます。
IS演算子:IS演算子は、等号(=)や不等号(>)などと同じ優先順位の関係演算子であり、動的な型検査を実行します。ただし、検出した派生型によって処理を振り分けることはできません。
文法
Oberon-2は、
ALGOL -
Pascal -
Modula-2 -
Oberon - Component
Pascal の系統の言語であり、文法が単純化されています。
EBNFを使用して、33の構文生成規則で表現できます。
実装
チューリッヒ工科大学では、Windows、Linux、Solaris、Mac OS X向けの
Oberon-2コンパイラを実装・保守しています。
その他にも、以下のような実装が存在します。
マンチェスター大学のStephen J. BevanによるOberon-2対応のLex(を使った)字句解析器とYacc(を使った)構文解析器
Programmer's Open Workbench (POW!):エディタ、リンカ、
Oberon-2コンパイラを備えた
統合開発環境。Windows上の実行ファイルを生成します。
Java to Oberon Compiler (JOB):ロシアのUniversity of Vologdaで開発されたOberon-2コンパイラ。Javaクラスファイル(バイトコード)を生成します。
Optimizing
Oberon-2 Compiler:Cに変換後、gccを使用してオブジェクトを生成するコンパイラ。
コード例
以下に、
Oberon-2で記述された単純なリストクラスの例を示します。
oberon2
MODULE List;
TYPE
List = POINTER TO ListDesc;
ListDesc = RECORD
head: INTEGER;
tail: List;
END;
PROCEDURE NewList(head: INTEGER; tail: List): List;
VAR
l: List;
BEGIN
NEW(l);
l.head := head;
l.tail := tail;
RETURN l;
END NewList;
PROCEDURE GetHead(l: List): INTEGER;
BEGIN
RETURN l.head;
END GetHead;
PROCEDURE GetTail(l: List): List;
BEGIN
RETURN l.tail;
END GetTail;
END List.
参考文献
Oberon-2に関する参考文献として、以下のものがあります。
"Second International Modula-2 Conference", 1991年9月
"From
Modula-2 to
Oberon" Wirth (1988)
"The Programming Language Oberon" Wirth (1988)
"Differences between
Oberon and
Oberon-2" Mössenböck and Wirth (1991)
"The Programming Language Oberon-2" H. Mössenböck, N. Wirth, Institut für Computersysteme, ETH Zürich (ETHZ), January 1992
"
Oberon Language Genealogy Tree" maintained at ETHZ
"What's New in Component Pascal" (Changes from Oberon-2 to CP), Pfister (2001)
外部リンク
Oberon/'>
Oberon Reference page at ETH-Zürich
Oberon.html'>Oberon at SSW, Linz
The Oberon-2 Reflection Model and its Applications