• 検索結果がありません。

提案

ドキュメント内 九州大学学術情報リポジトリ (ページ 45-49)

第 3 章 RTCOP: C++ ベースのコンテキスト指向プ ログラミングフレームワークログラミングフレームワーク

3.3 提案

3

RTCOP: C++

ベースのコンテキスト指向プログラミングフレーム

ワーク

34

3

RTCOP: C++

ベースのコンテキスト指向プログラミングフレーム

ワーク

35

3.1 無効化可能なCOPの機能の一覧

!"#$%&$

'()*+,-./0$1 !

2345+

6 78 9

:;< =>?@AB CD-E(F +GHI"#$?@AB JK6 78 =>

:;< ,-./'L

?;'?MN?E

:;< ,-./'L?FO/ ,-./'L?P+

QRSFTUVW1!XYZ+;'?MN?E

[\]^6_`

abc#>d

proceed

は多くの既存の

COP

言語が備えている機能であり,アクティブ

なレイヤが複数ある時に,あるレイヤのパーシャルメソッドから別のレイ ヤのパーシャルメソッドやベースメソッドを実行する.例えば,JCOPにお いてα,βというレイヤを順番にアクティベートした場合,メソッドディス パッチ時には,初めにレイヤβのパーシャルメソッドが実行され,その中で

proceed

を用いると,レイヤαのパーシャルメソッドが実行される.同様に

レイヤαで

proceed

を行うとベースメソッドを実行する.

proceed

は複数の レイヤを扱う際に重要な機能だが,この仕組みを実現するためには,レイヤ 間の関係を意識したアクティベーション・メソッドディスパッチが必要とな るため,実行時間やメモリ使用量の増加につながる.

レイヤ固有のメンバ変数は,カプセル化によってレイヤの再利用性向上が 期待できる.一方で,インスタンス化時に,この変数を扱うためのメモリ領 域の確保や,プログラム中で使用可能にするための準備が必要になるため,

メモリ使用量や実行時間の増加が問題である.

レイヤアクティベーションイベントハンドラは,レイヤアクティベーショ ン・ディアクティベーション時に,ユーザ定義の振る舞いを実行させるため に必要だが全てのレイヤで必要となるとは限らない.必要のないレイヤでイ ベントハンドラの機能を無効にすることで,メモリ使用量を節約する.

性能

(2)

は性能が求められる組込みソフトウェアへの適用を可能とするために 重要である.

COP

の性能決定の要因として,

2.6

節で述べた

COP

のための メソッドディスパッチの実現方法が挙げられる.

2.6

節で述べた通り,プロ

3

RTCOP: C++

ベースのコンテキスト指向プログラミングフレーム

ワーク

36

キシオブジェクトを介する方法はメソッドディスパッチ時にオーバヘッドが かかり,仮想関数テーブルの書き換えではレイヤアクティベーション時に オーバヘッドがかかる.

本研究では,メソッドディスパッチにかかるオーバヘッドを削減するため に,後者の方法を採用した.組込みシステムの振る舞い変更では,使用する ハードウェアの切り替えがボトルネックとなり得るため,レイヤアクティ ベーションの時間よりもメソッドディスパッチの時間を削減するほうが効果 的である.

レイヤアクティベーションの方法

2.6

節の後半で述べた通り,レイヤアクティベーションの方法は

3

種類あ る.本研究では,イベント駆動で影響範囲が大域的なアクティベーションを 目指している.この方式は,レイヤアクティベーションやコンテキスト推定 が散在しないため,近年組込みシステム開発で流行している分散システムへ の適用に向いている43)

提案フレームワークでは,イベント駆動方式の前の基礎として,決定的な アクティベーションを採用している.この方式は,宣言的ではなくプログラ ム中にアクティベーション命令を直接記述するところがイベント駆動と異 なる.イベント駆動よりも実装しやすく,任意のタイミングでアクティベー ションが行えるために性能評価を行いやすいため,今回の提案で採用した.

将来的には,イベント駆動によるアクティベーション記述を追加すること で,イベント駆動方式にすることを目指している.

3.3.2 プログラムの記述例

本節では,3.3.1項で示した

COP

の要素や、提案フレームワークが備える 固有の機能を用いた際のプログラムを示し,提案フレームワークの持つ機能 を明確にする.

3.1

はベースクラスとレイヤの定義,レイヤアクティベーションによる 振る舞い変更のプログラム記述例である.これらのうち,レイヤ定義はレイ ヤ記述というプログラムで専用の記法を用いることで行う.これは,既存資

3

RTCOP: C++

ベースのコンテキスト指向プログラミングフレーム

ワーク

37

ͬͬ

䝧䞊䝇䜽䝷䝇

;нн

䝥䝻䜾䝷䝮

Ϳ ĐůĂƐƐ,ĞůůŽ΂

ƉƵďůŝĐ͗ ǀŝƌƚƵĂůǀŽŝĚWƌŝŶƚ;Ϳ ΂ ĐŽƵƚ фф͞,ĞůůŽίŶ͖͟

΃

΃͖

ͬͬ

᪥ᮏㄒ䝺䜲䝲

;

䝺䜲䝲グ㏙

Ϳ ηŝŶĐůƵĚĞ͞,ĞůůŽ͘Ś͟

ůĂLJĞƌ:ĂƉĂŶĞƐĞ΂

ͬͬ䜲䝧䞁䝖䝝䞁䝗䝷

΀ǀĞŶƚ,ĂŶĚůĞƌ;ĐƚŝǀĂƚĞĚͿ΁

ƉƵďůŝĐ͗ǀŽŝĚKŶĐƚŝǀĂƚŝŶŐ;Ϳ΂͙΃

ĐůĂƐƐ,ĞůůŽ΂

ͬͬ䝺䜲䝲ᅛ᭷䝯䞁䝞 ƉƌŝǀĂƚĞ͗ŝŶƚ ͺŽƵŶƚ͖

ͬͬ

䝟䞊䝅䝱䝹䝯䝋䝑䝗

ƉƵďůŝĐ͗ǀŽŝĚWƌŝŶƚ;Ϳ ΂

ĐŽƵƚ фф͞䛣䜣䛻䛱䛿ίŶ͖͟

ннͺŽƵŶƚ͖

ƉƌŽĐĞĞĚ;Ϳ͖

΃

΃͖

΃͖

ͬͬ䝺䜲䝲䜰䜽䝔䜱䝧䞊䝅䝵䞁 ;ннͿ

ηŝŶĐůƵĚĞ͞ZdKW͘Ś͟

ηŝŶĐůƵĚĞ͞,ĞůůŽ͘Ś͟

ηŝŶĐůƵĚĞ͞:ĂƉĂŶĞƐ͘Ś͟

ŝŶƚ ŵĂŝŶ;Ϳ΂

,ĞůůŽΎŚĞůůŽсĐŽƉŶĞǁф,ĞůůŽх;Ϳ͖

ŚĞůůŽͲхWƌŝŶƚ;Ϳ͖

ĂĐƚŝǀĂƚĞ;:ĂƉĂŶĂƐĞͿ͖

ŚĞůůŽͲхWƌŝŶƚ;Ϳ͖

΃͖

3.1 RTCOPのプログラム記述例

産の活用や学習コストの軽減を目的としている.レイヤの定義以外は

C++

プログラムとして記述する.また,レイヤではアクティベーション時に実行 されるイベントハンドラを定義することもできる.これは,アクティベー ション時に実行したいメソッドに

RTCOP

専用のアノテーションを付ける ことで行う.

図の例は

Hello

というベースクラスを

C++

で定義している.メソッド

ディスパッチの実現方法の関係から,ベースメソッドの

Print

は仮想関数で ある.レイヤ記述では,Japaneseというレイヤを定義しており,その中で

Hello

クラスのパーシャルクラスを定義している.パーシャルクラスでは,

レイヤ固有のメンバ変数や

Print()

メソッドのパーシャルメソッドを定義し ている.ここで表

3.1

の機能について使わないものについては,外すことが 可能となっている.

main()

メソッドでは,3.4節で述べる実装方法の関係上,Helloクラスの

3

RTCOP: C++

ベースのコンテキスト指向プログラミングフレーム

ワーク

38

インスタンス化時に

copnew

という特別な機能を使っている.その後の行で レイヤアクティベーションの前後のメソッドディスパッチの結果や,アク ティベーション時のイベントハンドラの実行について示している.ここで,

copnew

でなく

C++

new

を用いた場合や,スタックに確保したオブジェ

クトについては,振る舞い変更を反映しない.また,ヒープ領域を使いたく ない場合の代替案としては,

new

演算子のオーバーロードと組み合わせるこ とで,静的領域に割り当てる方法等が考えられる.

ドキュメント内 九州大学学術情報リポジトリ (ページ 45-49)