九州大学学術情報リポジトリ
Kyushu University Institutional Repository
コンテキスト指向プログラミングの組込みソフト ウェアへの適用に関する研究
谷川, 郁太
https://doi.org/10.15017/4060187
出版情報:Kyushu University, 2019, 博士(工学), 課程博士 バージョン:
権利関係:
コンテキスト指向プログラミングの 組込みソフトウェアへの適用に関する研究
令和元年 12 月
谷川郁太
i
目次
概要
vii
第
1
章 序論1
1.1
背景. . . . 1
1.2
組込みソフトウェアへの適用における課題の分析. . . . 5
1.3
研究の目的. . . . 9
1.4
本論文の構成. . . 12
第
2
章 関連研究13 2.1 COP
以前のプログラミング技術についての概要. . . 13
2.2 COP
のコンテキストアウェアシステム開発における立ち位置16 2.3 COP
の概要. . . 18
2.4 COP
言語. . . 20
2.5 COP
の応用事例. . . 22
2.6 COP
の要素技術. . . 24
2.7 COP
とAOP
の違い. . . 28
2.8
本研究の位置づけ. . . 29
第
3
章RTCOP: C++
ベースのコンテキスト指向プログラミングフ レームワーク31 3.1
概要. . . 31
3.2
はじめに. . . 32
3.3
提案. . . 34
3.4
実装. . . 38
3.5
評価. . . 47
3.6
おわりに. . . 54
ii
第4
章 コンテキスト指向プログラミングにおける優先度に応じたレイヤスケジューリング手法
55
4.1
概要. . . 55
4.2
はじめに. . . 56
4.3
事例紹介. . . 57
4.4
解決すべき問題. . . 59
4.5 COP
フレームワークRTCOS . . . 62
4.6
非正常系処理変更の応答時間の短縮方法の議論. . . 63
4.7
提案. . . 65
4.8
適用・評価. . . 70
4.9
おわりに. . . 72
第
5
章 ケーススタディ:複合現実環境によるIoT
教育システム73 5.1
概要. . . 73
5.2
はじめに. . . 74
5.3 IoT
教育システム. . . 76
5.4
実装. . . 79
5.5
応用事例. . . 82
5.6
おわりに. . . 84
第
6
章 結論85 6.1
まとめ. . . 85
6.2
今後の展望. . . 87
謝辞
88
参考文献89
本研究に関する著者の発表論文95
付録96 A RTCOP
アプリケーションのソースコード. . . 96
B RTCOP
ライブラリのソースコード. . . 102
iii
C RTCOP
の自動生成コード. . . 134
iv
図目次
1.1 IoT
は2008
年 か ら2009
年 に 生 ま れ た(CISCO White
Paper
2)より). . . . 2
1.2
本研究におけるIoT
の目標:状況に応じたサービス変更. . . 2
1.3
本研究におけるIoT
の目標. . . . 3
1.4 COP
による横断的関心事の扱い. . . . 4
1.5
組込みソフトウェア開発で用いられるプログラミング言語. . 6
1.6
リアルタイム性の必要性. . . . 6
1.7 COP
適用によるリソース消費量の増加. . . . 7
1.8
同時に複数の振る舞い変更要求が起こる場合. . . . 8
1.9
本研究での取り組み. . . 10
2.1 OOP
の言語機能. . . 15
2.2 AOP
による横断的関心事のモジュール化. . . 15
2.3
本研究におけるコンテキスト. . . 16
2.4 COP
の立ち位置. . . 17
2.5 Context Toolkit
の構造(Deyらの論文3)より). . . 18
2.6 COP
のサンプルプログラム. . . 19
2.7 COP
のスマートフォンアプリケーションでの使用例. . . 23
2.8
スマートフォンアプリケーションのCOP
での実現例. . . . 23
2.9
メソッドディスパッチ:
プロキシオブジェクト. . . 24
2.10
メソッドディスパッチ:
仮想関数テーブルを書き換え. . . . 25
2.11
レイヤアクティベーション: with
ブロック. . . 26
2.12
レイヤアクティベーション: 決定的なアクティベーション. . 26
2.13
レイヤアクティベーション:
イベント駆動. . . 27
v
3.1 RTCOP
のプログラム記述例. . . 37
3.2 RTCOP
の使用プロセス. . . 39
3.3
レイヤードなクラスの構造. . . 40
3.4 LayerdObject
の継承ツリーの案. . . 41
3.5
メソッドディスパッチのための機構. . . 42
3.6
アクティベーション前後の仮想関数テーブル. . . 44
3.7
パーシャルクラス定義プログラム. . . 45
4.1
機械制御の事例:レスキューロボット. . . 58
4.2
電子制御の事例:掃除機ロボット. . . 59
4.3 COP
のレイヤを用いた非正常系処理への切り替えの例. . . 60
4.4 RTCOS
の構造. . . 63
4.5
レイヤアクティベーション時の初期化プログラム例. . . 66
4.6
レイヤスケジューラの構造. . . 67
4.7
レイヤの状態遷移. . . 67
4.8
レイヤスケジューラアルゴリズム. . . 68
4.9
メソッドディスパッチの仕組み. . . 69
4.10
評価プログラムの流れ. . . 71
5.1 IoT
教育のためのCOP
プログラム. . . 76
5.2
複合現実システムの実行時の写真. . . 77
5.3
実験に用いる掃除機ロボットを示す. . . 78
5.4
システムの構成. . . 78
5.5
ロボットAPI
のクラス図. . . 79
5.6
ユーザアプリケーションとロボットフレームワークの関係. . 80
5.7 COP
の実現. . . 81
5.8
応用事例:
カーリングゲーム(
ゲーム中) . . . 82
5.9
応用事例: カーリングゲーム(ゲーム終了時) . . . 83
vi
表目次
2.1
既存COP
言語の一覧. . . 21
3.1
無効化可能なCOP
の機能の一覧. . . 35
3.2
ベンチマーク環境. . . 47
3.3
メソッドディスパッチの計測結果. . . 49
3.4
レイヤアクティベーションの計測結果. . . 49
3.5
機能の有効・無効化による性能比較. . . 52
4.1
適用結果:メソッド実行の時間. . . 71
vii
概要
本論文では,コンテキスト指向プログラミング(
Context-Oriented Pro-
gramming: COP
)を組込みソフトウェアへ適用する際の課題を明らかにし,それらの課題を解決するための研究に取り組む.本研究の目的は,
COP
を 組込みシステムに適用可能にすることによって,Internet of Things(IoT)の ような,近年の組込みソフトウェア開発に貢献することである.COP
はコンテキストに依存する横断的関心事をモジュール化し,実行時 の状況に応じてそれらを有効化・無効化することで,現在のコンテキストに 動的に適応することを可能とするプログラミング技術である.ここでいうコ ンテキストとは,システムを取り巻く外部環境やシステムの内部状態,ある いはそれらの変化の順序である.このような特徴から,COP
はIoT
で求め られるような,コンテキストアウェアな組込みソフトウェアの開発に役立つ ことが期待できる.COP
の組込みソフトウェアへの適用の課題は,省メモリやリアルタイム 性の確保といった,組込みソフトウェアにとって重要な要求を満たせない可 能性があることである.COP
適用の問題として,次の三つが挙げられる.(i) COP
機構によるメモリ消費量やプログラム実行時間の増加(ii) COP
を利用可能なプログラミング言語が組込みシステム用プロセッサでサポートされていない可能性
(iii) COP
のレイヤアクティベーション時のリアルタイム性確保が困難問題
(i)
は,COP
アプリケーションには,COP
言語が提供する機能を実 現するための機構が必要となり,その分だけプログラムサイズや実行時のメ モリ消費量が増加すること,また,COP
における振る舞い変更は,現在の コンテキストに応じたメソッドディスパッチによって実現されるため,その 際のCOP
機構による介入によって,プログラムの実行時間が増加することviii
である.問題
(ii)
は,既存のCOP
言語はJava
やSmalltalk
など組込みソフトウェ ア向けでない言語を拡張したものが中心であるが,組込みシステム用のプロ セッサがサポートする言語はC
または,C++のみであることが多いため,既存の
COP
言語の多くは,組込みシステム用プロセッサ上で動かせない場 合があることである.問題
(iii)
は,組込みソフトウェアの機械制御における非正常系処理のような重要なものを
COP
で実現する場合,事故の発生や製品の故障を防ぐため に,非正常系処理の変更要求から振る舞い実行までの応答時間がかかること である.非正常系の処理の変更に時間がかかる要因としては,他の正常系の 変更が終了するのを待つ場合があることから,重要な振る舞い変更を優先し て実行する仕組みが必要である.これらの問題については,以下の方法によって解決する.
(a)
省メモリかつ省実行時間のCOP
機構の実現(b)
組込み向けのプログラミング言語のサポート(c)
リアルタイム性確保に不可欠なスケジューラの提供本研究では,上記によって課題を解決するために,以下の二つに取り組 んだ.
(1) C++
をベースとしたコンテキスト指向プログラミングフレームワークの提案
(2)
優先度付きのコンテキスト適応を実現するレイヤスケジューリング手 法の提案取り組み
(1)
では,解決策(a)
として,提案フレームワークをアプリケー ションごとに不要な機能の取り外しが可能となる仕組みとした.また,ネイ ティブ環境での低レベル操作によってCOP
機構を実現した.これにより,メモリ消費量を抑え,プログラムの実行時間を削減した.さらに,解決策
(b)
として,COPをC++
の拡張により実現した.これにより,C++しか サポートしていないような,組込みシステム用のプロセッサ上でもCOP
アix
プリケーションを開発することを可能とした.取り組み
(2)
では,解決策(c)
として,優先度付きのコンテキスト適応を実 現した.本手法では,同時に複数のコンテキスト適応が必要になった際に,前もって設定しておいた優先度が高いものから順に処理を行う.これによっ
て,課題
(iii)
を解決し,COP
を組込みソフトウェア開発に用いやすくした.最後に,本論文では,組込みソフトウェアへの
COP
適用のケーススタ ディとして,複合現実(Mixed Reality)
環境によるIoT
教育システムを紹介 する.このシステムによって,COP
アプリケーションをいくつか開発し,COP
フレームワークが想定通りの振る舞いをするか実験した.1
第 1 章 序論 1.1 背景
Internet of Things(IoT)
という言葉が世間に広まってから今日に至るま で,IoT
に関する多くの研究が行われてきたが,その言葉の定義は困難であ る.本章の冒頭では,IoT という言葉が広まった歴史的経緯を踏まえた上 で,本研究が最終的に目指すところを明らかにする.その後,コンテキスト 指向プログラミングの研究に取り組むまでの背景について述べる.以降の節 で,本研究の課題や目的について述べる.IoT
の定義に関して,IEEE
の国際標準1) によると,「Internet of Things
(
IoT
)は,センサ,アクチュエータ,スマートオブジェクトのネットワーク で構成されるシステムであり,その目的は日常的なものや産業用のオブジェ クトを含む「すべて」のものを,インテリジェントでプログラム可能で,人 とものが相互作用する能力をより高める方法で,相互接続することである」として知られているが,定義は難しいと記されている.
IoT
の定義が難しいことは,IoT
という言葉が広まった歴史的経緯に由来 する.IoT
という言葉は,米国Auto-ID Center
のKevin Ashton
が1999
年 に初めて用いた.この時はRFID
のための言葉として使われており,物がつ ながることが目指された.IoT
という言葉が広まったきっかけは,2011
年のCISCO
のホワイトペーパー2) である.ここでは,図1.1
を示しつつ,2008
年から2009
年に接続されたデバイスの数が世界の総人口を超えたことによ り,IoTの時代を迎えたことを明らかにした.このように,始めに使われた ときと,世間に広まったときで,言葉の意味が違っていたことは,IoT
とい う言葉の定義を困難にする一因である.本研究において目指す
IoT
がどのようなものであるかを図1.2
に示す.図 に示す通り,インターネットに接続されたデバイスは,他のデバイスとつな第
1
章 序論2
図1.1 IoTは2008年から2009年に生まれた(CISCO White Paper2)より)
図1.2 本研究におけるIoTの目標:状況に応じたサービス変更
がることによって,新たなサービスを生み出すことが期待できる.例えば,
掃除機ロボットは,ロボット単体としては掃除サービスを行うが,家やス マートフォンと組み合わせることで,家に侵入者が入ったときに家主のス マートフォンに通知を行うような見回りサービスを提供できる.これらの サービスの内容を状況に応じて変更するスマートロボット,スマート家電と いったものを実現することが本研究が最終的に目指すところである.
このように,システムを取り巻く状況
(
コンテキスト)
に応じて振る舞い第
1
章 序論3
図1.3 本研究におけるIoTの目標
を変えるようなシステムは,コンテキストアウェアシステム 3)4) と呼ばれ ることがある.コンテキストアウェアシステムは,図
1.3
の上部に示すよう に,システムのセンサ情報などから現在のコンテキストを分析し,その結果 を基にアプリケーションの振る舞いを変更させるシステムである.本研究で は,アプリケーションの振る舞いを変更する部分について扱う.コンテキストアウェアシステムを実装する際,コンテキストに依存する振 る舞いが横断的関心事となりうることを考慮する必要がある.例えば,屋 内外で全体の振る舞いを変えるようなシステムでは,図
1.3
の下部に示す ように,それぞれの状況の分岐処理と振る舞いが複数のクラスに散在する.このようなシステムをオブジェクト指向プログラミング
(Object-Oriented
Programming: OOP)
言語の機能のみで開発する場合,上記の横断的関心事を扱うための機構を開発者が一から構築する必要がある.
アスペクト指向プログラミング
(Aspect-Oriented Programming: AOP)
5) は,横断的関心事をモジュール化するためのプログラミング技術であり,上 記のようなソフトウェアの開発に役立てることができる.AOP
に関する研第
1
章 序論4
図1.4 COPによる横断的関心事の扱い
究として,
Marin
らは,横断的関心事を13
種類に分類し,その中で動的な 振る舞いを持つ横断的関心事をAOP
言語では扱えないことについて述べて いる.6)動的な横断的関心事を扱うことができるものとして,コンテキスト指向プ ログラミング
(Context-Oriented Programming: COP)
7)8)9)10)11) が挙げら れる.COP
はコンテキストに依存する横断的関心事を図1.4
のように,レ イヤとしてモジュール化し,実行時の状況に応じてレイヤをアクティベート することで,現在のコンテキストに動的に適応することを可能とするプログ ラミング技術である.このように,COPはコンテキストに依存する横断的 関心事をモジュール化することや,それを動的に活性化・非活性化すること を可能にするプログラミング言語機能を有しており,IoTで求められるよう な,コンテキストアウェアな組込みソフトウェアの開発に役立つことが期待 できる.第
1
章 序論5
1.2 組込みソフトウェアへの適用における課題の 分析
本節では,COPを組込みソフトウェアに適用する際の課題を明らかにす る.そのために,
1.2.1
項で一般的な組込みソフトウェア開発における課題を 紹介し,1.2.2項でCOP
適用によって引き起こされる問題を明らかにする.1.2.1 一般的な組込みソフトウェア開発における課題
組込みソフトウェア開発では一般的に,プログラムサイズ,メモリ消費量,
実行時間などの制約が存在する.例えば,
RENESAS
のGR-SAKURA
12)と いうマイコンボードでは,ROM
サイズが1MB
,RAM
サイズが128KB
で あり,このマイコン用アプリケーションでは,プログラムサイズやメモリ消 費量がこれらの数値を超えないようにしなくてはならない.組込みソフトウェア開発では,使用できるプログラミング言語にも制限が ある.このことから,実際の開発で使用されるプログラミング言語には偏り がある.IPAの
2017
年の調査13) のアンケート結果を図1.5
に示す.図の 通り,一番多く使われているプログラミング言語はC
言語であり,それに続 いてC++
,アセンブリ言語が用いられている.使用できるプログラミング言語が制限される理由の一つは,本項冒頭で述 べたプログラムサイズやメモリ消費量に関連する.
Java
のような専用の実 行環境を必要とするプログラミング言語では,その実行環境を備えるための リソースが割かれる.例えば,ARM
プロセッサを用いた組込みLinux
の開 発でJava
を用いる場合,JavaのためにRAM32MB
以上,ROM37MB以上 が必要となる.そのためプログラムがマイコンボードに載せられなかった り,開発者が自由に使用できるメモリ領域を減らすこととなる.二つ目の理 由としては,プロセッサがサポートするプログラミング言語が限られること が挙げられる.例えば,開発対象のプロセッサのコンパイラでサポートされ ているプログラミング言語がC/C++
のみの場合,その他のプログラミング 言語を開発に用いるのは難しい.第
1
章 序論6
ฟ͗/W䛂⤌㎸䜏䝋䝣䝖䜴䜵䜰㛤Ⓨ䝕䞊䝍ⓑ᭩ϮϬϭϳ䛃
図1.5 組込みソフトウェア開発で用いられるプログラミング言語
図1.6 リアルタイム性の必要性
組込みソフトウェア開発では,リアルタイム性も重要である.
IPA
の2017
年の調査結果13) を図1.6
に示す.この調査結果によると,8
割以上の組込 み製品には守らなければならない時間制約が存在する.このような時間制約 は事故の発生や製品の故障を防ぐために守る必要がある.組込みソフトウェ ア開発では,リアルタイムOS
を用いることで,このような問題に対処する ことが一般的である.第
1
章 序論7
KW
ᶵᵓ䜢ᐇ⌧䛩䜛 䝣䝺䞊䝮䝽䞊䜽KW
䜰䝥䝸䜿䞊䝅䝵䞁KW
䛾䝯䝋䝑䝗䝕䜱䝇䝟䝑䝏䜔䝺䜲䝲䜰䜽 䝔䜱䝧䞊䝅䝵䞁ᶵᵓ䜢ᐇ⌧䛩䜛䛯䜑䛻䠈 䝯䝰䝸ᾘ㈝㔞䜔䝥䝻䜾䝷䝮䝃䜲䝈䛜ቑຍKW
䛾䝯䝋䝑䝗䝕䜱䝇䝟䝑䝏䛾䛯䜑䛻䠈 䝯䝋䝑䝗䜃ฟ䛧䛻ධ䛧䠈ᐇ⾜㛫䜢 ቑຍ䛥䛫䜛図1.7 COP適用によるリソース消費量の増加
1.2.2 COP 適用における問題
本項では組込みソフトウェアに
COP
適用する際に考えられる課題につい て述べる.1.2.1項では組込みソフトウェア開発における一般的な課題とし て省リソースが求められること,使用できるプログラミング言語が限られ ること,リアルタイム性が求められることを挙げた.組込みソフトウェアにCOP
を適用する場合,上記の課題において以下の問題が起こりうる.(i) COP
機構によるメモリ消費量やプログラム実行時間の増加(ii) COP
を利用可能なプログラミング言語が組込みシステム用プロセッサでサポートされていない可能性
(iii) COP
のレイヤアクティベーション時のリアルタイム性確保が困難問題
(i)
は,COPアプリケーションには図1.7
のように,COP言語が提 供する機能を実現するための機構が必要となり,その分だけプログラムサイ ズや実行時のメモリ消費量が増加すること,また,COP
における振る舞い 変更は,現在のコンテキストに応じたメソッドディスパッチによって実現さ れるため,その際のCOP
機構による介入によって,プログラムの実行時間 が増加することである.問題
(ii)
は,1.2.1
項でも述べた通り,組込みソフトウェア開発では現在でも
C/C++
が多く使われていることである.組込みソフトウェアでは,性能や省メモリが重視されており,未だにこれらのプログラミング言語が主流 である.また,多くの組込みシステム用のプロセッサがサポートする言語が
第
1
章 序論8
図1.8 同時に複数の振る舞い変更要求が起こる場合
C
または,C++のみであることも理由として挙げられる.一方で,既存のCOP
言語はJava
やSmalltalk
など組込みソフトウェア向けでない言語を拡 張したものが中心であるため,既存のCOP
言語の多くは,組込みシステム 用プロセッサ上で動かせない場合がある.問題
(iii)
は,組込みソフトウェアの機械制御における非正常系処理のような重要な処理の切り替えを
COP
で実現する場合,事故の発生や製品の故障 を防ぐために,非正常系処理の変更要求から振る舞い実行までの応答時間が かかることである.非正常系の処理の変更に時間がかかる要因としては,図1.8
のように同時に複数の振る舞い変更の要求が起きた時に,他の正常系の 変更が終了するのを待つ場合があることから,重要な振る舞い変更を優先し て実行する仕組みが必要である.COP
を組込みソフトウェアに適用するためには,これらの問題を解決し なければならないが,既存のCOP
の研究では,それが十分ではない.第
1
章 序論9
1.3 研究の目的
本研究の目的は,
COP
を組込みシステムに適用可能にすることによって,Internet of Things (IoT)
のような,近年の組込みソフトウェア開発に貢献す ることである.そのために,1.2
節で挙げた三つの問題を以下の方法によっ て解決する.(a)
省メモリかつ省実行時間のCOP
機構を実現(b)
組込み向けのプログラミング言語をサポート(c)
リアルタイム性確保に不可欠なスケジューラの提供本研究の取り組みとして,上記の解決策を用いた以下の二つの提案を 行った.
(1) C++
をベースとしたコンテキスト指向プログラミングフレームワークの提案
(2)
優先度付きのコンテキスト適応を実現するレイヤスケジューリング手 法の提案本論文では,図
1.8
に示す通り,取り組み(1)(2)
によって1.2
節の課題 を解決する.また,組込みCOP
のケーススタディとして複合現実(Mixed
Reality)
環境によるIoT
教育システムを紹介する.このシステムによって,COP
アプリケーションをいくつか開発し,COP
フレームワークが想定通り の振る舞いをするか実験する.以降,本研究での取り組みについて述べる.1.3.1 C++ をベースとしたコンテキスト指向プログラミング
フレームワーク
1.2.2
項で述べた通り,(i)
組込みソフトウェアへのCOP
適用は性能面の要求が満たせずに問題となる場合がある.また,
(ii)
既存のCOP
言語は,Java
やSmalltalk
など組込みソフトウェア向けでない言語を拡張したものが中心である.代表的な
COP
の調査ではSalvaneschi
らの論文 8)が著名であ第
1
章 序論10
нн䛻䜘䜛
KW 㛤Ⓨ⎔ቃ䛾ᐇ⌧
нн 䛻䜘䜛
KW 㛤Ⓨ⎔ቃ䛾ᐇ⌧
⤌㎸䜏䝋䝣䝖䜴䜵䜰㛤Ⓨ
䛾䛯䜑䛾ᶵ⬟ᣑᙇ
;ϭͿнн䜢䝧䞊䝇䛸䛧䛯
䝁䞁䝔䜻䝇䝖ᣦྥ䝥䝻䜾䝷䝭䞁䜾 䝣䝺䞊䝮䝽䞊䜽䛾ᥦ
;ϮͿඃඛᗘ䛝䛾䝁䞁䝔䜻䝇䝖㐺ᛂ
䜢ᐇ⌧䛩䜛䛯䜑䛾䝇䜿䝆䝳䞊䝷䛾 ᥦ⤌㎸䜏䝋䝣䝖䜴䜵䜰䜈䛾KW㐺⏝䛾䜿䞊䝇䝇䝍䝕䜱䛸䛧䛶䠈
」ྜ⌧ᐇ
;DŝdžĞĚZĞĂůŝƚLJͿ䝅䝇䝔䝮䜢⤂
KW 䜰䝥䝸䜿䞊䝅䝵䞁䛾 ᐇ㊶⎔ቃ䜢ᥦ౪
нн 䛻䜘䜛
KW㛤Ⓨ⎔ቃ䛾ᐇ⌧
⤌㎸䜏䝋䝣䝖䜴䜵䜰㛤Ⓨ
䛾䛯䜑䛾ᶵ⬟ᣑᙇ
ᐇ㦂
⤌㎸䜏䝋䝣䝖䜴䜵䜰䛻KW䜢㐺⏝ྍ⬟䛻 䛩䜛䛯䜑䛾ྲྀ䜚⤌䜏
図1.9 本研究での取り組み
るが,
C/C++
を拡張したCOP
言語は紹介されていない.上記の問題を解決するために,筆者は
C++
をベースとしたコンテキスト 指向プログラミングフレームワークを提案する.本フレームワークは,解決 策(a)
として,提案フレームワークをアプリケーションごとに不要な機能を 外せる構成可能な仕組みとする.また,ネイティブ環境での低レベル操作に よってCOP
機構を実現する.これにより,メモリ消費量を抑え,プログラ第
1
章 序論11
ムの実行時間を削減する.さらに,解決策(b)
として,COP
をC++
の拡張 により実現する.これにより,C++
しかサポートしていないような組込み システム用のプロセッサ上でもCOP
アプリケーションを開発することを可 能とする.1.3.2 優先度付きのコンテキスト適応を実現するレイヤスケ
ジューリング手法
1.2.2
項で述べた通り,(iii)
既存のCOP
ではコンテキスト適応について のリアルタイム性が考慮されていない.例えば,組込みソフトウェアの機械 制御では,事故の発生や製品の故障を防ぐために,非正常系処理の変更要求 から振る舞い実行までの応答時間は重要である.これをCOP
で実現する場 合,コンテキスト適応のリアルタイム性を考慮する必要がある.取り組み
(2)
では,解決策(c)
として,優先度付きのコンテキスト適応を 実現する.本手法では,同時に複数のコンテキスト適応が必要になった際 に,前もって設定しておいた優先度が高いものから順に処理を行う.これに よって,課題(iii)
を解決し,COPを組込みソフトウェア開発に用いやすく する.また,高優先度レイヤアクティベーション時の専用のメソッドディス パッチを備えることで,例外発生という緊急時の応答時間を削減することを 可能とする.1.3.3 ケーススタディ:複合現実環境による IoT 教育システム
本論文では,組込みソフトウェアへの
COP
適用のケーススタディとして,複合現実
(Mixed Reality)
環境によるIoT
教育システムを紹介する.本シス テムは,Internet of Things (IoT)
の開発についての学習を目的としており,プロジェクションマッピング環境によって再現した実験空間で現実のロボッ トを動作させる.このロボットのアプリケーション開発に
COP
を適用し,本研究における
COP
が想定通りにアプリケーションが動作することを確か める.このシステムの特徴は,様々な実験環境をプロジェクションマッピン グで容易に実現できること,実際のロボットを使って実験を行うことができ第
1
章 序論12
ることである.1.4 本論文の構成
本論文の構成は以下の通りである.第
2
章では,本研究に関連する先行研 究を紹介し,本研究との比較を行う.第3
章では,前述した1) C++
をベー スとしたコンテキスト指向プログラミングフレームワークを提案し,第4
章 では,2)
優先度付きのコンテキスト適応を実現するためのスケジューラを提 案する.第5
章では,組込みソフトウェアへのCOP
適用のケーススタディ として,複合現実環境によるIoT
教育システムを紹介する.最後に第6
章で まとめを述べる.13
第 2 章 関連研究
本章では,関連研究の紹介を行う.2.1節では,
COP
以前のOOP
やAOP
について概説する.2.2
節でCOP
のコンテキストアウェアシステム開発に おける立ち位置を明らかにし,以降の節で,COP
に関する既存研究を紹介 する.2.3
節でCOP
の概要について述べ,2.4
節で既存のCOP
言語をいく つか紹介する.2.5
節でCOP
の応用事例を示し,既存研究において,COP
がどのような領域で用いられているのかを明らかにする.また,3章,4章 のための準備として,2.6
節でCOP
の要素技術をいくつか紹介する.2.7
節 で,COPを採用する理由を明らかにするために,COPと類似の技術であるAOP
との違いを示す.最後に,2.8
節で本研究のCOP
における位置づけに ついて述べる.2.1 COP 以前のプログラミング技術についての概要
本節では,本研究の準備のために,
COP
以前のOOP
やAOP
について概 説する.2.1.1 OOP について
オブジェクト指向プログラミング(Object-Oriented Programming: OOP)
14) は,互いに関連するデータとそれらに対する操作をオブジェクトとして まとめ,それらオブジェクト同士のメッセージの通信によってプログラムを 構築するプログラミングパラダイムである.特に重要な点は,オブジェクト へのアクセスを外部公開したインターフェースからしか行えないようにカプ セル化することによって,オブジェクト内部の仕様変更による外部への影響 や外部からの干渉によるオブジェクトの状態の破壊を防ぎ,プログラムの再 利用性を向上させているところである.
第
2
章 関連研究14 OOP
の機能を図2.1
に示す.C++やJava
といった多くのOOP
言語で は,オブジェクトの定義のためにクラスを用いる.図中の右側のプログラム ではクラスを定義しており,関連する変数とそれらに対する操作を定義した メソッドのグループ化を行っている.このクラスを図中の左側のプログラム のようにインスタンス化することで,クラス内の変数群が実際のメモリ中に 配置される.オブジェクト同士のメッセージ通信は,相手側のインスタンス のメソッドを実行することで行う.メソッドはクラス内で定義される関数と して実現されており,この関数をプログラム中で呼び出すことによってメ ソッドを実行する.上記の他に,OOP言語の機能として,継承やメソッドディスパッチ,ポ リモーフィズムがある.継承は継承元のクラスの変数やメソッドを継承先の クラスに受け継ぐ機能であり,ソースコードの再利用を促進させる.図の例 では
CleanerRobot
クラスがRobot
クラスを継承し,その変数とメソッドを 受け継いでいる.メソッドディスパッチは,メソッド呼び出し時の状況に応 じて実行するメソッドを切り替える機能である.ポリモーフィズムは同名 のメソッドを複数定義し,引数の数や型,インスタンスの型などに応じてメ ソッドディスパッチを行う機能である.OOPのポリモーフィズムは継承と 関係が深く,継承元クラスのメソッドを継承先のメソッドの定義で上書きす ることで,クラスのインスタンスによって振る舞いを変更することが可能で ある.2.1.2 AOP について
アスペクト指向プログラミング(
Aspect-Oriented Programming: AOP
)5)は,横断的関心事を扱うためのプログラミングパラダイムである.横断的 関心事とは,OOPのオブジェクトにまとめられずに複数のオブジェクトに 散在してしまう共通性を持った処理である.有名な例として,ログの書き込 みが挙げられる.ログの書き込みは色々なクラスから実行されるため,それ ぞれのクラスに散在しがちである.
AOP
では図2.2
のように,アスペクト というモジュールを用意し,そこに各クラスに散在する処理とその処理の差 し込み先の指定を記述することで,横断的関心事を一つのモジュールとして第
2
章 関連研究15
ͬͬη䝥䝻䜾䝷䝮 ĐůĂƐƐƉƉ
ƉƵďůŝĐ ƐƚĂƚŝĐ ǀŽŝĚDĂŝŶ;ƐƚƌŝŶŐĂƌŐƐͿ
ͬͬ䜲䞁䝇䝍䞁䝇
ZŽďŽƚƌŽďŽƚ сŶĞǁůĞĂŶĞƌZŽďŽƚ;Ϳ͖
ͬͬ䝯䝋䝑䝗ᐇ⾜
ƌŽďŽƚ͘'Ž&ŽƌǁĂƌĚ;Ϳ͖
ͬͬůĞĂŶĞƌZŽďŽƚ䜽䝷䝇䛾䝯䝋䝑䝗䛜ᐇ⾜䛥䜜䜛
ͬͬ⥅ᢎඖ䜽䝷䝇䛾ᐃ⩏
ĐůĂƐƐZŽďŽƚ
ƉƌŝǀĂƚĞŝŶƚƐƉĞĞĚ͖
ƉƵďůŝĐǀŽŝĚ'Ž&ŽǁĂƌĚ;Ϳ
͙
͙
ͬͬ⥅ᢎඛ䜽䝷䝇䛾ᐃ⩏
ĐůĂƐƐůĞĂŶĞƌZŽďŽƚ ͗ZŽďŽƚ
ƉƵďůŝĐ ǀŽŝĚ 'Ž&ŽǁĂƌĚ;Ϳ
ͬͬ᪂䛧䛔ฎ⌮䛷ୖ᭩䛝
͙
図2.1 OOPの言語機能
㻭
Ͳ ͙
нDϭ;Ϳ͗ǀŽŝĚ нDϮ;Ϳ͗ǀŽŝĚ
㻮
Ͳ ͙
нDϭ;Ϳ͗ǀŽŝĚ нDϮ;Ϳ͗ǀŽŝĚ
㻯
Ͳ ͙
нDϭ;Ϳ͗ǀŽŝĚ нDϮ;Ϳ͗ǀŽŝĚ
㻰
Ͳ ͙
нDϭ;Ϳ͗ǀŽŝĚ нDϮ;Ϳ͗ǀŽŝĚ
㻨㻨㻭㼟㼜㼑㼏㼠㻪㻪 㻸㼛㼓㻭㼟㼜㼑㼏㼠
Ͳ ͙
н>ŽŐŐŝŶŐ;Ϳ͗ǀŽŝĚ
㻸㼛㼓㼓㼑㼞
Ͳ ͙
нtƌŝƚĞ;ƐƚƌŝŶŐͿ͗ǀŽŝĚ
䜴䜱䞊䝤
図2.2 AOPによる横断的関心事のモジュール化
まとめる.アスペクトによって各メソッドに処理を差し込む箇所のことを ジョインポイント,差し込む箇所の指定をポイントカットと呼ぶ.また,差 し込む工程のことをウィーブと呼ぶ.5)
AOP
はCOP
と横断的関心事を扱う という点で関連する技術なので,2.7節でCOP
と比較を行う.第
2
章 関連研究16
ศᯒ 䝺䜲䝲
ษ䜚᭰䛘
୍⯡ⓗ䛺 䝁䞁䝔䜻䝇䝖
ᮏ◊✲䛾䝁䞁䝔䜻䝇䝖
⎔ቃ䜢⾲䛩䝕䞊䝍
ᮏ◊✲䛾ᑐ㇟
図2.3 本研究におけるコンテキスト
2.2 COP のコンテキストアウェアシステム開発にお ける立ち位置
本節では,コンテキストアウェアシステム開発における
COP
の立ち位置 を明らかにするために,コンテキストアウェアシステムの既存研究で用いら れているコンテキストの定義やコンテキストアウェアシステムのアーキテク チャについて紹介し,COP
や本研究との違いを明らかにする.2.2.1 コンテキストの定義
コンテキストの定義は,研究者によって異なる.コンテキストアウェアシ ステム研究のいくつかの定義を紹介する.
Schilit
らは,コンテキストを「場 所,近くの人のアイデンティティ,オブジェクト,およびそれらのオブジェ クトへの変更」としている.15) ここで,コンテキストアウェアという用語 が初めて登場した.Ryanらは,「ユーザの場所,環境,アイデンティティ,時間」をコンテキストとし16),
Dey
は「ユーザの感情状態,注意の焦点,場 所と方向,日付と時刻,およびユーザーの環境内のオブジェクトと人物」を コンテキストとした17).コンテキストの定義の中で有力なものとしては,
2000
年頃のDey
らの以 下の定義がある.「ユーザとアプリケーション自体を含む,ユーザとアプリ ケーションの間の相互作用に関連すると考えられるエンティティの状況(つ まり,人物,場所,またはオブジェクト)の特性評価に使用できる情報」4).第
2
章 関連研究17
䝁䞁䝔䜻䝇䝖䜰䜴䜵䜰䝅䝇䝔䝮㛤Ⓨ䛻㛵䛩䜛ᢏ⾡
͙
䜰䞊䜻䝔䜽䝏䝱
䝁䞁䝔䜻䝇䝖ㄆ㆑
䝉䞁䝅䞁䜾 䝁䞁䝔䜻䝇䝖ᣦྥ
䝥䝻䜾䝷䝭䞁䜾
͙
͙
͙
ŽŶƚĞdžƚ dŽŽůŬŝƚ
䝁䞁䝔䜻䝇䝖䜰䜴䜵䜰 䝅䝇䝔䝮䜢䛹䛖స䜛 䜉䛝䛛
図2.4 COPの立ち位置
この定義は,コンテキストアウェアシステムに関するサーベイ論文18)19) で も重視されている.
本研究におけるコンテキストの関係を図
2.3
に示す.本研究では,分析さ れたデータから実行時に振る舞いを変更することに重点を置いており,デー タの分析自体は本研究の対象ではない.そのため,上記の定義では不適当で あるため,別の定義を用いる.本研究におけるコンテキストは,「COP
のレ イヤを活性化・不活性化させる環境を表すデータ」とし,一般的にコンテキ ストと呼ばれている分析対象となる情報のことを「環境を表すデータ」と する.2.2.2 コンテキストアウェアシステムのアーキテクチャ
コンテキストアウェアシステム開発における
COP
の立ち位置を図2.4
に 示す.COP
はプログラミング言語機構として,コンテキストに依存する振 る舞いをモジュール化するための機能を持っているため,ここではアーキテ クチャに関する技術として分類している.ここでは,同じくアーキテクチャ に分類したContext Toolkit
4)3) との違いについて述べる.Context Toolkit
は,センシング情報からコンテキストを判定し,それをサービスに反映させるためのフレームワークである4)3).
Context Toolkit
第
2
章 関連研究18
䝁䞁䝔䜻䝇䝖ุᐃ䛜 㔜ど䛥䜜䛶䛝䛯 䜰䝥䝸䜿䞊䝅䝵䞁ഃ䛻 䛹䛖ᫎ䛥䛫䜛䛾䛛䠛
図2.5 Context Toolkitの構造(Deyらの論文3)より)
の構造を図
2.5
に示す.図の下の部分がコンテキストを判断するための構造 であり,この部分をどのように実現するのかが重視されていることが図から も読み取れる.コンテキストによる振る舞いの違いをどのように実現するか については明示されていない.一方,COP
はコンテキストによって振る舞 いを変化させることを重視しており,そこがContext Toolkit
と異なるとこ ろである.2.3 COP の概要
COP
は実行時のコンテキストに応じて振る舞いを変化させることを可能 とするプログラミング技術である.Robert Hirschfeld らは,COPが対応す べき要素として,コンテキスト,振る舞いの変種,レイヤ,アクティベー ション,スコーピングを挙げている7).コンテキストという言葉は,
2.2
節で紹介したコンテキストアウェアネス に関する研究で使われてきており,いくつかの定義が存在する.COP
では,言語仕様として,計算上アクセス可能な情報はコンテキストとみなすことが できるとしている7).コンテキストとして挙げられるものとしては,システ ムを取り巻く外部環境だけでなく,システム内部で発生する情報も含まれ る.また,それらの変化の順序もコンテキストとみなすことができる.
第
2
章 関連研究19
ͬͬŽŶƚĞdžƚ:
䛻䛚䛡䜛,ĞůůŽŚĞůůŽ сŶĞǁ,ĞůůŽ;Ϳ͖
ŚĞůůŽ͘WƌŝŶƚ;Ϳ͖
ͬͬ
䝺䜲䝲ɲɴ䛾䜲䞁䝇䝍䞁䝇ůĂLJĞƌɲсŶĞǁ>ĂLJĞƌɲ;Ϳ͖
ůĂLJĞƌɴсŶĞǁ>ĂLJĞƌɴ;Ϳ͖
ͬͬ
䝺䜲䝲ɲ
䜢䜰䜽䝔䜱䝧䞊䝖ǁŝƚŚ;ɲͿ
ŚĞůůŽ͘WƌŝŶƚ;Ϳ͖
ͬͬ
䝺䜲䝲ɴ
䜢䜰䜽䝔䜱䝧䞊䝖ǁŝƚŚ;ɴͿ
ŚĞůůŽ͘WƌŝŶƚ;Ϳ͖
ƉƵďůŝĐůĂLJĞƌɲ
ƉƵďůŝĐǀŽŝĚ,ĞůůŽ͘WƌŝŶƚ;Ϳ
ƐLJƐƚĞŵ͘ŽƵƚ͘ƉƌŝŶƚůŶ;͞ɲ͟Ϳ͖
ƉƵďůŝĐůĂLJĞƌɴ
ƉƵďůŝĐǀŽŝĚ,ĞůůŽ͘WƌŝŶƚ;Ϳ
ƐLJƐƚĞŵ͘ŽƵƚ͘ƉƌŝŶƚůŶ;͞ɴ͟Ϳ͖
ƉƵďůŝĐĐůĂƐƐ,ĞůůŽ
ƉƵďůŝĐǀŽŝĚWƌŝŶƚ;Ϳ͙
図2.6 COPのサンプルプログラム
振る舞いの変種は,ベースとなるクラスやメソッドの部分定義であり,レ イヤは,これら振る舞いの変種をグループ化したモジュールである.既存の
COP
言語では,レイヤ上で部分定義されるクラスやメソッドのことをそれ ぞれパーシャルクラス,パーシャルメソッドと呼んでいる.COPはレイヤ を実行時のコンテキストに応じて動的にアクティベーションするフレーム ワークを持ち,これによって,プログラム中のクラス・メソッドを一度に変 更する.Robert Hirschfeld
らは,上記の論文において,レイヤアクティベーション のスコープを明示的に記述することの必要性を述べているが,COP言語に よっては必ずしもこれが満たされているとは限らない.レイヤアクティベー ションの方法の違いについては2.5
節で述べる.COP
のサンプルプログラムを図2.6
に示す.ここで使っているサンプル プログラムは,Java
のCOP
拡張であるContextJ
10)のものである.このプ ログラムでは,上記のCOP
の要素を用いてプログラムを実行中に振る舞い第
2
章 関連研究20
変更する方法について示している.レイヤαとβを定義し,その中でHello
クラスの
クティベーションは
with
ブロック内のスコープ範囲で行われ,この時にメ ソッド呼び出しを行うと,メソッドのディスパッチ先が変化する.2.4 COP 言語
COP
の研究によって,これまでに様々なCOP
言語が提案された.表2.1
にこれまでに提案された主なCOP
言語をまとめる.これらの言語は,ベー スとなるプログラミング言語を拡張することで実現されている20).ContextL
11) は,最初にCOP
の拡張を行った言語である.ContextL
はLisp
がベースであり,Common Lisp のオブジェクトシステムを拡張し ている.それに続き,動的プログラミング言語でCOP
ライブラリが開 発 さ れ た .こ れ ら の ラ イ ブ ラ リ は ,ベ ー ス と す る 言 語 で 提 供 さ れ る メ タレベルの機能を用いて実現されている.例として,Smalltalk
をベー スとするContextS
21),Ruby
をベースとするContextR
22),JavaScript
を ベースとするContextJS
23),Lua
をベースとするContextLua
24),Python
をベースとするContextPy
25) やPyContext
26),Erlang
をベースとするContextErlang
27) な ど が あ る .こ れ ら 動 的 プ ロ グ ラ ミ ン グ 言 語 以 外 に ,Java
を拡張したものとしてContextJ
10),ContextJ*
7),ContextLogicAJ
28),JCop
9),EventCJ29)30) などがある.また,C#のアスペクト指向プログラ ミング言語としてLOOM.NET
31) があり,このサンプルプログラムとして,
LOOM.NET
を用いCOP
を実現したものがある.ネイティブ環境で動作させることが可能な
COP
言語としては,Objective-C
をベースとし たSubjective-C
32)が挙げられる.この言語はmacOS
とiOS
を対象として いる.第
2
章 関連研究21
表2.1 既存COP言語の一覧
!"#$%&'("
)
*+,-%* &%/&0123
456789:;#$%&< 12;(
=> ? @A BCD,*+,-%*
E
FGHI;J%KBDLMNO
#PQR8S?TL,U#,VWX!
Y
%#,H1J%K Z[\]'(38J%KB
DLMNO#HIP^_`a"
= bb= ?cE dJ%K
e ebf f fg eh i gjk` lm"
n niop
BDLM/;J%Kqr!"0sJDNO#Ut
uvw45
e e@x?E
y*# ;45` zR8*+{&|}~J%
KBDLMNO# _`a"
=i =i #- w 123("
Yxf> Yxf >
#,1P"(BDLM/
!"
p pT pT'
p pT
#L,PQ"#L,9_
,!"
= Y
'BCD,^*+{&#{7
'(3 4!"#* *+{&w }z"
eio¡@? ¢ o¡@? ¢
b@e1 ?e£%LM/jk`¤¥6¦"1}
§¨;
第
2
章 関連研究22
2.5 COP の応用事例
これまで研究において,
COP
はスマートフォンアプリケーション29)33)34) やデスクトップアプリケーション35)36),サーバサイドソフトウェア37) 等 の開発で用いられてきた.スマートフォンアプリケーションでは,スマート フォンのGPS
や各種センサの値に応じてアプリケーションの振る舞いを変 更する.例えば,Malte Appeltauer
らは,GPS
情報の有無やスマホのバッ テリ残量によって,図2.7
のように地図表示の方法を変更するアプリケー ションを開発した33).このアプリケーションは待ち合わせをした友達と互 いに自分の位置を伝え合うアプリケーションで,相手のスマートフォンにGPS
情報がある場合は,それによって得られる位置情報が相手から通知さ れ,GPS
情報が無い場合は,事前に登録された予定や当日の交通情報から 予想される現在地を表示する.また,スマートフォンのバッテリの残量が少 なくなると,省電力のために文字だけの表示に切り替える.COP
では,こ のような変更を行う際に,図2.8
にようにアクティブなレイヤを切り替える ことで振る舞い変更を行う.デスクトップアプリケーションの応用事例としては,テキストエディタ の
CJEdit
35)や,グラフィカルエディタのGeuze
36)等がある.CJEditはド キュメントとコードを一緒に扱えるテキストエディタで,コンパイル単位内 のコメントにリッチテキストの書式設定を行うことができる.このテキスト エディタは,ユーザの現在の作業がプログラミングかコメント記述かによっ て,ユーザインタフェースやキーダウン等のアクションへのイベント処理 を変更する.Geuze
はグラフィカルエディタであり,画像描画中や画像移動 中といった,現在のソフトウェアの動作をコンテキストとして扱い,マウス クリックやマウス移動といったアクションへのイベント処理の内容を変更 する.サーバサイドソフトウェアの応用事例としては,ContextChat37) などが ある.これは,
ContextErlang
27)で書かれたインスタントメッセージサーバ で,ユーザはContextErlang
におけるコンテキストアウェアエージェントと して実装されている.これによって,ユーザがオフラインになると受信した第
2
章 関連研究23
㐩䛾䝇䝬䞊䝖䝣䜷䞁䛛䜙
⨨ሗ࿌䛜᭷䜛ሙྜ
㐩䛾䝇䝬䞊䝖䝣䜷䞁䛛䜙
⨨ሗ࿌䛜↓䛔ሙྜ
ሙᡤ䠖 䞉༤ከ㥐 ᆅୗ
άື䠖
䞉㟁㌴䜢᥈䛧䛶䛔䜛
⮬ศ䛾䝇䝬䞊䝖䝣䜷䞁䛾 䝞䝑䝔䝸ṧ㔞䛜ᑡ䛺䛔ሙྜ
䝇䜿䝆䝳䞊䝹䛸㏻ሗ䛛䜙 䛹䛾䛒䛯䜚䛻䛔䜛䛛䜢᥎ 'W^䛾
⨨ሗ
図2.7 COPのスマートフォンアプリケーションでの使用例
図2.8 スマートフォンアプリケーションのCOPでの実現例
メッセージがサーバに保存され,オンラインになると配信されるような仕組 みを実現している.また,オプションのバックアップ有効化によってリモー トサーバにメッセージを保存したり,メッセージに対する色の変更や絵文字 の追加などのカスタムフィルタを提供する.
第
2
章 関連研究24
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 レイヤアクティベーション: イベント駆動
第
2
章 関連研究28
2.7 COP と AOP の違い
本節では,コンテキスト指向プログラミング(
COP
)と類似の技術である アスペクト指向プログラミング(AOP)5)と比較し,その違いを示す.AOP
はオブジェクトに分割が難しい横断的関心事を扱うプログラミング 言語であり,ポイントカットと呼ぶ箇所に横断的関心事のモジュールを差し 込むことで関心事の分離を可能にしている5).COP
とAOP
は横断的関心 事をモジュール化するための特別な言語サポートがあるところが類似して いる.Salvaneschi
らは,AOP
とCOP
の焦点の違いとして,AOP
の焦点はモ ジュール化にあり,COPの焦点は実行時の振る舞い変更にあるとしている8).また,その根拠として,
COP
の研究が主にアクティベーションメカニズ ムに集中していることを挙げている.ダイナミックアスペクト指向プログラミング(
Dynamic Aspect Oriented
Programming :DAOP
)は,実行時にアスペクトをアクティブ化することが可能な