プログラム解析情報のXMLデータベース化 ー 提案と実

プログラム解析情報のXMLデータベース化
ー 提案と実現 ー
山中祐介,大畑文明,井上克郎
大阪大学 大学院基礎工学研究科
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
発表内容
背景、目的
データベース化手法の提案
提案手法の実現
評価
関連研究
まとめと今後の課題
1
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
背景(1/2)
ソフトウェアの大規模化、複雑化
プログラミング言語の高級化
プログラムのデバッグ、理解が困難なものになっている
様々なプログラミング言語に対応する、プログラム解析
手法の提案、およびツールの実装が多くされている
2
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
背景(2/2)
プログラム解析ツールの問題点
解析情報がメモリ上にのみ記憶される
実行の度に対象プログラムを解析しなければならず
効率が悪い
データベースを構築し、効率化を計るツールも存在する
解析情報の記憶形態が独自形式
APIが特定のプログラミング言語を前提
プログラム解析情報の二次利用が容易でない
3
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
目的
XMLを用いたプログラム解析情報のデータベース化
データベース化による利点
解析結果の再利用による解析効率の向上
情報の保存による解析情報の二次利用
XMLを用いる利点
データ構造の定義が容易に行える
XML文書を扱うための様々なアプリケーションにより二次
利用が容易に行える
4
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
データベース化手法の提案(目次)
プログラム解析情報
意味解析木
XML
意味解析木のデータベース化
方針
XML要素定義
XML属性定義
例
5
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
プログラム解析情報
例
抽象構文木(Abstract Syntax Tree)
意味解析木(Semantic Tree)
手続き呼び出しグラフ(Call Flow Graph)
制御フローグラフ(Control Flow Graph)
‥
意味解析木に注目
多くのプログラム解析手法においてその存在が前提となり、
データベース化による効果が大きい
6
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
意味解析木
抽象構文木と意味情報とを組み合わせたもの
抽象構文木
プログラム言語固有の文法に従い記述されたソースコー
ドを、木構造で表現し構文情報を持たせたもの
構文情報(Syntax Information)
構文木が持つ予約語、識別子、演算子などの情報
意味情報(Semantic Information)
変数名、型名などの識別子に関する宣言と参照間の
関係を表す情報
7
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
XML
SGMLのサブセットで文書構造化言語の一つ
特徴
データ構造とそれが持つ情報を、容易かつ的確に表現
できる
要素(Element)などによる構造化
要素名、属性(Attribute)などの定義の自由さ
要素間の親子関係、属性の情報を厳密に定義できる
文書型定義、XMLスキーマ
XML文書を扱うためのAPI、アプリケーションが数多くある
API:SAX, DOM
アプリケーション:XSLT, XLink
8
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
意味解析木のXMLデータベース化
方針
Javaプログラムの意味解析木に対するXML表記を、定
義することでデータベース化を行う
意味解析木とXML文書は共に木構造
要素に意味解析木の節点を対応させ木構造を表現
意味解析木の各節点に構文情報、意味情報がある
対応する要素の属性が情報を保持
9
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
XML要素定義
Javaプログラムと要素の対応表(一部)
Java構文要素
XML要素名
要素が持つ子のBNF記述
メソッド宣言
Method
type Variable* Exception? Block?
変数宣言
Variable
type Expression_?
ブロック
Block
(Variable | ClassType | InterfaceType |
Statement_)*
演算
Operation
type Expression_ Expression_?
型参照
type
子要素なし
変数参照
variable
子要素なし
リテラル
Literal
子要素なし
10
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
XML属性定義
要素が持つ属性とその役割(一部)
属性名
役割
text
識別子、演算子などの構文情報
modifiers
修飾子情報(public, staticなど)
id
意味情報の宣言側が持つ情報
ref
意味情報の参照側が持つ情報
file
参照先が同一ファイル内でない場合、別ファイルにアクセスする
ための情報
11
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
意味解析木のXML表記の例
<Method modifiers=“public
modifiers="public static“
text="main" id="189b">
<type<?xml
text="void"
ref="4"/>
version="1.0" encoding="UTF-8"?>
<!DOCTYPE Java SYSTEM "java.dtd">
<Block>
<Java>
class Sample {
‥ <CompilationUnit>
<Package text=""/>
<Import text="java.lang.*"/>
public static void main(String[]
args)
{
<Variable
text="b" id="18ad">
<ClassType modifiers=""
modifiers="" text="Sam5" id="0x12">
<Extends>
<type
text="java.lang.Object"
text_="Object" ref="0x18" file="java/lang/Object.xml"/>
<type
text="int"
ref="7"/>
int a = 1;
</Extends>
<Variable modifiers="" text="this" id="0x13">
</Variable>
<type text="Sam5" ref="0x12"/>
int b;
</Variable>
<Variable modifiers="protected"
text="super" id="0x14">
<Operation
text="=">
<type text="java.lang.Object" text_="Object" ref="0x18" file="java/lang/Object.xml"/>
b = a + 1;
</Variable>
<type
text="int"
ref="7"/>
<Method
modifiers="public static"
text="main" id="0x189b">
<type text="void" ref="0x4"/>
System.out.println(a + “,” <variable
+ b);<Variable modifiers=""
text="args"ref="18ad"/>
id="0x18a4">
text="b"
<type text="java.lang.String[]" text_="String[]" ref="0x20"/>
</Variable>
}
<Operation
text="+">
<Block>
<Variable modifiers="" text="a" id="0x18a9">
text="int" ref="0x7"/> ref="7"/>
<type<type
text="int"
}
<Literal text="1"/>
</Variable>
<variable
text="a"
ref="18a9"/>
<Variable modifiers=""
text="b" id="0x18ad">
<type text="int" ref="0x7"/>
</Variable>
<Literal
text="1"/>
<Operation text="=">
<type text="int" ref="0x7"/>
</Operation>
<variable text="b" ref="0x18ad"/>
</Operation>
</Block>
</Operation>
</Method>
</ClassType>
‥ </CompilationUnit>
</Java>
</Block>
12
Software Engineering Research Group, Graduate
School of Engineering Science, Osaka University
</Method>
Javaプログラム解析フレームワーク
ソースコード
意味解析木
アプリケーション
ユーザ
Java
解析ライブラリ
API
解析ライブラリ
ソースコードを解析し意味解析木をメモリ上に構築
API
意味解析木の参照、更新手段を提供
アプリケーション
GUI、エイリアス解析ツール*
*大畑文明, 近藤和弘, 井上克郎: “エイリアスフローグラフを用いたオブジェクト指向プログラムの
エイリアス解析手法“, 電子情報通信学会論文誌D-1, Vol.J84-D-1, No.5, pp.1--11 13
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
XMLデータベースの実装
Javaプログラム解析フレームワークに、意味解析木XML変換ライブラリを用いて、XMLデータベースを実
装
XML文書
XML
意味解析木-XML
変換ライブラリ
ソースコード
意味解析木
<?xml…>
アプリケーション
ユーザ
Java
解析ライブラリ
API
14
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
意味解析木-XML変換ライブラリ
解析によって得られる意味解析木とデータベースで
あるXML文書を相互変換
開発言語:C++(libxml使用)、約4000行
変換手順
意味解析木→XML
意味解析木をたどり各構文木要素に対するタグを出力
XML→意味解析木
XMLパーザによりXML文書を解析しDOMツリーを構築
構築したDOMツリーに対する構文木要素を作成
15
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
評価(目次)
解析効率の改善
実際にソースコードを解析しデータベース化を行い比較
解析情報の二次利用の容易性
応用アプリケーションの実装による二次利用例
1. XML-Java変換
2. XML-HTML変換
3. XML-XML変換
16
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
解析効率の改善
JDK1.3付属ライブラリの全ソースコードを対象
XMLデータベース構築時間:45.6秒
解析時間(意味解析木の構築まで)
ソースプログラム:37秒
XMLデータベース:24秒
データベース構築時間を考慮しても
データベース化による恩恵は大きい
全ファイルサイズ
ソースプログラム:25MB
XMLデータベース:62MB
データベース化によるサイズの
肥大化は少ない
17
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
解析情報の二次利用の容易性
応用アプリケーションの実装
XMLデータベース
XML
<?xml…>
例1:XML-Java Java
変換プログラム
例2:XMLHTML変換プログラム
例3.XML-XML
変換プログラム
ユーザ
ソースコード
テキストエディタ
WEBブラウザ
HTML文書
HTML
<html>
18
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
応用例1:XML-Java変換
Javaプログラムのソースコードへの復元
意味解析木が持つ構文情報を利用
コンパイル、閲覧が十分可能なソースコードへの復元
実装
C++(libxml使用)、約1500行
XSLT(Xalan使用)、約2000行
19
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
応用例1:XML-Java変換(例)
XMLデータベース
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Java SYSTEM "java.dtd">
復元したJavaソースコード
import java.lang.*;
<Java>
<CompilationUnit>
<Package text=""/>
<Import text="java.lang.*"/>
<ClassType modifiers="" text="Sam5" id="0x12">
<Extends>
<type text="java.lang.Object" text_="Object" ref="0x18" file="java/lang/Object.xml"/>
</Extends>
<Variable modifiers="" text="this" id="0x13">
<type text="Sam5" ref="0x12"/>
</Variable>
<Variable modifiers="protected" text="super" id="0x14">
<type text="java.lang.Object" text_="Object" ref="0x18" file="java/lang/Object.xml"/>
</Variable>
<Method modifiers="public static" text="main" id="0x189b">
<type text="void" ref="0x4"/>
<Variable modifiers="" text="args" id="0x18a4">
<type text="java.lang.String[]" text_="String[]" ref="0x20"/>
</Variable>
<Block>
<Variable modifiers="" text="a" id="0x18a9">
<type text="int" ref="0x7"/>
<Literal text="1"/>
</Variable>
<Variable modifiers="" text="b" id="0x18ad">
<type text="int" ref="0x7"/>
</Variable>
<Operation text="=">
<type text="int" ref="0x7"/>
<variable text="b" ref="0x18ad"/>
</Operation>
</Block>
</Method>
</ClassType>
</CompilationUnit>
</Java>
class Sam5 extends Object {
元のJavaソースコード
class Sam5 {
public static void main(String[] args) {
public static void main(String[]
int a =args)
1;
{
int b;
int a = 1;
b = a + 1;
int b;
System.out.println(a + "," + b);
b = a + 1;
System.out.println(a +} “,” + b);
}
}
}
20
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
応用例2:XML-HTML変換
XML-Java変換プログラムの拡張
Webブラウザで閲覧できるようにソースコードに変換する
際、HTMLタグを埋め込む
意味情報を利用することで、識別子の宣言、及び参照
の関係をリンクを用いて表現
実装
XSLT(Xalan使用)、約2000行
21
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
応用例2:XML-HTML変換(例)
Sam5.html
class Sam5 {
public static void main(String[] args)
{
int a = 1;
int b;
b = a + 1;
System.out.println(a + “,” + b);
}
}
java/lang/System.html
22
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
応用例3:XML-XML変換
XMLデータベースが持つ識別子情報の置換
置換条件に識別子名の他に識別子のidを加えることで、
異なるスコープ上に存在する同一名の識別子を区別
識別子の区別が厳密なため、変換を行ってもプログラム
の整合性を保てる
実装
XSLT(Xalan使用)、約600行
23
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
応用例3:XML-XML変換(例)
変換前のXML文書
java.lang.String
<Variable modifiers="private" text="value" id="34">
<type
text="char[]"
ref="9"/>java.io.Serializable, Comparable {
class
String
implements
</Variable>
変数valueをafter_valueに変換
private char value[];
‥
‥
<Constructor modifiers="public" text="String" id="34e">
public
String(String
{ id="4d17">
<Variable
modifiers="" value)
text="value"
} <type text="java.lang.String" text_="String" ref="22"/>
</Variable> 変換後のXML文書
<Variable modifiers="private" text="after_value" id="34">
<type text="char[]" ref=“9"/>
</Variable>
idが違うため変換されない
‥
<Constructor modifiers="public" text="String" id="34e">
<Variable modifiers="" text="value" id="4d17">
<type text="java.lang.String" text_="String" ref="22"/>
24
</Variable>
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
関連研究(1/2)
JavaML*
Javaソースコードの代替的な表記を可能にするXMLアプリケー
ション
目的:プログラム変換、プログラム理解
実装
ソースコードに対してXMLタグを埋め込むライブラリをJavaコンパイラに追
加
本研究との相違点
意味情報は十分に含まれず、データベースとしては成り立たない
複数ファイル間におよぶ宣言、参照関係はサポートされていない
*G.J.Badoros: “JavaML:a markup language for JAVA source code”
Computer Networks 33, pp.159-177, 2000.
25
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
関連研究(2/2)
Sapid*
C言語のソースプログラムを管理するためのCASEツールプラット
フォーム
目的:通常のリポジトリが扱えない細かい粒度の構成要
素の管理
構成
ソフトウェアデータベース
アクセスルーチン
ソフトウェア操作言語
本研究との相違点
データベースへの参照、編集はSapid独自のAPI
*福安 直樹, 山本 晋一郎, 阿草 清滋: “細粒度ソフトウェア・リポジトリに基づいたCASEツール・
プラットフォームSapid“情報処理学会論文誌, Vol.39, No.6, pp.1990--1998 (1998/6)
26
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
まとめ
プログラム解析情報のXMLデータベース化
意味解析木をXMLを用いて表現
XMLの要素、属性を定義
XMLデータベースの実装
変換ライブラリを用いたJavaプログラム解析フレームワークへの
組み込み
評価
意味解析木の構築時間を比較し、解析効率の改善を確認
応用アプリケーションを実装し、二次利用の容易性を確認
27
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University
今後の課題
意味解析木以外の解析情報のデータベース化
手続き呼び出しグラフ
制御フローグラフ
‥
XML表記の粒度のカスタマイズ
情報量が多いデータベースを構築すると管理コストが増
大
ユーザ目的に応じて最適化されたデータベースを再構築
する機能
28
Software Engineering Research Group, Graduate School of Engineering Science, Osaka University