== リージョン == リージョンは、セルのレイアウトを制御するものです。 ネームスペースの役割、すなわち一般名前有効範囲に境界を設ける役割も併せ持ちます。 さらにリージョン間のアクセス制御も行います。 【記述例】 {{{ [linkunit] // リンク単位属性の指定 region rServer { // リージョン cell tSysLog ServerSysLog { }; cell tCheckCode CheckCode { cCheckCode = rGuardedRegion::GuardedCell.eCheckCode; // ネームスペース識別子によるセル指定 }; [in_through(GuardCheckPlugin,""), out_through()] // スループラグインの指定 region rGuardedRegion { // 子リージョン cell tGuardedCodeHolder GuardedCell { cSysLog = ServerSysLog.eSysLog; // 外側のリージョンのセルの参照 }; }; }; }}} ここで region はキーワードであり、rServer はリージョン名です。'{', '}' で囲まれたセルを持ちます。 慣習としてリージョン名は 'r' で始めます。 同じリージョン名を持つリージョンを、繰り返し記述することができます。 ただし、リージョン指定子は、最初に現れたときに指定する必要があります。 リージョン名が同じリージョンが再び現れた場合、指定子を指定することはできません。 リージョンは再帰的に設けることができます。 異なるリージョンに存在するセルを参照する場合、ネームスペース識別子を用います。 【補足説明】リージョンはセルのレイアウトだけでなく、セルタイプコードのレイアウトも制御します。 セルの所在するところに、セルを操作するコード、すなわちセルタイプコードが必要となるためです。 これが、セルはリージョンに置き、セルタイプはネームスペースに置く理由です。 ネームスペースには、セルタイプコードの所在を制御する機能はなく、もっぱら名前衝突の回避に用いられます。 【補足説明】最初に指定する必要があるのは、他のリージョンのセルからリージョン内のセルが参照される前に、参照可能かどうか決定できる必要があるためです。 【補足説明】前方参照ができないため最初にリージョン指定子リストを指定する必要がある。現在の仕様では2回目に現れたときには、リージョン指定子を指定できない。 【補足説明】この文法のリージョンは、TECS CDL 記述では直観的にわかりやすくない。ただし、リージョンはむやみやたらに使えばよいものではなく、またリージョン境界を設けるところは何らかの理由により独立性を高くしたい箇所であり、リージョン間の結合はそれほど多くならないはずである。 【補足説明】記述例で用いた GuardCheckPlugin の実装例はありません。 === リージョン指定子 === リージョン指定子の凡例と指定内容を以下に示します。 ||= リージョン指定子の凡例 =||= 指定内容 =|| || in_through( プラグイン名, プラグイン引数 ) || リージョン内への結合の許可とプラグイン適用 || || in_through()                     || リージョン内への結合の許可 || || out_through( プラグイン名 , プラグイン引数 ) || リージョン外への結合の許可とプラグイン適用 || || out_through() || リージョン外への結合の許可 || || to_through( リージョン名, プラグイン名, プラグイン引数 ) || リージョン間の結合の許可とプラグイン適用 || || to_through() || リージョン間の結合の許可 || || node || ノード属性の指定 || || linkunit || リンク単位属性の指定 || || domain( ドメインタイプ名, オプション文字列 ) || ドメイン単位属性の指定 || || class( IDENTIFIER ) || クラス単位属性の指定 || 以上のうち in_through, out_through, to_through をまとめて、リージョンスルー指定子と呼びます。 node, linkunit, domain, class をリージョン属性と呼びます。 === リージョンスルー指定子 === リージョンスルー指定子は、リージョン外部のセルの呼び口からリージョン内部のセルの受け口へ、同様に内部から外部へ、リージョン から他のリージョンへの結合を許可します。 デフォルトでは、リージョンから他のリージョン(内側、外側を含む)への結合は、禁止されます。 in_through は、リージョンの外部からリージョンの内部への結合を許可し、プラグイン(plugin)により挿入すべきスルーセルを生成させます。 in_through は第一引数としてプラグイン名、第二引数としてプラグイン引数を取ります。 これらの引数が省略された場合には、リージョン外部から内部への結合を(スルーセルを生成させることなく)許可するものです。 in_through は1つのリージョンに複数指定できます。 複数指定された場合、順にプラグインが(指定されていれば)呼び出され、スルーセルが(プラグインにより生成されれば)挿入されます。 out_through は、リージョンの内部からリージョンの外部への結合を許可します。その他 in_through と同様です。 to_through は、兄弟リージョン間での結合を許可します。 to_through は、第一引数に結合可能なリージョン名、第二引数にプラグイン名、第三引数にプラグイン引数を指定します。 第一引数のリージョン名は、前方参照が可能です。 親リージョン、子リージョン、甥リージョン、叔父リージョン、いとこリージョンなど兄弟関係にはないリージョンは指定できません。 このため第一引数は単一の識別子となります。 in_through, out_through, to_through で生成されるスルーセルは、受け口側のセルおよびセルの受け口が同じである場合、共有されます。 【補足説明】ジェネレータの実装として、共有可能なスルーセルを共有しないオプションを設けてもよい。 === スルー指定子オプションの文字列置換 === スルー指定子のオプションは、以下の文字列置換が行われます。 ||= 置換文字列 =||= 置換後文字列 =|| || $source$ || 呼び元のセル名 || || $destination$ || 呼び先のセル名 || || $SOURCE$ || 呼び元のセル名 (リージョン名を '_' で連結したグローバル名) || || $DESTINATION$ || 呼び先のセル名 (リージョン名を '_' で連結したグローバル名) || || $next$ || 次のセル名[[BR]] 複数の through がつながっている場合、すぐ後ろに来るもの || || $NEXT$ || 次のセル名 (リージョン名を '_' で連結したグローバル名)[[BR]] 複数の through がつながっている場合、すぐ後ろに来るもの || || $start_region$ || $source$ のセルの存在するリージョン (グローバル名) || || $end_region$ || $destination$ のセルの存在するリージョン (グローバル名) || || $preferred_region$ || 適切なリージョン (グローバル名), start_region または end_region || || $count$ || リージョン間の through 指定子の適用数 || || $$ || $ に置換 || === リージョン属性 === リージョン属性は、リージョンの特性を示すもので、ノード、リンク単位、ドメイン、クラスの 4 種類があります。 リージョン属性は、必ずしも指定する必要がない、一方、一つのリージョンには、いずれか一つのリージョン属性を指定できます。 === ノード(node) === ノードは、通常一つのプロセッサとメモリから構成され、1つ以上のリンク単位を持ちます。 ノードを超えて直接結合することはできません。 ノードを超えて、呼び口と受け口を直接結合することはできないが、コンポーネント図上、またコンポーネント記述言語においては、接続 (connect) することができます。 この場合リージョン間のスループラグインにより、呼び口側、受け口側、それぞれに直接結合することなく接続させるためのコンポーネントを挿入することで実現されます。 実際に接続がどのように行われるかは、プラグインの仕様に依存します。 ノードが異なる場合、メモリ透過性がありません。 つまり、ポインタ値を渡したとしても、受け取った側では、ポインタ参照することができません。 このため引数がポインタ型である場合、ポインタの指すメモリ領域を渡す必要があります。 例えばオペイク RPC プラグインでは、通信チャンネルを使用することで、接続することができます。 オーバーヘッドが、通常の呼び出しに比べ非常に大きいため、頻繁な呼出しは適さないこと、上述のようにポインタ値を渡す場合、直接結合とは異なる振る舞いになる可能性があることに注意します。 TECS CDL においては、リージョンに node 指定子を指定することで、そのリージョンが一つのノードを構成することを示します。 node 指定されていないリージョンは、親リージョンのノードに属する。 ルートリージョンは、暗黙的に node が指定されます。 === リンク単位(linkUnit) === リンク単位は、リンカーにより一つのモジュールとして生成される単位です。 リンク単位を超えて直接結合することはできません。 ノードの場合と同様にリージョン間のスループラグインにより異なるリンク単位のセルに接続することができます。 リージョンに linkUnit 指定子を指定することで、そのリージョンが一つのリンク単位を構成することを示します。 linkUnit 指定されていないリージョンは、親リージョンのリンクユニットに属します。 ノードは、暗黙的にリンク単位と見なされます。 === ドメイン(domain) === ドメインは、TOPPERS/HRP2 カーネルの保護ドメインに対応させて、 リージョンを保護ドメインとして扱うことを念頭に置いたものです。 保護がどのように行われるかは、TECS 仕様としては規定しません。 ドメインタイプごとに定義される、ドメインプラグインの仕様により規定します。 また、ドメインプラグインの実装により、TOPPERS/HRP2 の保護ドメイン以外の保護機能にも対応できます。 TECS CDL においては、リージョンにドメイン指定子を指定することで、そのリージョンは、ドメインに属します。 リージョン名がドメイン名となる。 ドメイン指定されていないリージョンは、親リージョンのドメインに属します。 ドメイン指定子の第一引数は、ドメインタイプ名 (文字列ではなく、識別子) です。 ドメインタイプ名により識別されるドメインタイプは、親リージョンに波及します。 ただし、子リージョンから親リージョンへのドメインタイプの伝播は、ノードを超えません。 一つのノードにおいては、一つのドメインタイプに制限されます。 ルートリージョンは、いずれのドメインにも属さない、ドメイン外 (OutOfDomain) として扱われます。 従って、ドメインタイプの親リージョンへの波及は、ルートリージョンの直下のリージョンまでです。 ドメインタイプ名は、以下のようにドメインプラグイン名に変換されます。 {{{ (ドメインプラグイン名) = (ドメインタイプ名) + 'Plugin' }}} TOPPERS/HRP2 カーネルの保護ドメインに対応させる場合、ドメインタイプを HRP2 とします。プラグイン名は HRP2Plugin となります。 ドメイン指定子の第二引数は、オプション文字列です。 ドメインタイプ HRP2 では "trusted", "nontrusted" を指定します。 【補足説明】HRP2 ドメインの扱いについては、本書では詳細を説明しません。 === クラス(class) === 仕様未定である。TOPPERS/FMP カーネルのクラスに相当するものとして、予約されている。 T.B.W. === リージョン内セル === 【補足説明】リージョン内部文リストとリージョン内部文に分離されていない。 セル記述は、プロトタイプ宣言と定義のいずれも可能です。 ただし、セルのプロトタイプ宣言と定義の両方において、同じリージョンに属するように記述する必要があります。 === ビルド単位 === ノード、または、リンク単位 属性を持つリージョンごとに、ビルドを行います。 これは、例えば分散システムで、ある部分システムのをビルドすることを想定したものです。 * ビルド単位をまたいでリージョンの境界をまたぐ結合がないこと ただし、以下のリージョン間をまたぐスルーセルを使用した接続を持つことは可能です。 * スルーセルの内部のセルが、呼び側、受け側のいずれかのリージョンに属していること * スルーセルの内部のセルが、リージョンをまたぐ結合を持たないこと === 複数のシングルトンセルタイプのセル === シングルトンセルタイプのセルは、リンク単位ごとに、最大1つ置くことができます。 === ルートネームスペースとルートリージョン === ルートネームスペースは、いずれのネームスペース文の内側ではないところです。 ルートネームにのみ構造体 struct, 型定義 typedef, 定数変数 const の定義を置くことができます。 ルートリージョンは、いずれのリージョン文の内側ではないところです。 ルートネームスペースとルートリージョンは、共通した名前の空間を持ちます。 ----- [TECS リファレンスマニュアル [wiki: トップページ]]・ [TECS CDL リファレンスマニュアル [wiki:CDLref トップページ]・[wiki:CDLref_index 目次]]