ᮏ◊✲䛾ᑐ㇟
2.6 COP の要素技術
2.4
節で紹介したCOP
言語は各々実装方法が異なるが,その核となる要 素技術として以下のものが挙げられる20)38).•
メソッドディスパッチ•
レイヤアクティベーションCOP
のメソッドディスパッチでは,現在のアクティブなレイヤによって実 行するメソッドを切り替える.レイヤアクティベーションは前者のメソッド ディスパッチのために,レイヤのアクティブ状態を変更することである.以降,研究課題を達成する上で重要な上記の要素について,既存の
COP
言語で採用されている方法を紹介し,それぞれの利点・欠点について記す.さらに,提案フレームワークでどの方法を採用したかについて述べる.
Malte Appeltauer
らはCOP
のためのメソッドディスパッチの実現手段を 二つの方法に分類している20).それぞれの方法について,図2.9
,図2.10
に 示す.一つはメソッドディスパッチのたびにプロキシオブジェクトを介するĂ сŶĞǁ;Ϳ͖
Ă͘Dϭ;Ϳ͖
Ă͘DϮ;Ϳ͖
䜸䝤䝆䜵䜽䝖䝥䝻䜻䝅䜰䜽䝔䜱䝤䛺 䝺䜲䝲䛾䝸䝇䝖
>ĂLJĞƌɲ
>ĂLJĞƌɴ
;ϭͿ䝯䝑䝉䞊䝆㏦ಙ
ůĂLJĞƌ>ĂLJĞƌɲ
ĐůĂƐƐ
Dϭ;Ϳ͙
ůĂLJĞƌ>ĂLJĞƌɴ
ĐůĂƐƐ
DϮ;Ϳ͙
;ϯͿ䝯䝋䝑䝗ᐇ⾜
;ϮͿ䜰䜽䝔䜱䝤䛺䝺䜲䝲䛾☜ㄆ
ͬͬ䜰䜽䝔䜱䝧䞊䝖ᐇ⾜
ĐƚŝǀĂƚĞ;>ĂLJĞƌɲͿ͖
;ĂͿ᭦᪂
図2.9 メソッドディスパッチ: プロキシオブジェクト
第
2
章 関連研究25
Ă сŶĞǁ;Ϳ͖
Ă͘Dϭ;Ϳ͖
Ă͘DϮ;Ϳ͖
;ϭͿ䝯䝑䝉䞊䝆㏦ಙ
Dϭ;Ϳ͗>ĂLJĞƌɲ䛾䜰䝗䝺䝇 DϮ;Ϳ͗>ĂLJĞƌɴ䛾䜰䝗䝺䝇 䜽䝷䝇䛾௬㛵ᩘ䝔䞊䝤䝹
ůĂLJĞƌ>ĂLJĞƌɲ
ĐůĂƐƐ
Dϭ;Ϳ͙
ůĂLJĞƌ>ĂLJĞƌɴ
ĐůĂƐƐ
DϮ;Ϳ͙
;ϮͿ䝯䝋䝑䝗ᐇ⾜
ͬͬ䜰䜽䝔䜱䝧䞊䝖ᐇ⾜
ĐƚŝǀĂƚĞ;>ĂLJĞƌɲͿ͖
;ĂͿ᭦᪂
図2.10 メソッドディスパッチ: 仮想関数テーブルを書き換え
方法である.プロキシオブジェクトは,メッセージ受信後にアクティブなレ イヤを調べ,実行するメソッドをディスパッチする.もう一つはアクティブ なレイヤが変更されるたびに,仮想関数テーブルを書き換える方法である.
前者はメソッドディスパッチのたびにアクティブなレイヤを調べるための オーバヘッドがかかる.後者はレイヤアクティベーションのたびに仮想関数 テーブルを変更するためのオーバヘッドがかかる.
紙名はレイヤアクティベーションの方法と影響範囲によって
COP
言語の 分類を行っている38).レイヤアクティベーションの方法は以下のものがあ る.それぞれのサンプルプログラムを図2.11
,図2.12
,図2.13
に示す.with
ブロック:
アクティベーション範囲をブロックで囲む方法である.こ の方法はレイヤがアクティブである範囲を明示的に表せるが,制御フ ローをまたがるアクティベーションを表現するのが難しい.また,ブ ロックがプログラム中に散在する問題がある9).決定的なアクティベーション: アクティベーションの命令が用意されてお り,その命令を実行するとレイヤが永遠にアクティブとなる方法であ る.制御フローをまたがるアクティベーションは容易だが,意図しな いレイヤアクティベーションの衝突が起こる恐れがある38).
第
2
章 関連研究26
ͬͬŽŶƚĞdžƚ:䛻䛚䛡䜛
,ĞůůŽŚĞůůŽ сŶĞǁ,ĞůůŽ;Ϳ͖
ͬͬ᪥ᮏㄒ䝰䞊䝗䛸ⱥㄒ䝰䞊䝗䛷䝺䜲䝲䜢ኚ᭦
DŽĚĞŵŽĚĞ с:ĂƉĂŶĞƐĞ͖
>ĂLJĞƌũĂƉĂŶĞƐĞ>ĂLJĞƌ ĂŶĚĞŶŐůŝƐŚ>ĂLJĞƌ ͙
ͬͬ:ĂƉĂŶĞƐĞ>ĂLJĞƌ䜢䜰䜽䝔䜱䝧䞊䝖 ŝĨ;ŵŽĚĞсс:ĂƉĂŶĞƐĞͿ
ǁŝƚŚ;ũĂƉĂŶĞƐĞ>ĂLJĞƌͿ
ͬͬ͞䛣䜣䛻䛱䛿͟䛸⾲♧
ŚĞůůŽ͘WƌŝŶƚ;Ϳ͖
ͬͬŶŐůŝƐŚ>ĂLJĞƌ䜢䜰䜽䝔䜱䝧䞊䝖 ĞůƐĞŝĨ;ŵŽĚĞссŶŐůŝƐŚͿ
ǁŝƚŚ;ĞŶŐůŝƐŚ>ĂLJĞƌͿ
ͬͬ͞,ĞůůŽ͟䛸⾲♧
ŚĞůůŽ͘WƌŝŶƚ;Ϳ͖
図2.11 レイヤアクティベーション: withブロック
ŝĨ;ŵŽĚĞсс:ĂƉĂŶĞƐĞͿ
ͬͬ:ĂƉĂŶĞƐĞ>ĂLJĞƌ䜢䜰䜽䝔䜱䝧䞊䝖 ĂĐƚŝǀĂƚĞ;ũĂƉĂŶĞƐĞ>ĂLJĞƌͿ͖
ĞůƐĞŝĨ;ŵŽĚĞссŶŐůŝƐŚͿ
ͬͬŶŐůŝƐŚ>ĂLJĞƌ䜢䜰䜽䝔䜱䝧䞊䝖 ĂĐƚŝǀĂƚĞ;ĞŶŐůŝƐŚ>ĂLJĞƌͿ͖
͙
ͬͬ䜰䜽䝔䜱䝤䛺䝺䜲䝲䛻䜘䛳䛶⾲♧䛜ኚ䜟䜛 ŚĞůůŽ͘WƌŝŶƚ;Ϳ͖
図2.12 レイヤアクティベーション: 決定的なアクティベーション
イベント駆動
:
青谷らが提案したEventCJ
30)で行っている方法である.こ の方法ではイベント宣言とレイヤ遷移規則を用いてレイヤアクティ ベーションを宣言的に指定する,イベント宣言で宣言したイベントが 発生した際に,レイヤ遷移規則に応じてレイヤやコンテキストを切り第
2
章 関連研究27
替える.この方法の特徴としては,レイヤアクティベーションの指定 が宣言的に行われることでアクティベーションのためのコードが散在 しないことや,レイヤ遷移規則を用いることでモデル検査を行いやす く,仕様との一致を検査できることが挙げられる.また,レイヤアクティベーションの影響範囲としては,スレッドごと,ある いはインスタンスごとのアクティベーションやアプリケーション全体の振る 舞いが変更される大域的なアクティベーションがある.
ͬͬ
᪥ᮏㄒ䝰䞊䝗䛻ኚ᭦䛥䜜䜛䛻㉳䛣䜛䜲䝧䞁䝖ĚĞĐůĂƌĞĞǀĞŶƚ:ĂƉĂŶĞƐĞDŽĚĞ;,ĞůůŽŚĞůůŽ͕DŽĚĞŵŽĚĞͿ ďĞĨŽƌĞĞdžĞĐƵƚŝŽŶ;ǀŽŝĚŚĂŶŐĞDŽĚĞ;DŽĚĞŵŽĚĞͿͿ
ΘΘĂƌŐƐ;ŵŽĚĞͿΘΘƚĂƌŐĞƚ;ŚĞůůŽͿ ΘΘŝĨ;ŵŽĚĞсс:ĂƉĂŶĞƐĞͿ
͗ƐĞŶĚdŽ;ŚĞůůŽͿ͖
ͬͬ
᪥ᮏㄒ䝰䞊䝗䜲䝧䞁䝖䛾䝺䜲䝲㑄⛣ƚƌĂŶƐŝƚŝŽŶ:ĂƉĂŶĞƐĞDŽĚĞ͗
ŶŐůŝƐŚ>ĂLJĞƌ ͍ŶŐůŝƐŚ>ĂLJĞƌ Ͳх:ĂƉĂŶĞƐĞ>ĂLJĞƌ
͍ͮͲх:ĂƉĂŶĞƐĞ>ĂLJĞƌ͖
ͬͬ
ⱥㄒ䝰䞊䝗䛻ኚ᭦䛥䜜䜛䛻㉳䛣䜛䜲䝧䞁䝖ĚĞĐůĂƌĞĞǀĞŶƚŶŐůŝƐŚDŽĚĞ;,ĞůůŽŚĞůůŽ͕DŽĚĞŵŽĚĞͿ ďĞĨŽƌĞĞdžĞĐƵƚŝŽŶ;ǀŽŝĚŚĂŶŐĞDŽĚĞ;DŽĚĞŵŽĚĞͿͿ
ΘΘĂƌŐƐ;ŵŽĚĞͿΘΘƚĂƌŐĞƚ;ŚĞůůŽͿ ΘΘŝĨ;ŵŽĚĞссŶŐůŝƐŚͿ
͗ƐĞŶĚdŽ;ŚĞůůŽͿ͖
ͬͬ
ⱥㄒ䝰䞊䝗䜲䝧䞁䝖䛾䝺䜲䝲㑄⛣ƚƌĂŶƐŝƚŝŽŶŶŐůŝƐŚDŽĚĞ͗
:ĂƉĂŶĞƐĞ>ĂLJĞƌ ͍:ĂƉĂŶĞƐĞ>ĂLJĞƌ ͲхŶŐůŝƐŚ>ĂLJĞƌ
͍ͮͲхŶŐůŝƐŚ>ĂLJĞƌ͖
ͬͬ
ୖ䛷ᐃ⩏䛧䛯䜲䝧䞁䝖䜢Ⓨ⏕䛥䛫䠈䝺䜲䝲䜢ኚ᭦䛩䜛ŚĞůůŽ͘ŚĂŶŐĞDŽĚĞ;:ĂƉĂŶĞƐĞŽƌŶŐůŝƐŚͿ
ͬͬ
䜰䜽䝔䜱䝤䛺䝺䜲䝲䛻䜘䛳䛶⾲♧䛜ኚ䜟䜛ŚĞůůŽ͘WƌŝŶƚ;Ϳ͖
図2.13 レイヤアクティベーション: イベント駆動
第