SlideShare a Scribd company logo
And/Or/Callグラフの提案と
ソースコード検索への応用
神谷年洋
公立はこだて未来大学
kamiya@fun.ac.jp
IPSJ SIGSS 2013年10月研究会 於 金沢
目次
1. 背景
2. 問題: 切り刻まれたコードからの検索
3. デモ
4. And/Or/Callグラフ
5. 検索アルゴリズム
6. プロトタイプ実装
7. まとめ

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢
背景: ソフトウェア開発における検索
ソースコードの検索は頻繁に行われる
➤ ある機能を実現するのに再利用可能なコンポーネントを探す
➤ あるコード断片を変更する前に類似コードを探す
➤ 特定のクラスやコンポーネントの利用方法のサンプルを探す

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢
背景: プログラミング言語の進化
ソースコードをより細かく切り刻むことが可能に
●

オブジェクトやクロージャ
データとその操作のまとまりを切り出す

●

アスペクト
条件やイベントによって動作すべきコード(関心事)を切り出す

●

依存性の注入(デコレータ, アノテーションなど)
依存関係の部分でコードを切り離す

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢
問題: 切り刻まれたコードからの検索
コードが切り刻まれることによって、検索が難しく
なる
(昔) 検索結果がひとつのソースファイル中で
見つかる

昔

⇩
(今) いくつかのソースファイルの部分を寄せあ
わせたものが検索結果になる
検索アルゴリズムと検索結果の表示方法の両面
に影響
●

「どうやって見つけるか?」

●

「どのように表示するか?」

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢

今
目標
目標
P1 切り刻まれたコードから検索するためのアルゴリズム
P2 検索結果のわかりやすい表示方法
既存の研究
●

PARSEWeb[13]
入力: 2 つの型
出力: それらの型のオブジェクト間の変換を行うためのメソッドの呼び
出し列

[13] S. Thummalapenta, Tao Xie, “Parseweb: a programmer assistant for reusing open source code on
the web,” Proc. the 22nd IEEE/ACM Int’l Conf. Automated Softw. Eng.(ASE ’07), pp. 204-213, 2007.
2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢
▶ デモ

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢
And/Or/Callグラフ
プログラム中のすべての実行パス
を保持する有向グラフ
–

●

(後述するソースコード検索アル
ゴリズムで利用)

プログラムを以下のルールに従っ
て変換したもの
●

呼び出し ➡ Call節点

順構造(逐次処理) ➡ And節点

●

●

繰り返し構造
➡ 0回の繰り返しに相当する順
構造, 1回の繰り返しに相当する
順構造, ...の分岐構造
➡ And節点/Or節点

分岐構造 ➡ Or節点

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢
And/Or/Callグラフ
プログラム中のすべての実行パス
を保持する有向グラフ
–

●

(後述するソースコード検索アル
ゴリズムで利用)

プログラムを以下のルールに従っ
て変換したもの
●

呼び出し ➡ Call節点

順構造(逐次処理) ➡ And節点

●

●

繰り返し構造
➡ 0回の繰り返しに相当する順
構造, 1回の繰り返しに相当する
順構造, ...の分岐構造
➡ And節点/Or節点

分岐構造 ➡ Or節点
And節点

B

2013/10/25

Or節点

A

C

D

Q

P

R

S

IPSJ SIGSS 2013年10月研究会 於 金沢
And/Or/Callグラフ
プログラム中のすべての実行パス
を保持する有向グラフ

●

(後述するソースコード検索アル
ゴリズムで利用)

プログラムを以下のルールに従っ
て変換したもの
●

呼び出し ➡ Call節点

順構造(逐次処理) ➡ And節点

●

●

繰り返し構造
➡ 0回の繰り返しに相当する順
構造, 1回の繰り返しに相当する
順構造, ...の分岐構造
➡ And節点/Or節点

分岐構造 ➡ Or節点
while (C) { B; }

C

2013/10/25

C

B

C

C

IPSJ SIGSS 2013年10月研究会 於 金沢

B

C

B

C
And/Or/Callグラフ
プログラム中のすべての実行パス
を保持する有向グラフ

●

(後述するソースコード検索アル
ゴリズムで利用)

プログラムを以下のルールに従っ
て変換したもの
●

呼び出し ➡ Call節点

順構造(逐次処理) ➡ And節点

●

●

繰り返し構造
➡ 0回の繰り返しに相当する順
構造, 1回の繰り返しに相当する
順構造, ...の分岐構造
➡ And節点/Or節点

分岐構造 ➡ Or節点
Call節点

finv

呼び出しているつ
もりのもの

呼び出されている
もの

fbody
A

2013/10/25

s1
B
IPSJ SIGSS 2013年10月研究会 於 金沢

s2
C

s3
D
n <= 2

例

return 1
fibo

繰り返しによってフィ
ボナッチ数を求める

R

a = 1
b = 1
i = 2

a = b

public static int fibo(int n) {
if (n <= 2)
return 1;
int a = 1;
int b = 1;
for (int i = 2; i < n; ++i) {
int c = a + b;
a = b;
b = c;
}
return b;
}
2013/10/25

i < n
c = a + b

手続き(Java)
20
21
22
23
24
25
26
27
28
29
30
31

i < n

IPSJ SIGSS 2013年10月研究会 於 金沢

return b

b = c
i < n
n <= 2

例

return 1
fibo

●

分岐構造
➡ Or節点

R

a = 1

i < n

b = 1
i = 2

i < n
c = a + b
a = b

20
21
22
23
24
25
26
27
28
29
30
31

public static int fibo(int n) {
if (n <= 2)
return 1;
int a = 1;
int b = 1;
for (int i = 2; i < n; ++i) {
int c = a + b;
a = b;
b = c;
}
return b;
}
2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢

return b

b = c
i < n
n <= 2

例

return 1
fibo

●

繰り返し構造
➡ Or/And節点

a = 1
b = 1

R

0回の繰り返し
i < n

1回の繰り返し

i = 2

i < n
c = a + b
a = b

20
21
22
23
24
25
26
27
28
29
30
31

return b

b = c

public static int fibo(int n) {
if (n <= 2)
i < n
return 1;
int a = 1;
int b = 1;
for (int i = 2; i < n; ++i) {
int c = a + b;
a = b;
実装では0回と 回の繰り返しに相当
1
b = c;
する部分だけを生成
}
return b;
← 仮定: それより多い回数の繰り
}
2013/10/25

返しは検索目的では不要

IPSJ SIGSS 2013年10月研究会 於 金沢
例 (プログラム全体)
1 class Fibo {
2
public static void main(String[] args) {
3
int n = inputNumber(args);
4
int fiboN = Fibo.fibo(n);
main
エントリポイント
5
outputAnswer(fiboN);
6
}
inputNumber
コンソール入力
7
public static int inputNumber(String[] args) {
8
String numStr = null;
9
if (args.length >= 1)
outputNumber コンソール出力
10
numStr = args[0];
11
else {
fibo
フィボナッチ数の計算
12
java.io.Console cnsl = System.console();
13
numStr = cnsl.readLine("n = ? ");
(前述)
14
}
15
return Integer.valueOf(numStr);
16
}
17
public static void outputAnswer(int n) {
18
System.out.println("fibo(n) = " + n);
19
}
20
public static int fibo(int n) {
21
if (n <= 2)
22
return 1;
23
int a = 1;
24
int b = 1;
25
for (int i = 2; i < n; ++i) {
26
int c = a + b;
27
a = b;
28
b = c;
29
}
30
return b;
31
}
32 }
IPSJ SIGSS 2013年10月研究会 於 金沢
2013/10/25

プログラムの構造
例 (プログラム全体)
1 class Fibo {
2
public static void main(String[] args) {
3
int n = inputNumber(args);
4
int fiboN = Fibo.fibo(n);
●
5
outputAnswer(fiboN);
6
}
7
public static int inputNumber(String[] args) {
8
String numStr = null;
9
if (args.length >= 1)
10
numStr = args[0];
11
else {
12
java.io.Console cnsl = System.console();
13
numStr = cnsl.readLine("n = ? ");
14
}
15
return Integer.valueOf(numStr);
16
}
inputNumber
17
public static void outputAnswer(int n) {
18
System.out.println("fibo(n) = " + n);
19
}
20
public static int fibo(int n) {
21
if (n <= 2)
22
return 1;
main
23
int a = 1;
24
int b = 1;
25
for (int i = 2; i < n; ++i) {
26
int c = a + b;
27
a = b;
printAnswer
28
b = c;
29
}
30
return b;
31
}
32 }
IPSJ SIGSS 2013年10月研究会 於 金沢
2013/10/25

呼び出し ➡ Call節点
numStr = null
args.length >= 1
numStr = args[0]
cnsl =
System.console
numStr =
cnsl.readLine
Integer.valueOf

"fibo(n) = " + n

println
動的なディスパッチの扱い
動的なディスパッチ
●

●

いくつかの候補となる手
続き
実行時に呼び出される手
続きが選ばれる

➡ 分岐構造
候補となる手続きのいず
れかに分岐する

2013/10/25

Triangle.draw()
Shape.draw()

Rectangle.draw()
Ellipse.draw()

図8 動的なディ
スパッチの模式図

IPSJ SIGSS 2013年10月研究会 於 金沢
And/Or/Callグラフから実行パスへ
1. 根(実行を開始するエントリポイント)を決めて、
2. 深さ優先で走査する
2-1. And節点の子節点はすべて走査する
2-2. Or節点/Call節点の子節点はひとつ選択して走査する
n <= 2

n <= 2
return 1

fibo
R

a = 1

return 1
i < n
fibo

b = 1
i = 2

R
i < n

a = 1

i < n

b = 1
i = 2

i < n

c = a + b
a = b
return b

c = a + b
a = b

b = c
i < n

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢

return b

b = c
i < n
キーワード検索アルゴリズム
入力: 節点を特定するための検索語(複数)
出力: 指定した節点を含む連結した部分グラフ
「連結した」 → 実行パスに変換できる
「部分グラフ」→ コード断片
部分グラフを見つける基準
●

元のグラフの根からなるべく遠いもの
← 仮定: (検索結果として)小さな処理を行っているものが望ましい

●

なるべく浅いもの
← 仮定: 手続きの呼び出しの入れ子が少ないものが望ましい

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢
ラベルとサマリ
●

ラベル
–
–

●

節点に付けられた名前
検索語

numStr = null

サマリ
–

args.length >= 1

ある節点 n のサマリ S(n) とは、その節点
から有向辺をたどることで到達可能なす
べての節点のラベルの集合

–

inputNumber
cnsl =
System.console
numStr =
cnsl.readLine

性質
–

numStr = args[0]

main

Integer.valueOf

節点 n とその子節点 c について、
S(n) ⊇ S(c)
根のサマリは、木の(根を除く)すべての
節点のラベルを持つ

2013/10/25

"fibo(n) = " + n
printAnswer

IPSJ SIGSS 2013年10月研究会 於 金沢

println
ラベルとサマリ
●

ラベル
–
–

●

節点に付けられた名前
検索語

numStr = null

サマリ
–

args.length >= 1

ある節点 n のサマリ S(n) とは、その節点
から有向辺をたどることで到達可能なす
べての節点のラベルの集合

–

inputNumber
cnsl =
System.console
numStr =
cnsl.readLine

性質
–

numStr = args[0]

main

節点 n とその子節点 c について、
S(n) ⊇ S(c)
根のサマリは、木の(根を除く)すべての
節点のラベルを持つ

2013/10/25

Integer.valueOf

{ “numStr = cnsol.readLine” }
"fibo(n) = " + n
printAnswer

IPSJ SIGSS 2013年10月研究会 於 金沢

println
ラベルとサマリ
●

ラベル
–
–

●

節点に付けられた名前
検索語

numStr = null

サマリ
–

args.length >= 1

ある節点 n のサマリ S(n) とは、その節点
から有向辺をたどることで到達可能なす
べての節点のラベルの集合

–

inputNumber
cnsl =
System.console
numStr =
cnsl.readLine

性質
–

numStr = args[0]

main

節点 n とその子節点 c について、
S(n) ⊇ S(c)
根のサマリは、木の(根を除く)すべての
節点のラベルを持つ

2013/10/25

Integer.valueOf

{ “cnsl = System.console”,
“numStr = cnsol.readLine”, }

"fibo(n) = " + n

printAnswer

IPSJ SIGSS 2013年10月研究会 於 金沢

println
ラベルとサマリ
●

ラベル
–
–

●

節点に付けられた名前
検索語

numStr = null

サマリ
–

args.length >= 1

ある節点 n のサマリ S(n) とは、その節点
から有向辺をたどることで到達可能なす
べての節点のラベルの集合

–

inputNumber
cnsl =
System.console
numStr =
cnsl.readLine

性質
–

numStr = args[0]

main

節点 n とその子節点 c について、
S(n) ⊇ S(c)
根のサマリは、木の(根を除く)すべての
節点のラベルを持つ

2013/10/25

{ “numStr = args[0]”,
“cnsl = System.console”,
“numStr = printAnswer
cnsol.readLine”, }

IPSJ SIGSS 2013年10月研究会 於 金沢

Integer.valueOf

"fibo(n) = " + n

println
ラベルとサマリ
●

ラベル
–
–

●

{ “inputNumber”,
節点に付けられた名前
“numStr = null”,
検索語
“args.length >= 1”,

numStr = null

“numStr = args[0]”,
“cnsl = System.console”,
“numStr = cnsol.readLine”,
– ある節点 n のサマリ S(n) とは、その節点
“Integer.valueOf”,
から有向辺をたどることで到達可能なす
…
べての節点のラベルの集合
“printAnswer”,
““fobo(n) = ” + n”,
“printLn” }

サマリ

性質
–

–

args.length >= 1
numStr = args[0]
inputNumber
cnsl =
System.console
numStr =
cnsl.readLine
main

Integer.valueOf

節点 n とその子節点 c について、
S(n) ⊇ S(c)
根のサマリは、木の(根を除く)すべての
節点のラベルを持つ

2013/10/25

"fibo(n) = " + n
printAnswer

IPSJ SIGSS 2013年10月研究会 於 金沢

println
アルゴリズム
(S1) 局所的に深い位置にある(検索語をすべて含む)部分木に相当す
る部分グラフを求める
–

サマリを利用しながら

(S2) 部分グラフの葉を深いものから順に(検索語をすべて含むという
条件が満たされる限り)取り除く
–

浅い部分グラフを作る

(オプションで)
(S3) 葉から順に検索語のいずれかをラベルとしない節点を取り除く

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢
例
クエリ { “args[0]”,“valueOf” }
(S1) 局所的に深い位置にある(検索語をす
べて含む)部分木に相当する部分グラフ
を求める

numStr = null
args.length >= 1

(S2) 部分グラフの葉を深いものから順に(検
索語をすべて含むという条件が満たさ
れる限り)取り除く

numStr = args[0]
inputNumber
cnsl =
System.console

(S3) 葉から順に検索語のいずれかをラベル
としない節点を取り除く

numStr =
cnsl.readLine
main

Integer.valueOf

"fibo(n) = " + n
printAnswer
println

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢
例
クエリ { “args[0]”,“valueOf” }
(S1) 局所的に深い位置にある(検索語をす
べて含む)部分木に相当する部分グラフ
を求める

numStr = null
args.length >= 1

(S2) 部分グラフの葉を深いものから順に(検
索語をすべて含むという条件が満たさ
れる限り)取り除く

numStr = args[0]
inputNumber
cnsl =
System.console

(S3) 葉から順に検索語のいずれかをラベル
としない節点を取り除く

numStr =
cnsl.readLine
main

Integer.valueOf

"fibo(n) = " + n
printAnswer

{ “numStr = null”,
“args.length >= 1”,
“numStr = args[0]”,
“cnsl = System.console”,
“numStr = cnsol.readLine”,
“Integer.valueOf” }
2013/10/25

println

{ “numStr = args[0]”,
“cnsl = System.console”,
“numStr = cnsol.readLine”, }

IPSJ SIGSS 2013年10月研究会 於 金沢
例
クエリ { “args[0]”,“valueOf” }
(S1) 局所的に深い位置にある(検索語をす
べて含む)部分木に相当する部分グラフ
を求める

numStr = null
args.length >= 1

(S2) 部分グラフの葉を深いものから順に(検
索語をすべて含むという条件が満たさ
れる限り)取り除く

numStr = args[0]
inputNumber
cnsl =
System.console

(S3) 葉から順に検索語のいずれかをラベル
としない節点を取り除く

numStr =
cnsl.readLine
main

Integer.valueOf

"fibo(n) = " + n
printAnswer
println

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢
例
クエリ { “args[0]”,“valueOf” }
(S1) 局所的に深い位置にある(検索語をす
✔
べて含む)部分木に相当する部分グラフ
を求める
(S2) 部分グラフの葉を深いものから順に(検
索語をすべて含むという条件が満たさ
れる限り)取り除く

numStr = null
args.length >= 1
numStr = args[0]
inputNumber

(S3) 葉から順に検索語のいずれかをラベル
としない節点を取り除く

cnsl =
System.console
numStr =
cnsl.readLine
Integer.valueOf

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢
例
クエリ { “args[0]”,“valueOf” }
(S1) 局所的に深い位置にある(検索語をす
✔
べて含む)部分木に相当する部分グラフ
を求める
(S2) 部分グラフの葉を深いものから順に(検
索語をすべて含むという条件が満たさ
れる限り)取り除く

numStr = null
args.length >= 1
numStr = args[0]
inputNumber

(S3) 葉から順に検索語のいずれかをラベル
としない節点を取り除く

cnsl =
System.console
numStr =
cnsl.readLine
Integer.valueOf

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢
例
クエリ { “args[0]”,“valueOf” }
(S1) 局所的に深い位置にある(検索語をす
✔
べて含む)部分木に相当する部分グラフ
を求める
(S2) 部分グラフの葉を深いものから順に(検
索語をすべて含むという条件が満たさ
れる限り)取り除く

numStr = null
args.length >= 1
numStr = args[0]
inputNumber

(S3) 葉から順に検索語のいずれかをラベル
としない節点を取り除く

cnsl =
System.console
numStr =
cnsl.readLine
Integer.valueOf

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢
例
クエリ { “args[0]”,“valueOf” }
(S1) 局所的に深い位置にある(検索語をす
✔
べて含む)部分木に相当する部分グラフ
を求める
(S2) 部分グラフの葉を深いものから順に(検
索語をすべて含むという条件が満たさ
れる限り)取り除く

numStr = null
args.length >= 1
numStr = args[0]
inputNumber

(S3) 葉から順に検索語のいずれかをラベル
としない節点取り除く
としない節点を取り除く

cnsl =
System.console
numStr =
cnsl.readLine
Integer.valueOf

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢
例
クエリ { “args[0]”,“valueOf” }
(S1) 局所的に深い位置にある(検索語をす
✔
べて含む)部分木に相当する部分グラフ
を求める
(S2) 部分グラフの葉を深いものから順に(検
索語をすべて含むという条件が満たさ
れる限り)取り除く

numStr = null
args.length >= 1
numStr = args[0]
inputNumber

(S3) 葉から順に検索語のいずれかをラベル
としない節点を取り除く

cnsl =
System.console
numStr =
cnsl.readLine
Integer.valueOf

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢
例
クエリ { “args[0]”,“valueOf” }
(S1) 局所的に深い位置にある(検索語をす
✔
べて含む)部分木に相当する部分グラフ
を求める
(S2) 部分グラフの葉を深いものから順に(検
索語をすべて含むという条件が満たさ
れる限り)取り除く

numStr = null
args.length >= 1
numStr = args[0]
inputNumber

(S3) 葉から順に検索語のいずれかをラベル
としない節点を取り除く

cnsl =
System.console
numStr =
cnsl.readLine
Integer.valueOf

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢
例
クエリ { “args[0]”,“valueOf” }
(S1) 局所的に深い位置にある(検索語をす
✔
べて含む)部分木に相当する部分グラフ
を求める
(S2) 部分グラフの葉を深いものから順に(検
✔
索語をすべて含むという条件が満たさ
れる限り)取り除く

numStr = null
args.length >= 1
numStr = args[0]
inputNumber

(S3) 葉から順に検索語のいずれかをラベル
としない節点を取り除く
Integer.valueOf

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢
例
クエリ { “args[0]”,“valueOf” }
(S1) 局所的に深い位置にある(検索語をす
✔
べて含む)部分木に相当する部分グラフ
を求める
(S2) 部分グラフの葉を深いものから順に(検
✔
索語をすべて含むという条件が満たさ
れる限り)取り除く

numStr = null
args.length >= 1
numStr = args[0]
inputNumber

(S3) 葉から順に検索語のいずれかをラベル
としない節点を取り除く
Integer.valueOf

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢
例
クエリ { “args[0]”,“valueOf” }
(S1) 局所的に深い位置にある(検索語をす
✔
べて含む)部分木に相当する部分グラフ
を求める
(S2) 部分グラフの葉を深いものから順に(検
✔
索語をすべて含むという条件が満たさ
れる限り)取り除く
(S3) 葉から順に検索語のいずれかをラベル
✔
としない節点を取り除く

numStr = args[0]
inputNumber

検索結果
Integer.valueOf

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢
検索結果を実行パスへ変換
(オプションで)
検索結果の部分グラフを実行パ
スに変換する
クエリ { “a”,“b” }

ただし
変換された実行パスが検索語を
すべて含むとは限らない
–

Or節点の子接点のどちらかにのみ
含まれる検索語

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢

a
m
b
プロトタイプ実装
●

実装
–
–
–

制約

適用対象はJavaのソースコー
ド
Pythonで記述。約8千行(プロ
ダクションコード)
メソッド呼び出しの型を解析す
るためにSoot[15]を利用

–

http://www.sable.mcgill.ca/
soot/

–

●

–

●

jEdit(18万行)のプロダクトに
適用 (update☺)

検索語
●

–

メソッド名、型の名前、文字列リ
テラル

例外処理
●

例外が送出されなかったコード
のみが検索対象

エントリポイント
●
●

mainやクラス初期化など
@Testなどは未対応

[15] R. Vallée-Rai, L. Hendren, V. Sundaresan, P. Lam, E.Gagnon, Phong Co, “Soot - a Java
Optimization Framework,” Proc. IBM Centre for Advanced Studies Conf. 1999
2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢
ツールのコマンドライン/表示の説明
表示

コマンドライン
●

インデクサ
–
–

●

●

バイトコードをディスアセンブル
ディスアセンブルされたコードを解析
する

●

–

型名、メソッド名、文字列リテラル
メソッド呼び出しのレシーバーのクラ
ス名、戻り値の型名、メソッド名、パラ
メタの形名(update☺)

2013/10/25

{ }、インデント
–

検索
–

メソッド呼び出しのレシーバー、戻
り値の型、メソッド名、パラメタの型

●

メソッドに実行パスがメソッドの
コードに入る/出る

行番号

IPSJ SIGSS 2013年10月研究会 於 金沢
まとめ
●

目的: 切り刻まれたソースコードからの検索
–
–

●

P1 切り刻まれたコードから検索するためのアルゴリズム
P2 検索結果をわかりやすく表示する方法

提案手法
–

And/Or/Callグラフ
●
●

–
●

静的解析
実行パスへの変換

検索アルゴリズム

プロトタイプ実装
–
–

制約
デモ
http://github.com/tos-kamiya/agoatで公開予定

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢
想定QA集
想定QA集

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢
And/Or/Call「木」じゃないの?
●

全体としては有向グラフ
–
–

●

エントリポイントは複数ある
呼び出される手続きのところで辺が合流する

検索アルゴリズムは部分木を対象とする
–

特定のエントリポイントを根とする
main

a

<cinit>

b

run
2013/10/25

c
IPSJ SIGSS 2013年10月研究会 於 金沢

p

q
なぜバイトコードを解析したの?
明示的な分岐、繰り返しは含まれていないのでは?
●

ソースコードあるいはASTを解析するのと比較して
型の解析が終わっているので情報を取りやすい
– 値のデータも(次ページ)
Javaのバイトコードはgotoとラベルによってif, while, forによ
る制御を表現
–

●

–

switch-case, throw-catchについては専用の表現

➜ gotoとラベルから分岐構造、繰り返し構造を回復
–

✗ Brute-forceで実行パスに変換 �
●

2013/10/25

実行パスは天文学的な数です

IPSJ SIGSS 2013年10月研究会 於 金沢
Sootって何?
●

JVMはスタックマシンなので、引数の値を調べるの面倒 �
➜ Sootでらくらく解析�
–

ただし、ソースコードの行番号との対応は出してくれない。別途頑張る

public void helloSomeone(java.lang.String);
public void helloSomeone(java.lang.String)
Code:
{
0: getstatic #2
// Field java/lang/System.out:Ljava/io/PrintStream;
HelloWorld r0;
3: ldc
#7
// String Hello, %s!n
java.lang.String r1;
5: iconst_1
java.io.PrintStream $r2;
6: anewarray #8 // class java/lang/Object
java.lang.Object[] $r3;
9: dup
10: iconst_0
r0 := @this;
11: aload_1
r1 := @parameter0;
12: aastore
13: invokevirtual #9 // Method java/io/PrintStream.format:(Ljava... $r2 = java.lang.System.out;
$r3 = newarray (java.lang.Object)[1];
16: pop
$r3[0] = r1;
17: return
$r2.format("Hello, %s!n", $r3);
LineNumberTable:
return;
line 7: 0
}
line 8: 17
2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢
なぜ(わざわざ)And/Or/Callグラフ(なんても
の)を導入した(する必要があった)の?
●

●

手続きの呼び出しと、分岐、逐次処理を同列に扱える
セマンティクス、中間表現が欲しかったから
制御構造と実行パスを、グラフ上の問題として(あるい
は論理式のようなもので)考えることができる
n <= 2
n <= 2

fibo
return 1

fibo

return 1

R

R

n <= 2
fibo

2013/10/25

IPSJ SIGSS 2013年10月研究会 於 金沢

More Related Content

PPTX
x86x64 SSE4.2 POPCNT
PDF
プログラムを高速化する話
PDF
任意粒度機能モデルに基づく動的型付けプログラミング言語向けソースコード検索手法の提案
PDF
実用Brainf*ckプログラミング
PDF
第2回 JavaScriptから始めるプログラミング2016
PDF
AtCoder Regular Contest 030 解説
PDF
第3回 JavaScriptから始めるプログラミング2016
PDF
第四回 JavaScriptから始めるプログラミング2016
x86x64 SSE4.2 POPCNT
プログラムを高速化する話
任意粒度機能モデルに基づく動的型付けプログラミング言語向けソースコード検索手法の提案
実用Brainf*ckプログラミング
第2回 JavaScriptから始めるプログラミング2016
AtCoder Regular Contest 030 解説
第3回 JavaScriptから始めるプログラミング2016
第四回 JavaScriptから始めるプログラミング2016

What's hot (20)

PPTX
for関数を使った繰り返し処理によるヒストグラムの一括出力
PDF
楕円曲線入門 トーラスと楕円曲線のつながり
PDF
グラフニューラルネットワーク入門
PPTX
R高速化
PDF
brainfuckを吐く自作言語bf-reusable
PDF
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
PDF
【Unity道場スペシャル 2017札幌】乱数完全マスター
PPTX
CG2013 05
PDF
KMC JavaScriptから始めるプログラミング2016 第一回
PDF
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014
PPTX
機械学習
PPTX
CG2013 03
PDF
Rustで始める競技プログラミング
PDF
【Unity道場】ゲーム制作に使う数学を学習しよう
KEY
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
PDF
プログラミングコンテストでのデータ構造 2 ~動的木編~
PDF
明日使えないすごいビット演算
PDF
Introduction to NumPy & SciPy
PPTX
SIMDで整数除算
PDF
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用
for関数を使った繰り返し処理によるヒストグラムの一括出力
楕円曲線入門 トーラスと楕円曲線のつながり
グラフニューラルネットワーク入門
R高速化
brainfuckを吐く自作言語bf-reusable
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017札幌】乱数完全マスター
CG2013 05
KMC JavaScriptから始めるプログラミング2016 第一回
Deep Learningと他の分類器をRで比べてみよう in Japan.R 2014
機械学習
CG2013 03
Rustで始める競技プログラミング
【Unity道場】ゲーム制作に使う数学を学習しよう
PyOpenCLによるGPGPU入門 Tokyo.SciPy#4 編
プログラミングコンテストでのデータ構造 2 ~動的木編~
明日使えないすごいビット演算
Introduction to NumPy & SciPy
SIMDで整数除算
ElGamal型暗号文に対する任意関数演算・再暗号化の二者間秘密計算プロトコルとその応用
Ad

Similar to And/Or/Callグラフの提案とソースコード検索への応用 (20)

PPTX
ぱっと見でわかるC++11
PDF
クロージャデザインパターン
PDF
Rを用いたGIS
PDF
わんくま同盟大阪勉強会#61
PDF
動的計画法の並列化
PPTX
R -> Python
PPTX
PPTX
F#のすすめ
PDF
PythonによるDeep Learningの実装
PPTX
Unity C#3からC#6に向けて
PDF
わかるコードを書くために For writing clean code
PPTX
Live Coding で学ぶ C# 7
PDF
Cython intro prelerease
PDF
20171212 titech lecture_ishizaki_public
PPTX
OpenGLと行列
PPTX
OpenGLと行列
PDF
Python 機械学習プログラミング データ分析ライブラリー解説編
PPTX
2018/06/23 Sony"s deep learning software and the latest information
PDF
Usp友の会勉強会、ジャクソン構造図の巻(前編)
PDF
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
ぱっと見でわかるC++11
クロージャデザインパターン
Rを用いたGIS
わんくま同盟大阪勉強会#61
動的計画法の並列化
R -> Python
F#のすすめ
PythonによるDeep Learningの実装
Unity C#3からC#6に向けて
わかるコードを書くために For writing clean code
Live Coding で学ぶ C# 7
Cython intro prelerease
20171212 titech lecture_ishizaki_public
OpenGLと行列
OpenGLと行列
Python 機械学習プログラミング データ分析ライブラリー解説編
2018/06/23 Sony"s deep learning software and the latest information
Usp友の会勉強会、ジャクソン構造図の巻(前編)
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
Ad

More from Kamiya Toshihiro (14)

PDF
ソースコード推薦あるいは修正の情報源としての質問掲示板とソースコードレポジトリの比較
PDF
Code Difference Visualization by a Call Tree
PDF
実行トレース間のデータの差異に基づくデータフロー解析手法の提案
PDF
コードクローン研究 ふりかえり ~ストロング・スタイルで行こう~
PDF
逆戻りデバッグ補助のための嵌入的スパイの試作
PDF
Introducing Parameter Sensitivity to Dynamic Code-Clone Analysis Methods
PDF
任意粒度機能モデルコードクローン検出手法のリファクタリング理解への適用の試み
PDF
An Execution-Semantic and Content-and-Context-Based Code-Clone Detection and ...
PDF
Web アプリケーションの UI 機能テストの ための HTML 構造パターンの抽出手法
PDF
WebアプリケーションのUI機能テストのためのHTML構造パターンの提案
PDF
An Algorithm for Keyword Search on an Execution Path
PDF
PBLへのアジャイル開発手法導入の試み
PDF
任意粒度機能モデルに基づくコードクローン検出手法の大規模プログラムの適用に向けた改善
PDF
任意粒度機能モデルに基づくバイトコードからのコードクローン検出手法
ソースコード推薦あるいは修正の情報源としての質問掲示板とソースコードレポジトリの比較
Code Difference Visualization by a Call Tree
実行トレース間のデータの差異に基づくデータフロー解析手法の提案
コードクローン研究 ふりかえり ~ストロング・スタイルで行こう~
逆戻りデバッグ補助のための嵌入的スパイの試作
Introducing Parameter Sensitivity to Dynamic Code-Clone Analysis Methods
任意粒度機能モデルコードクローン検出手法のリファクタリング理解への適用の試み
An Execution-Semantic and Content-and-Context-Based Code-Clone Detection and ...
Web アプリケーションの UI 機能テストの ための HTML 構造パターンの抽出手法
WebアプリケーションのUI機能テストのためのHTML構造パターンの提案
An Algorithm for Keyword Search on an Execution Path
PBLへのアジャイル開発手法導入の試み
任意粒度機能モデルに基づくコードクローン検出手法の大規模プログラムの適用に向けた改善
任意粒度機能モデルに基づくバイトコードからのコードクローン検出手法

And/Or/Callグラフの提案とソースコード検索への応用