Oberon は、 1987 年にNiklaus Wirthによって初めて公開された汎用プログラミング言語であり、 ALGOLライクな言語の Wirthian ファミリー ( Euler、ALGOL W、Pascal、Modula、Modula-2 )の最新メンバーです。[ 1 ] [ 2 ] [ 3 ] [ 4 ] Oberon は、 Pascalの直接の後継であるModula-2のパワーを増強し、同時に複雑さを軽減するという集中的な努力の結果です。その主な新機能は、レコード型のデータ型拡張の概念です。[ 5 ]これにより、既存のデータ型に基づいて新しいデータ型を構築し、それらを関連付けることができ、データの厳密な静的型付けの教義から逸脱します。型拡張は、親サイトの観点を反映した Wirth の継承方法です。Oberon は、スイスのETH ZurichでOberonという名前のオペレーティングシステムの実装の一部として開発されました。その名前は、ボイジャー探査機が撮影した天王星の衛星オベロンの写真と、オベロンがエルフの王として有名であることの両方に由来している。[ 6 ]
OberonはWirthによってメンテナンスされており、最新のProject Oberonコンパイラのアップデートは2020年3月6日付けです。[ 7 ]
Oberonは、アルバート・アインシュタインの「物事をできる限りシンプルにせよ、しかしそれ以上シンプルにしてはならない」というモットーを念頭に置いて設計されています。主な指針は、基本的で不可欠な機能に集中し、一時的な問題は省略することでした。また、 C++やAdaなどの言語における複雑性の増大も考慮に入れました。これらとは対照的に、Oberonはライブラリの概念を用いて言語を拡張することを重視しています。Modula-2に存在した列挙型とサブレンジ型は省略され、セット型は整数の集合に限定されています。インポートされたすべての項目は、宣言されたモジュールの名前で修飾する必要があります。低レベルの機能は、SYSTEMその識別子をインポートリストに含むモジュールでのみ使用できるようにすることで強調されています。モジュール間をまたいだ厳密な型チェック、実行時のインデックスチェック、ヌルポインタチェック、および安全な型拡張の概念により、プログラミングは言語規則のみに大きく依存することができます。
この戦略の意図は、学習しやすく、実装が簡単で、非常に効率的な言語を生み出すことでした。Oberonコンパイラは、コンパクトで高速であると同時に、商用コンパイラに匹敵するコード品質を提供すると評価されています。[ 8 ]
オベロン語の特徴的な要素には以下が含まれます。[ 9 ]
Oberonは、抽象化や異種構造の構築のためにレコード型の拡張をサポートしています。後のOberon-2やActive Oberonといった方言とは異なり、オリジナルのOberonには言語機能としてのディスパッチ機構はありませんが、プログラミング手法またはデザインパターンとしてディスパッチ機構が存在します。これにより、オブジェクト指向プログラミングにおいて大きな柔軟性が得られます。Oberonオペレーティングシステムでは、ディスパッチ呼び出しにメソッドスイートとメッセージハンドラという2つのプログラミング手法が併用されます。
この手法では、プロシージャ変数のテーブルが定義され、拡張モジュール内でこの型のグローバル変数が宣言され、汎用モジュール内で再度割り当てられます。
モジュール図;(*抽象モジュール*)TYPE Figure* = FigureDescへのポインタ; Interface* = InterfaceDescへのポインタ。 InterfaceDesc* = RECORD draw* : PROCEDURE (f : Figure); clear* :手順(f : 図); マーク*:手順(f:図) move* : PROCEDURE (f : Figure; dx, dy : INTEGER ); END ; 図の説明* =レコード if : インターフェース; 終わり; PROCEDURE Init* (f : Figure; if : Interface); BEGIN f.if := if 初期化終了; 手順Draw* (f : Figure); BEGIN f.if.draw(f) 描画終了;(※その他の手順はこちら)終了。
汎用型Figureを特定の形状に拡張します。
モジュール:長方形; インポート数値; TYPE Rectangle* = RectangleDescへのポインタ; 長方形の説明* =レコード (図.図の説明) x, y, w, h : INTEGER ; END ; バラ if : Figures.Interface; PROCEDURE New* ( VAR r : Rectangle); BEGIN NEW (r); Figures.Init(r, if) END新規; 手順Draw* (f : Figure); VAR r:長方形 BEGIN r := f(Rectangle); (* f AS Rectangle *) (* ... *) END Draw; (※その他の手順はこちら)BEGIN (* モジュールの初期化 *) NEW (if); if.draw := Draw; if.clear := Clear; if.mark := Mark; if.move := Move 長方形の終了。
動的ディスパッチは、汎用モジュールである Figures モジュール内のプロシージャを介してのみ行われます。
この手法は、複数の手法を単一の手順に置き換えることで、様々な手法を区別できるようにするものである。
モジュール図;(*抽象モジュール*)TYPE Figure* = FigureDescへのポインタ; メッセージ* =レコード終了; DrawMsg* = RECORD (Message) END ; ClearMsg* = RECORD (Message) END ; MarkMsg* = RECORD (Message) END ; MoveMsg* = RECORD (Message) dx*, dy* : INTEGER END ; Handler* = PROCEDURE (f : 数値; VAR msg : メッセージ); 図の説明* =レコード(*要約*) ハンドル: ハンドラー; 終わり; PROCEDURE Handle* (f : Figure; VAR msg : Message); BEGIN f.handle(f, msg) ハンドル終了; PROCEDURE Init* (f : Figure; handle : Handler); BEGIN f.handle := handle 初期化終了; 終了。
汎用型Figureを特定の形状に拡張します。
モジュール:長方形; インポート数値; TYPE Rectangle* = RectangleDescへのポインタ; 長方形の説明* =レコード (図.図の説明) x、y、w、h:整数。 終わり; PROCEDURE Draw* (r : Rectangle); BEGIN (* ... *) END Draw; (※その他の手順はこちら)PROCEDURE Handle* (f: Figure; VAR msg: Figures.Message); VAR r:長方形 始める r := f(Rectangle); IF msg IS Figures.DrawMsg THEN Draw(r) ELSIF msg IS Figures.MarkMsg THEN Mark(r) ELSIF msg IS Figures.MoveMsg THEN Move(r, msg(Figures.MoveMsg).dx, msg(Figures.MoveMsg).dy) ELSE (* 無視 *) END END Handle; PROCEDURE New* ( VAR r : Rectangle); BEGIN NEW (r); Figures.Init(r, Handle) END新規; 長方形の終了。
Oberonオペレーティングシステムでは、これらの2つの手法が動的ディスパッチに使用されます。1つ目は既知のメソッドセットに使用され、2つ目は拡張モジュールで宣言された新しいメソッドに使用されます。たとえば、拡張モジュールRectanglesが新しいRotate()プロシージャを実装した場合、Figuresモジュール内ではメッセージハンドラを介してのみ呼び出すことができます。
Oberon(プログラミング言語)とOberon(オペレーティングシステム)の無償実装はインターネット上で入手可能です(ETHZ自身が提供しているものもいくつかあります)。
最初のリリース仕様にいくつかの変更が加えられました。たとえば、オブジェクト指向プログラミング(OOP) 機能が追加され、FORループが復活しました。その結果がOberon-2です。オペレーティングシステムを含むNative Oberonというリリースがあり、IBM PC 互換クラスのハードウェアで直接起動できます。ETHZでは、.NET 関連のマイナーな拡張機能を追加した Oberon の.NET実装も開発されました。1993 年に、ETHZ大学のスピンオフ企業がOberon-Lという Oberon-2 の方言を市場に投入しました。1997 年に、Component Pascalと改名されました。
ETHが開発したOberon-2コンパイラには、Microsoft Windows、Linux、Solaris、および従来のMac OS用のバージョンがあります。他のソースからの実装は、 Atari TOSやAmigaOS [ 10 ]を含む他のいくつかのオペレーティングシステムにも存在します。
英国マンチェスター大学のStephen J Bevan氏が、 MössenböckとWirthの文献にあるものを基に開発したOberon-2 LexスキャナおよびYaccパーサーが存在する。バージョンは1.4である。
その他のコンパイラには、Oberon-07も理解するOxford Oberon-2 [ 11 ]やVishap Oberon [ 12 ]などがあります。後者は、Josef TemplのOberonからC言語へのソース間コンパイラ(トランスパイラ)であるOfront [ 13 ]に基づいており、 OfrontはETHZのRegis Crelierが開発したOP2コンパイラに基づいています。
2007 年に Niklaus Wirth によって定義され、2008 年、2011 年、2013 年、2014 年、2015 年、2016 年に改訂された Oberon-07 は、Oberon-2 ではなく、Oberon のオリジナル バージョンに基づいています。主な変更点は次のとおりです。明示的な数値変換関数 (例: 、FLOORおよびFLT) を使用する必要があります。WITH、LOOPおよびEXITステートメントは省略されました。WHILEステートメントが拡張されました。CASEステートメントは、型拡張テストに使用できます。RETURNステートメントは、関数の末尾にのみ接続できます。インポートされた変数と構造化された値パラメータは読み取り専用です。配列は、を使用せずに代入できますCOPY。[ 14 ]
Oberon-07 コンパイラは、さまざまなコンピュータ システムで使用するために開発されました。Wirth 氏のコンパイラは、彼自身が設計した縮小命令セット コンピュータ(RISC) プロセッサを対象としており、これはXilinxフィールド プログラマブル ゲート アレイ(FPGA) Spartan-3 ボード上でProject Oberonオペレーティングシステムの 2013 年版を実装するために使用されました。RISC プロセッサの FPGA Spartan-6、Spartan-7、Artix-7 への移植版、および Windows 用 RISC エミュレータ (Linux およびmacOSでコンパイル可能、Windows 用バイナリも利用可能) も存在します。OBNCはC 言語でコンパイルされ、あらゆる Portable Operating System Interface ( POSIX ) 互換オペレーティングシステムで使用できます。商用Astrobe実装は、STM ARM Cortex-M0、M3、M4、M7、および Raspberry Pi RP2040 および RP2350 マイクロコントローラを対象としています。Patchouliコンパイラは64 ビット Windows バイナリを生成します。Oberon-07M は32 ビット Windows バイナリを生成し、言語のリビジョン 2008 を実装します。AkronはWindows と Linux の両方のバイナリを生成します。OberonJSはOberon をJavaScriptに変換します。Oberonにはオンライン IDEがあります。oberoncはJava 仮想マシンの実装です。
Active Oberonは Oberon のもう 1 つのバリアントで、オブジェクト (オブジェクト中心のアクセス保護とローカルアクティビティ制御付き)、システム保護アサーション、プリエンプティブ優先度スケジューリング、およびメソッドの構文の変更 ( Oberon の語彙では型バインドプロシージャという名前) が追加されています。オブジェクトはアクティブになることができ、これは、オブジェクトがスレッドまたはプロセスになる可能性があることを意味します。さらに、Active Oberon には演算子 (オーバーロードを含む) を実装する方法、配列を使用するための高度な構文 ( OberonX 言語拡張機能(2016 年 3 月 4 日にWayback Machineにアーカイブ済み)および2006 年オックスフォードで開催された第 7 回合同モジュラー言語会議の議事録[ 15 ]を参照) があり、名前空間について知っています。[ 16 ]オペレーティングシステムA2 (以前はActive Object System (AOS) [ 17 ] 、その後Bluebottle )、特にカーネルは、さまざまなアクティブオブジェクトを同期および調整します。
ETHZは、アクティブオブジェクトをサポートするActive Oberonをリリースしました。Active Oberonは、アクティブオブジェクト、およびそれに基づくオペレーティングシステム(Active Object System(AOS)、Bluebottle、A2)、そして言語環境(JDK、HTTP、FTPなど)をサポートしています。ETHZのこれまでの多くの設計と同様に、これらのバージョンはインターネットからダウンロードできます。2003年現在、サポートされているCPUは、シングルコアおよびデュアルコアのx86、そしてStrongARMです。
このファミリーの言語の開発は継続されました。Oberon-2 のさらなる拡張版は、当初 Oberon/L と名付けられましたが、後にComponent Pascal (CP) に改名されました。CP は、ETHZ からスピンオフした商用企業である Oberon microsystems によって Windows および従来の Mac OS向けに、またクイーンズランド工科大学によって .NET 向けに開発されました。さらに、 Lagoona [ 18 ] [ 19 ] [ 20 ]およびObliq言語は、Oberon メソッドを専門分野に拡張しています。
その後、ETHZにおける.NET開発は、Zonnonという新しい言語の開発に重点が置かれました。この言語はOberonの機能を取り入れ、Pascalの機能(列挙型、組み込み入出力など)も一部復活させていますが、構文上の違いがいくつかあります。その他の機能としては、アクティブオブジェクトのサポート、演算子オーバーロード、例外処理などが挙げられます。
Oberon-V(元々は小セネカにちなんでSenecaと名付けられていた)は、スーパーコンピュータ、特にベクトルまたはパイプラインアーキテクチャでの数値計算アプリケーション向けに設計されたOberonの子孫である。配列コンストラクタとステートメントが含まれているALL。[ 21 ]
{{cite magazine}}: CS1 maint: 数値名: 著者リスト (リンク)