オベロンは死んでいる、長生きするオベロン! パート1。

Oberonファミリーのプログラミング言語は、IT業界で顕著なマークを残しましたが、主流に侵入することは予定されていませんでした。 ただし、これらの言語(さまざまなソリューションと開発環境の両方のソフトウェアフレームワークである)で記述されたオペレーティングシステムとプログラミング言語自体は、今日まで教育、研究、産業分野で使用され、創造性と実験を強制し、新しい開発と吸収を行っています業界のトレンドとそれに影響を与えます。



このレビュー記事では、 Active Oberon言語とこの言語で書かれたA2オペレーティングシステムに関する一連の記事を開きます。



だから、会う-アクティブオベロン



Active Oberonに関する最初の出版物は1997年に登場しましたが、この言語とその実装が以前に登場したことは明らかです。 長年にわたり、言語には多くの変更があり、ランタイム環境が再設計され、オペレーティングシステムA2が記述されています...



他のプログラミング言語と区別する言語の機能は、アクティブオブジェクト(実行の流れをカプセル化するオブジェクト)の概念です。 Active Oberonは、オブジェクトタイプObject、オブジェクト(ストリーム)に関連付けられたActivityの概念、および同時アクセスからの同期と保護メカニズムを導入することにより、Oberon言語を拡張します。 このようなメカニズムを言語レベルで実装することにより、マルチスレッドアプリケーションの開発と実装を簡素化し、保護と同期の問題に関連するエラーの数を減らすことができます。



インポートセクションでは、プラグインはエイリアスを持つことができ、異なるモジュールは同じエイリアスを持つことができ、複数のモジュールから一種の名前空間を形成します。 そのようなモジュールでは、エクスポートされたエンティティの名前が重複してはなりません。



例:

IMPORT Example := Example1, Example := Example2;
      
      





Active Oberonは、改良された配列(数学およびテンソル)、構造配列(改良された配列と互換性のあるオブジェクト)、複合型、オブジェクトの操作、改良された配列と複合型、モジュールプロシージャとオブジェクトメソッドの両方と互換性のあるデリゲートを実装します。 多重継承の代わりに、インターフェースの多重継承の概念が使用されます。



開発プロセスにおける言語の構文は実質的に変更されません-代わりに、セマンティック修飾子が導入され、言語に存在する構文構造のセマンティクスが変更されます。 修飾子のリストは中括弧{}で囲まれています。



そのため、デリゲートを記述するために、DELEGATEプロシージャ修飾子が使用されます。

 Example1 : PROCEDURE{DELEGATE, REALTIME} ( VAR parameter : LONGINT ) : BOOLEAN;
      
      





この例では、デリゲートを指すプロシージャ変数Example1について説明します。これは、参照によってlong integer型の変数を受け取り、論理型の値を返すプロシージャまたはリアルタイムメソッドです。



メソッドはオブジェクト内に記述されます。 Active Oberonのすべてのメソッドは仮想です。 &記号が前に付いたメソッドはコンストラクターであり、オブジェクトの作成時に自動的に呼び出されます。 コンパイラは、参照型のエンティティを作成するように設計されたNEW組み込みプロシージャの呼び出しシグネチャに基づいて、必要なコンストラクタを選択します。 オブジェクトとメソッドには、明確なセマンティクスを備えたABSTRACTおよびFINAL修飾子も含めることができます。 操作(演算子)はオブジェクトレベルとモジュールレベルの両方で記述できますが、一部の演算子はオブジェクトレベル(少なくとも現在の実装)でのみ記述されています。



アクティブオブジェクトとマルチスレッドモデル


オブジェクトはボディを持つことができます-オブジェクトが初期化された後に実行されるステートメントの最終ブロック。 オブジェクトの本体がACTIVE修飾子で(場合によっては優先順位で)マークされている場合、そのようなオブジェクトはアクティブと呼ばれます。 既に述べたように、アクティビティ(ストリーム)はオブジェクトにカプセル化され、アクティブなオブジェクトのインスタンス化時に作成されます。 アクティビティは、アクティブなオブジェクトの本体の実行中に存在します。 アクティブなオブジェクトは、そのオブジェクトへのリンクがない場合でも、そのアクティビティが存在する限り存在し続け、その後はパッシブになり、通常の方法で破棄できます。



アクティビティ間の通信は、アクティブオブジェクトと非アクティブオブジェクトのメソッドの呼び出しを通じて実行されます。



オブジェクト状態への同時アクセスに対する保護は、排他的領域(排他的領域)の言語レベルでのサポートによって提供されます。これは、重要なBrinch Hansenエリアの概念に対応する、EXCLUSIVE修飾子でマークされたBEGIN ... END演算子ブラケットで囲まれた一連の演算子です。 モノポリー領域がオブジェクトのボディ全体をカバーする場合、モノポリー領域と呼ばれ、ハンセンのクリティカル領域の概念とホーアモニター手順の概念を組み合わせます。 Hoarの監視手順とは異なり、オブジェクトメソッドは排他的である必要はなく、オブジェクトの非同期状態を監視できます。 モジュールは、単一のインスタンスを持つオブジェクトと見なされます。 コンパイラーとランタイム環境は、一度に複数のアクティビティが独占領域に存在できないようにします。



したがって、Active Oberonの保護モデルは、オブジェクトのインスタンスにあるモニター(インスタンスベースのモニター)です。



モニターの主なアイデアは、不変式がモニターに関連付けられていることです。これは、内部の一貫した状態を決定し、その動作の正確さを証明する式です。 オブジェクトの初期化子は不変式を確立し、独占メソッドがそれをサポートします。



Active Oberonでの同期には、AWAIT演算子が使用されますが、ほとんどのモニター実装では、Hansenキューに基づくHoare条件変数が使用されます。 AWAIT演算子は、アクティビティが中断される非準拠の場合、引数として実行継続の論理条件を取り、キャプチャされた排他領域は式条件が真になるまで解放されます。 以前にリリースされた独占セクションに再び入ることができる場合、アクティビティは引き続き機能します。 継続条件は、アクティビティが独占セクションを離れる場合にのみ再集計されます。



アクティブなオブジェクトの説明と独占セクションの使用例:



 TYPE Timer* = OBJECT VAR timer: Objects.Timer; handler: Objects.EventHandler; timeout, running: BOOLEAN; PROCEDURE &Init*; BEGIN NEW(timer); timeout := FALSE; running := TRUE; END Init; PROCEDURE SetTimeout*(h: Objects.EventHandler; ms: LONGINT); BEGIN handler := h; Objects.SetTimeout(timer, HandleTimeout, ms) END SetTimeout; PROCEDURE CancelTimeout*; BEGIN Objects.CancelTimeout(timer); END CancelTimeout; PROCEDURE HandleTimeout; BEGIN {EXCLUSIVE} timeout := TRUE END HandleTimeout; PROCEDURE Finalize*; BEGIN {EXCLUSIVE} Objects.CancelTimeout(timer); running := FALSE END Finalize; BEGIN {ACTIVE} WHILE running DO LOOP BEGIN {EXCLUSIVE} AWAIT(timeout OR ~running); IF ~running THEN EXIT END; timeout := FALSE END; handler() END END END Timer;
      
      





メモリ管理。



Active Oberonは、リアルタイムガベージコレクターを使用した自動メモリ管理を使用します。 これは、リアルタイムアクティビティがガベージコレクションプロセスを停止できることを意味します。 リアルタイムコードの領域では、メモリ割り当て操作はコンパイラによって禁止されています。 リアルタイムの手順、メソッド、およびアクティビティには、REALTIME修飾子が付いています。 すべてのコンパイラおよびランタイム実装がリアルタイムプロセスをサポートしているわけではありません。



UNTRACED修飾子でマークされた変数は追跡されないポインターであり、自動メモリ管理メカニズムによって追跡されません。



DISPOSEステートメントは言語で構文的にサポートされていますが、その実装は存在しない場合があります。



これでActive Oberonのレビュー記事は終わりです。古典的なOberonでデートを始めることをお勧めします。



参照:





シリーズコンテンツ






All Articles