第 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++
で定義している.メソッドディスパッチの実現方法の関係から,ベースメソッドの
Hello
クラスのパーシャルクラスを定義している.パーシャルクラスでは,レイヤ固有のメンバ変数や
Print()
メソッドのパーシャルメソッドを定義し ている.ここで表3.1
の機能について使わないものについては,外すことが 可能となっている.main()
メソッドでは,3.4節で述べる実装方法の関係上,Helloクラスの第
3
章RTCOP: C++
ベースのコンテキスト指向プログラミングフレームワーク
38
インスタンス化時に
copnew
という特別な機能を使っている.その後の行で レイヤアクティベーションの前後のメソッドディスパッチの結果や,アク ティベーション時のイベントハンドラの実行について示している.ここで,copnew
でなくC++
のnew
を用いた場合や,スタックに確保したオブジェクトについては,振る舞い変更を反映しない.また,ヒープ領域を使いたく ない場合の代替案としては,