学位論文要旨



No 124366
著者(漢字) 青谷,知幸
著者(英字)
著者(カナ) アオタニ,トモユキ
標題(和) アスペクト指向プログラミング言語における実用的な利用者定義の解析に基づくポイントカット
標題(洋) Practical User-Defined Analysis-Based Pointcuts in an Aspect-Oriented Programming Language
報告番号 124366
報告番号 甲24366
学位授与日 2009.03.23
学位種別 課程博士
学位種類 博士(学術)
学位記番号 博総合第889号
研究科 総合文化研究科
専攻 広域科学専攻
論文審査委員 主査: 東京大学 准教授 増原,英彦
 東京大学 教授 玉井,哲雄
 東京大学 教授 山口,和紀
 東京大学 教授 柴山,悦哉
 東京工業大学 教授 千葉,滋
内容要旨 要旨を表示する

関心事の分離(SoC) の促進は、プログラミング言語の研究目標の1つである。分離された関心事はオブジェクト指向プログラミング言語におけるクラスやメソッド、ML やHaskell などの函数型プログラミング言語における函数やモジュールなどの、再利用可能なプログラム片に収められる。関心事がうまく分離できると、プログラム片の再利用性や保守性が向上するという利点がある。本研究では、アスペクト指向プログラミング言語について、プログラム解析に基づくポイントカットを実用化する技術を提案する。プログラム解析に基づくポイントカットはSoC を促進するために有効だと言われている。

アスペクト指向プログラミング(AOP)は、ロギングや並列化、メモ化、例外処理などの、クラスやメソッドではうまく分離できなかった関心事を、アスペクトと呼ばれる再利用性の高いプログラム片にまとめる技術である。ポイントカット・アンド・アドバイス(PA)機構は、AOP を実現する仕組みの1つとして注目され、Java 言語を拡張したAOP 言語AspectJ をはじめとする実用的なプログラミング言語で採用されている。PA 機構では、ポイントカットの具体的なクラスやメソッドの名前への依存度が低いほど、アスペクトの再利用性が高い。名前の代わりにプログラム解析から得られる情報に基づくポイントカットは、そのようなポイントカットの1つであり、これまでにいくつかの実現手法が提案されてきた。

だが実用化を考えると、これらの手法には、

1. ポイントカット定義のためにポイントカット記述のためにそれぞれ独自の言語を使っているためAspectJ をはじめとする主要なAOP 言語との親和性が低く、実用的な処理系の実装方法が明らかでない

2. プログラム解析のためのライブラリが提供されていない

3. ポイントカットを自由に組み合わせられるような言語設計であるため、ポイントカットの利用者がポイントカットの定義者の意図に反する使い方をしてしまう

という問題点があった。

AspctJ における解析ポイントカットの実用化のために、本研究は(1) プログラム解析に基づくポイントカットの新しい記述方法と実用的な処理系の作成手法を確立するとともに、(2) プログラム解析のためのライブラリやツールをポイントカット定義のために利用する仕組みを開発し、(3) どのプログラムにおいても機能しないポイントカットの発見手法を提案した。以下に、それぞれの詳細を述べる。

(1)AspectJ の汎用的な条件(if)ポイントカットの活用する新しい記述方法を提案し、SCoPE と呼ばれるコンパイルの枠組みを開発することで実用的な処理系の実現した。AspectJ の標準的な処理系では、条件ポイントカットを利用してプログラム解析に基づくポイントカットを定義すると、プログラム解析が実行時に行われるため、非常に大きい実行時オーバーヘッドが生じる。SCoPE では条件ポイントカットのうちコンパイル時に評価できるものを自動的に発見し、アスペクトを織り込んだプログラムの上で評価することで、プログラム解析にかかる実行時オーバーヘッドの問題を解決した。

実用性の観点から比較すると、他のプログラム解析を利用したポイントカットの実現手法に対して、SCoPEの手法には次に述べる2つの利点がある。第1に、AspectJ の構文と意味を変更しないためAspectJ との高い親和性を持ち、プログラマは新たな言語要素の使い方や言語を覚える必要が無く、統合開発環境などのAspectJ 向けの便利なツールをそのまま利用できる。第2に、既にあるAspectJ のコンパイラに対して条件ポイントカットの扱いのみを僅かに変更するだけでSCoPE を実現できるため、実装が容易である。実際にAspectJ の処理系の1つであるabc コンパイラを拡張してSCoPE コンパイラを作成したところ、Scala とJava の合計約1900 行のコードで実現できた。このSCoPE コンパイラはabc でコンパイルできるすべてのAspectJ のプログラムをコンパイルする。本研究では、このSCoPE コンパイラを用いて、プログラム解析に基づくポイントカットを(1) 現実的な時間でコンパイルでき、(2)HotSpot コンパイルなどの標準的なJava 仮想機械での最適化が有効である場合にはコンパイルされたプログラムにプログラム解析が原因の実行時オーバーヘッドがないことを、4種類のプログラムをコンパイルして実行しその時間を比較することで明らかにした。

(2)SCoPE コンパイラの実装にあたって、AspectJ のプログラムからプログラム解析のためのライブラリやツールを利用するためのインターフェースを定義し、ASM、Soot の2つのライブラリと、Java で書かれたプログラムのバグ発見ツールであるFindBugs の適用器を実装した。これらの適用器を適宜利用することによって、プログラマは、1からプログラム解析を記述することなくポイントカットを定義できる。NullPointerException が起こる場所を指定するポイントカットの記述のために、ポイントカットの実装者はインターフェースが提供するただ1つのメソッドを呼び出すだけでよいことを実例を示すことで明らかにした。

(3)ポイントカットに対して制約式を生成し、その制約式の中の矛盾を見つけ出すことで、どんなプログラムにおいても機能しないポイントカットをコンパイル時に発見する手法を提案した。どんなプログラムにおいても機能しないポイントカットを意図的に書くことはまれであるため、このようなポイントカットを見つけることは、バグのないプログラムを開発するために有効である。本研究の手法では、AspectJ の豊富なポイントカットについてポイントカット定義のみが与えられた状況でも、このようなポイントカットを発見できる。本研究ではFeatherweight Java にPA 機構を導入して拡張した小さな計算体系APFJ を定義し、矛盾の見つかった制約式を持つポイントカットが無意味であることを証明した。また、他の発見手法に比べて本研究の手法が有効であることを、無意味なポイントカットの例に対する発見可能性を比較することで示した。

審査要旨 要旨を表示する

本論文は、アスペクト指向プログラミング言語のポイントカット機構の改良について述べたものである。アスペクト指向プログラミング(AOP) 言語は、横断的関心事、すなわちセキュリティや実行記録などのように従来のプログラミング言語ではプログラムの全体にわたる記述が不可避であった処理を、アスペクトと呼ばれるモジュールにまとめることができるものとして注目を集めている。なかでもAOP 言語のポイントカット機構はアスペクトの記述力を決定する重要な要素であり、これにプログラム解析をとりいれてアスペクトの表現力を高める研究がこれまでにいくつか試みられている。本論文は、ポイントカットにプログラム解析をとりいれるための実用性の高い手法を提案し、処理系の構築と理論化によってそれを示したものである。

第一章では、上記のような論文の背景について述べている。第二章ではAOP言語の紹介と、プログラム解析に基づくポイントカットの応用例について示している。ここでは、これまでに知られている応用例だけでなく、プログラム誤り検出システムを統合できることや、実行効率の最適化に応用できるという新たな応用例も示されている。第三章では、AOP 言語のポイントカットにプログラム解析をとりいれる際の問題点を整理し、先行研究ではプログラム解析が適用される対象範囲が、明確に定義されていない、あるいはアスペクトが期待通りに動作するには不適切になっている、のどちらかであると指摘している。

第四章は、プログラム解析をとりいれたポイントカットの定義方法を提案している。この方法は、多くのAOP 言語に備わっている《条件ポイントカット》と《自己反映計算機構》を用いるもので、AOP 言語の文法を変更しない。従来の研究がプログラム解析のために独自のモデルと記述言語を定義していたのに対し、(1) 言語の文法を変更しないためコンパイラ・開発環境などの既存の言語処理系資産をほとんどそのまま利用でき、(2) 既存のプログラム解析ライブラリを利用することができるため少ない労力で様々な解析をとりいれることができるため、従来よりも実用性を大きく高めたものになっている。

第五章は、前章で提案された方法によって記述されたプログラムのコンパイル手法の提案である。プログラム解析をとりいれたAOP 言語に関する先行研究では、解析をプログラム実行時に行わなければいけないため速度が非常に遅いものか、高速に動作はするが解析範囲が不適切であるかのどちらかであったのに対し、提案手法は《二重コンパイル》と《バックパッチング》という2 つの手法によって問題を解決している。また、この方法は既存のAOP言語処理系の多くの部分を利用できるため、実現のための労力が小さいという点でも優れている。第六章では既存のプログラム解析ライブラリを第五章で提案したコンパイラとともに使用するための方法を示している。

第七章は、ポイントカットの組み合わせにおける誤りを発見する方法の提案である。プログラム解析をとりいれたポイントカットを他のポイントカットと組み合わせる場合には、ポイントカットの種類を適切に選ばなければいけないため、これまでのAOP 言語よりも誤りを起こしやすいという実用上の問題があった。本論文では多重継承と制約を用いた型システムによって、組み合わせの誤りを発見する方法を提案し、またその型システムの健全性を証明した。これによってより安全にアスペクトを定義する手法を実現する方向性を示している。解析を伴わないポイントカットに限定すれば、誤りを発見する手法はこれまでにもいくつか提案されているが、本論文の提案はこれらと比較しても発見できる誤りの種類が多い、より一般的なものとなっている。

第八章は、第五章で提案したコンパイラの性能と、第七章で提案した型システムの評価を行っている。実用的なアプリケーションプログラムを用いて既存のコンパイラと性能を比較した結果は、コンパイル時間の増加は数パーセント以内であることと、実行時最適化後の実行速度の増加はほぼゼロとなることを示し、提案手法が充分に実用的であることを示している。また、型システムについてはポイントカットの誤り検出能力についての定性的な比較を行い、5 つの先行研究と提案手法の中では、提案手法が最も多くの種類の誤りを発見できると結論している。

第九章は関連する研究について述べている。第十章は本論文の結果がまとめられている。

本論文の提案は、これまで主に理論的な可能性のみが論じられてきたAOP言語の機能を実用化するにあたっての課題を解決する重要なものである。またAOP 言語だけでなく、プログラム解析の結果によってプログラムの挙動を変化させるような言語機構一般に対する示唆を持つ意義のあるものだと言える。したがって、本審査委員会は博士(学術) の学位を授与するにふさわしいものと認定する。

UTokyo Repositoryリンク