オベロン2

オベロン2
パラダイム命令型構造化モジュール型オブジェクト指向
家族ヴィルト・ オベロン
デザイン:ニクラウス・ヴィルト ハンスペーター
・メッセンベック
開発者チューリッヒ工科大学
初登場1991年; 34年前 (1991)
タイピングの規律強力、ハイブリッド(静的および動的
範囲語彙
プラットフォームCeres ( NS32032 )、IA-32x86-64
OSWindowsLinuxSolarismacOS
Webサイトwww.ethoberon.ethz.ch
影響を受けた
OberonModula-2Object Oberon
影響を受けた
Oberon-07ZonnonActive Oberonコンポーネント PascalGoNim

Oberon-2は、オリジナルのOberon プログラミング言語の拡張版であり、限定的なリフレクション プログラミング(リフレクション) とオブジェクト指向プログラミング機能、ポインター基本型としてのオープン配列、読み取り専用フィールドのエクスポートが追加され、Modula-2FORからのループが再導入されています

Oberonは1991年にチューリッヒ工科大学(ETH Zurich)のNiklaus WirthとHanspeter Mössenböck(現在はオーストリア、リンツ大学システムソフトウェア研究所(SSW)に所属)によって開発されました。Oberon-2はOberonのスーパーセットであり、Oberonと完全な互換性を持ち、Object Oberonの再設計となっています。

Oberon-2は、Oberonのインターフェースやミックスインを使わずに、限定的なリフレクションと単一継承(「型拡張」)を継承しましたが、効率的な仮想メソッド(「型束縛プロシージャ」)を追加しました。メソッド呼び出しは、 C++スタイルの仮想メソッドテーブルを使用して実行時に解決されました

Smalltalkのような完全なオブジェクト指向言語と比較すると、Oberon-2では、基本データ型クラスはオブジェクトではなく、多くの操作はメソッドではなく、メッセージパッシングはありません(ETH Oberonで実証されているように、リフレクションとメッセージ拡張によってある程度エミュレートできます)。また、ポリモーフィズムは共通クラスのサブクラスに制限されています(Pythonのようなダックタイピングはありません、[1]また、 Javaのようにインターフェースを定義することはできません)。Oberon-2はオブジェクトレベルまたはクラスレベルでのカプセル化をサポートしていませんが、この目的でモジュールを使用できます。

Oberon-2のリフレクションはメタオブジェクトを使用せず、実行可能バイナリにコンパイルされ、型や手続きを定義するモジュール内で公開されている型記述子から読み取ります。これらの構造体のフォーマットが言語レベルで公開されている場合(例えばETH Oberonの場合)、リフレクションはライブラリレベルで実装できます。つまり、言語コードを変更することなく、ほぼ完全にライブラリレベルで実装できます。実際、ETH Oberonは言語レベルとライブラリレベルのリフレクション機能を広範に活用しています。

Oberon-2は、Javaと同様のガベージコレクションのランタイムサポートを組み込みで提供し、境界や配列インデックスのチェックなどを実行することで、 CおよびC++に固有のスタックや配列境界の上書き問題や手動によるメモリ管理の問題を排除します。モジュールアーキテクチャによるシンボルファイルと名前空間を用いた個別コンパイルにより、インターフェースが変更されたモジュールのみを再コンパイルする必要があるため、高速な再構築が保証されます。

言語コンポーネントPascal [2]はOberon-2の改良版(スーパーセット)である。

サンプルコード

次の Oberon-2 コードは単純なバイナリ ツリーを実装します。

モジュール ツリー;TYPE  Tree *  =  POINTER  TO  Node ;  Node *  =  RECORD  name - :  POINTER  TO  ARRAY  OF  CHAR ;  left ,  right :  Tree  END ;PROCEDURE  ( t :  Tree )  Insert *  ( name :  CHAR配列 ) ; VAR p , Father : Tree ; BEGIN p := t ; REPEAT Father := p ; IF name = p . name ^ THEN RETURN END ; IF name < p . name ^ THEN p := p . left ELSE p := p . right END UNTIL p = NIL ; NEW ( p ); p . left := NIL ; p . right := NIL ; NEW ( p . name , LEN ( name ) + 1 ); COPY ( name , p . name ^ ); IF name < Father . name ^ THEN Father . left := p ELSE Father . right := p END END Insert ;                                                             PROCEDURE  ( t :  Tree )  Search *  ( name :  CHAR配列 ): Tree ; VAR p : Tree ; BEGIN p := t ; WHILE ( p # NIL ) & ( name # p . name ^ ) DO IF name < p . name ^ THEN p : = p . left ELSE p := p . right END END ; RETURN p END Search ;                                  PROCEDURE  NewTree *  ():  Tree ;  VAR  t :  Tree ; BEGIN  NEW ( t );  NEW ( t . name ,  1 );  t . name [ 0 ]  :=  0 X ;  t . left  :=  NIL ;  t . right  :=  NIL ;  RETURN  t END  NewTree ; 木の終わり

Oberon-2 による Oberon の拡張

出典: [3]

型バインドされた手続き

プロシージャはレコード型(またはポインタ型)にバインドできます。これはオブジェクト指向用語におけるインスタンスメソッドに相当します。

読み取り専用エクスポート

エクスポートされた変数とレコードフィールドの使用を読み取り専用アクセスに制限できます。これは「-」の可視性フラグで示されます。

オープン配列

以前は仮パラメータ型としてのみ宣言できたオープン配列は、ポインタ基本型として宣言できるようになりました。

FOR文

PascalとModula-2の文FORはOberonでは実装されていませんでしたが、Oberon-2で再導入されました。

実行時型チェック

Oberon-2は、オブジェクトの動的な型をチェックするための複数のメカニズムを提供しています。例えば、BirdオブジェクトがDuckまたはCuckooにインスタンス化される可能性がある場合、Oberon-2では、プログラマーが実行時にオブジェクトの実際の型を判断できます。

最も従来的な最初のアプローチは、型束縛システムを利用することです。2つ目のアプローチは、WITH文を使用することで、変数の動的なサブタイプを直接確認できます。どちらの場合も、サブタイプが特定されれば、プログラマーはサブタイプに適した型束縛された手続きや変数を自由に利用できます。これらのアプローチの例を以下に示します。

Oberon-2で使用される文の形式は、WITHPascalおよびModula-2のWITH文とは無関係であることに注意してください。レコードフィールドへのアクセスを短縮するこの方法は、OberonおよびOberon-2では実装されていません。

型バインディング

 MODULE  Birds ;  TYPE  Bird *  =  RECORD  sound *  :  ARRAY  10  OF  CHAR ;  END ;  END  Birds . モジュール アヒル; インポート ; TYPE  Duck *  =  RECORD  ( Birds . Bird )  END ; PROCEDURE  SetSound *  ( VAR  bird  :  Duck );  BEGIN  bird . sound  : =  "Quack!"  END  SetSound ;  END  Ducks . モジュール カッコウ; インポート ; TYPE カッコウ*  =  RECORD  (.)  END ; PROCEDURE  SetSound *  ( VAR  bird  :  Cuckoo );  BEGIN  bird . sound  : =  "Cuckoo!"  END  SetSound ;  END  Cuckoos .

WITH声明

 モジュール テスト; インポート Out  Birds  Cuckoos  Ducks ; TYPE  SomeBird *  =  RECORD  ( Birds . Bird )  END ; VAR  sb  :  SomeBird ;  c  :  Cuckoos . Cuckoo ;  d  :  Ducks . Duck ; PROCEDURE  SetSound *  ( VAR  bird  :  Birds . Bird );  BEGIN  WITH  bird  :  Cuckoos . Cuckoo  DO  bird . sound  : =  "Cuckoo!"  |  bird  :  Ducks . Duck  DO  bird . sound  : =  "Quack!"  ELSE  bird . sound  : =  "Tweet!"  END  END  SetSound ; PROCEDURE  MakeSound *  ( VAR  b  :  Birds . Bird );  BEGIN  Out . Ln ;  Out . String ( b . sound );  Out . Ln  END  MakeSound ; BEGIN  SetSound ( c );  SetSound ( d );  SetSound ( sb ); MakeSound ( c );  MakeSound ( d );  MakeSound ( sb )  END テスト

POINTER

 モジュール PointerBirds ; インポート Out ; TYPE  BirdRec *  =  RECORD  sound *  :  ARRAY  10  OF  CHAR ;  END ;  DuckRec *  =  RECORD  ( BirdRec )  END ;  CuckooRec *  =  RECORD  ( BirdRec )  END ; Bird  =  BirdRecへのポインタ ; Cuckoo = CuckooRecへのポインタ; Duck = DuckRecへのポインタ;            VAR  pb  : ;  pc  : カッコウ;  pd  : アヒル; PROCEDURE  SetDuckSound *  ( bird  :  Duck );  BEGIN  bird . sound  : =  "Quack!"  END  SetDuckSound ; PROCEDURE  SetCuckooSound *  ( bird  :  Cuckoo );  BEGIN  bird . sound  : =  "Cuckoo!"  END  SetCuckooSound ; PROCEDURE  SetSound *  ( bird  :  Bird );  BEGIN  WITH  bird  :  Cuckoo  DO  SetCuckooSound ( bird )  |  bird  :  Duck  DO  SetDuckSound ( bird )  ELSE  bird . sound  : =  "Tweet!"  END  END  SetSound ;  新規開始( pc ); 新規( pd ); SetCuckooSound ( pc );  SetDuckSound ( pd ); Out . Ln ;  Out . String ( pc ^ . sound );  Out . Ln ;  Out . Ln ;  Out . String ( pd ^ . sound );  Out . Ln ; SetSound ( pc );  SetSound ( pd ); Out . Ln ;  Out . String ( pc ^ . sound );  Out . Ln ;  Out . Ln ;  Out . String ( pd ^ . sound );  Out . Ln ; (* -------------------------------------- *)  (* 動的な型をプロシージャに渡す *) pb  : =  pd ; SetDuckSound ( pb ( Duck ));  Out . Ln ;  Out . String ( pb ^ . sound );  Out . Ln ; pb  : =  pc ; SetCuckooSound ( pb (カッコウ) );  Out . Ln ;  Out . String ( pb ^ . sound );  Out . Ln ; (* -------------------------------------- *) SetSound ( pb ) ;  Out.Ln ; Out.String ( pb ^ .sound ) ; Out.Ln ;   pb  : =  pd ; SetSound ( pb ) ;  Out.Ln ; Out.String ( pb ^ .sound ) ; Out.Ln ;   (* -------------------------------------- *) 新着( pb ); SetSound ( pb ) ;  Out.Ln ; Out.String ( pb ^ .sound ) ; Out.Ln END PointerBirds .    

ISオペレーター

3つ目のアプローチは、IS演算子=を使用することです。これは、equals( )、greater( ) などと同じ優先順位を持つ関係演算子です>が、動的な型をテストします。ただし、他の2つのアプローチとは異なり、プログラマーは検出されたサブタイプにアクセスできません。

構文

ALGOLPascalModula-2 → Oberon → Component Pascal言語ファミリの開発は、言語構文の複雑さの低減を特徴としています。Oberon-2言語全体は、以下に示すように、拡張バッカス・ナウア記法のわずか33個の文法規則を用いて記述されています( Mössenböck & Wirth、1995年3月

Module =  MODULE ident ";"  [ ImportList ]  DeclSeq [ BEGIN StatementSeq ]  END ident "." . ImportList =  IMPORT [ ident ":=" ]  ident { ","  [ ident ":=" ]  ident }  ";" . DeclSeq =  {  CONST { ConstDecl ";"  }  |  TYPE { TypeDecl ";" }  |  VAR { VarDecl ";" }}  { ProcDecl ";"  |  ForwardDecl ";" }. ConstDecl =  IdentDef "="  ConstExpr . TypeDecl =  IdentDef "="  Type . VarDecl =  IdentList ":"  Type . ProcDecl =  PROCEDURE [ Receiver ]  IdentDef [ FormalPars ]  ";"  DeclSeq [ BEGIN StatementSeq ]  END ident . ForwardDecl =  PROCEDURE "^"  [ Receiver ]  IdentDef [ FormalPars ]. FormalPars =  "("  [ FPSection { ";"  FPSection }]  ")"  [ ":"  Qualident ]. FPSection =  [ VAR ]  ident { ","  ident }  ":"  Type . Receiver =  "("  [ VAR ]  ident ":"  ident ")" . Type =  Qualident  |  ARRAY [ ConstExpr { ","  ConstExpr }]  OF Type  |  RECORD [ "(" Qualident ")" ]  FieldList { ";"  FieldList }  END  | POINTER TO Type  |  PROCEDURE [ FormalPars ]. FieldList =  [ IdentList ":"  Type ]. StatementSeq =  Statement { ";"  Statement }. Statement =  [  Designator ":="  Expr  |  Designator [ "("  [ ExprList ]  ")" ]  |  IF Expr THEN StatementSeq { ELSIF Expr THEN StatementSeq }  [ ELSE StatementSeq ]  END  |  CASE Expr OF Case { "|"  Case }  [ ELSE StatementSeq ]  END  |  WHILE Expr DO StatementSeq END  |  REPEAT StatementSeq UNTIL Expr  |  FOR ident ":="  Expr TO Expr [ BY ConstExpr ]  DO StatementSeq END  |  LOOP StatementSeq END  |  WITH Guard DO StatementSeq { "|"  Guard DO StatementSeq }  [ ELSE StatementSeq ]  END  |  EXIT  |  RETURN [ Expr ]  ]. Case =  [ CaseLabels { ","  CaseLabels }  ":"  StatementSeq ]. CaseLabels =  ConstExpr [ ".."  ConstExpr ]. Guard =  Qualident ":"  Qualident . ConstExpr =  Expr . Expr =  SimpleExpr [ Relation SimpleExpr ]. SimpleExpr =  [ "+"  |  "-" ]  Term { AddOp Term }. Term =  Factor { MulOp Factor }.係数 = 指定子[ "("  [ ExprList ]  ")" ]  | 数値| 文字| 文字列|  NIL | セット|  "(" Expr ")"  |  "~" 係数. Set =  "{"  [ Element { ","  Element }]  "}" . Element =  Expr [ ".."  Expr ] . Relation =  "="  |  "#"  |  "<"  |  "<="  |  ">"  |  ">="  |  IN |  IS . AddOp =  "+"  |  "-"  |  OR . MulOp =  "*"  |  "/"  |  DIV |  MOD |  "&" . Designator =  Qualident { "."  ident |  "["  ExprList "]"  |  "^"  |  "("  Qualident ")" } . ExprList =  Expr { ","  Expr } . IdentList =  IdentDef { ","  IdentDef } . Qualident =  [ ident "." ]  ident . IdentDef =  ident [ "*"  |  "-" ] .

実装

ETHが管理する Oberon-2 コンパイラには、WindowsLinuxSolarismacOS用のバージョンが含まれます

Oxford Oberon-2コンパイラはネイティブマシンコードにコンパイルされ、Windows、Linux、macOSでJITを使用できます。Mike Spiveyによって開発・保守されており、Keiko仮想マシンを使用しています。[4] [5]

英国マンチェスター大学のSte​​phen J. Bevan氏によるOberon-2 LexスキャナとYacc パーサは、Mössenböck氏とWirth氏の参考文献に記載されているものをベースにしています。バージョンは1.4です。

Native Oberonというリリースがあり、これにはオペレーティング システムが含まれており、PC クラスのハードウェア上で直接起動できます。

いくつかのマイナーな .NET 関連の拡張機能が追加された Oberon の .NET 実装が ETHZ で開発されまし

Programmer's Open Workbench (POW!) [6]は非常にシンプルな統合開発環境であり、エディタ、リンカ、Oberon-2コンパイラが付属しています。Windows実行ファイルにコンパイルされます完全なソースコードが提供されており、コンパイラはOberon-2で記述されています。

Java to Oberon Compiler (JOB) は、ロシアのヴォログダ大学で開発されました。このコンパイラは、Java クラスファイル (バイトコード) の形式でオブジェクトコードを生成します。JOB 固有のクラスもいくつか提供されており、これらは Java と互換性がありながら、より Oberon に似たコンポーネント階層構造を採用しています。

最適化 Oberon-2 コンパイラは、プログラム生成にGNU コンパイラ コレクション(GCC) ツールチェーンを使用して C にコンパイルします。

Oberon Scriptは、Oberon言語全体をJavaScriptに変換するコンパイラです。このコンパイラはJavaScriptで記述されているため、Webページから呼び出してOberonで記述されたスクリプトを処理できます。

XDS Modula2/Oberon2は、ロシアのノボシビルスクにあるExcelsior LLCが開発した開発システムです。Intel Pentium向けの最適化コンパイラ、またはクロスプラットフォームソフトウェア開発用の「via-C」トランスレータを搭載しています。WindowsとLinuxで利用可能です。コンパイラはOberon-2で記述されており、自動的にコンパイルされます。

Oberon Revivalは、Oberon 2とComponent PascalBlackBox Component Builder )をLinuxとWin32に移植するプロジェクトです。BlackBoxのLinux版はこれまで利用できず、当初はMicrosoft Windowsでのみ動作していました。

XOberon は、Oberon-2 で書かれた、 PowerPC用のリアルタイム オペレーティング システムです。

ポータブルOberon-2コンパイラ(OP2)は、Oberonシステムを市販のプラットフォームに移植するために開発されました。[7]

Keikoバイトコード

Oberon-2はKeiko仮想マシンをターゲットにすることができます。[8] [9]たとえば、他の言語コンパイラ(O-codep-codeなどを参照)と同様に、Oxford Oberon-2コンパイラは最初に中間バイトコード(Keikoバイトコード)にコンパイルします。この中間バイトコードはバイトコードインタープリタで解釈することも、ジャス​​トインタイムコンパイルを使用することもできます。

参照

参考文献

  1. ^ 「関連文献」ドクター・ドブス著
  2. ^ Pfister, Cuno (2001). 「Component Pascalの新機能(Oberon-2からCPへの変更点)」(PDF) . Oberon microsystems . 2011年5月15日時点のオリジナル(PDF)からアーカイブ。 2007年1月10日閲覧
  3. ^ OberonとOberon-2の違い、MössenböckとWirth (1993)
  4. ^ Spivey, Michael (2014). 「Keiko の仕様」. Spivey's Corner (Report). オックスフォード大学オリエル・カレッジ. 2016年3月4日時点のオリジナルよりアーカイブ。 2023年7月9日閲覧
  5. ^ Spivey, Michael (2020年9月30日). OBC: Keiko抽象マシンの設計概要. Spivey's Corner (レポート). オックスフォード大学オリエル・カレッジ. 2023年7月9日閲覧. Oxford Oberon-2コンパイラは、ソースプログラムをスタックベースの抽象マシンのコードに変換します。… Keikoマシン。
  6. ^ Collingbourne, H. (2000年2月). 「パスカルの発明者は次に何をしたのか」. PC Plus . No. 160.
  7. ^ Crelier, Régis (1994). Separate Compilation and Module Extension (PhD). ETH Zurich. doi :10.3929/ethz-a-000945227. hdl :20.500.11850/141604 . 2018年11月18日閲覧
  8. ^ マイケル・スパイビー博士。「ケイコの仕様」。
  9. ^ マイケル・スパイビー博士。「OBC:Keiko抽象マシンの設計概要」。引用:「オックスフォード・オベロン2コンパイラは、ソースプログラムをスタックベースの抽象マシンであるKeikoマシンのコードに変換します。」

さらに読む

  • ETHZで管理されている「オベロン語系図
  • 「第2回国際Modula-2会議」、1991年9月。
  • ModulaからOberonへ Archived 23 February 2014 at the Wayback Machine Wirth (1990)
  • Oberonでのプログラミング - Modula-2でのプログラミングの派生版 Wirth (1982)
  • プログラミング言語 オベロン・ワース (1990)
  • The Programming Language Oberon-2 H. Mössenböck、N. Wirth、Institut für Computersysteme、ETH Zurich、1992 年 1 月、および Structured Programming (1991) 12(4): 179-195。
  • 電子版を含む様々な参考文献
  • Oberon-2におけるオブジェクト指向プログラミング Hanspeter Mössenböck (1994)。(ヨハネス・ケプラー大学からSpringer-Verlagの許可を得てPDF形式で入手可能)
  • Oberon-2とComponent Pascalのデザインパターン
  • プロジェクト・オベロン オペレーティングシステムとコンパイラの設計 Niklaus Wirth & Jürg Gutknecht (2005)
  • プロジェクト・オベロン オペレーティングシステムとコンパイラの設計 Niklaus Wirth & Jürg Gutknecht (2013)
  • 公式ウェブサイト、ETHチューリッヒ
  • ETH チューリッヒの Oberon リファレンス ページ
  • リンツの南南西にあるオベロン
  • Powチュートリアル(ルーマニア語)、Dan Popa著
  • Oberon-2反射モデルとその応用
Retrieved from "https://en.wikipedia.org/w/index.php?title=Oberon-2&oldid=1320902140"