n class Manager extends Employee ManagerString n int

  • Slides: 25
Download presentation

エイリアス n (引数の参照渡し・参照変数・ポインタを介した間接 参照などで生じる,)同じメモリ領域を指す可能性の ある式間の同値関係 参照変数 class Manager extends Employee { Manager(String n, int

エイリアス n (引数の参照渡し・参照変数・ポインタを介した間接 参照などで生じる,)同じメモリ領域を指す可能性の ある式間の同値関係 参照変数 class Manager extends Employee { Manager(String n, int s) { super(n, s); } void manage(Employee e) { e. set_boss(this); e. add_salary(50); } } 2000/03/09 インスタンス生成式 class Office { public static void main(String args[]) { Employee A = new Employee("Mr. A", 700); Manager B = new Manager("Mr. B", 850); B. manage(A); 「エイリアス指定 A. print(); B. print(); 」 } } 第 126回 ソフトウェア 学研究会 3

エイリアス計算手順 n 到達エイリアス集合(Reaching Alias, RA)を利用 n n RA(s) ⇔ 文sに到達可能なエイリアス組の集合 プログラム実行経路をたどりながら,順次計算 文 到達エイリアス集合 RA(s)

エイリアス計算手順 n 到達エイリアス集合(Reaching Alias, RA)を利用 n n RA(s) ⇔ 文sに到達可能なエイリアス組の集合 プログラム実行経路をたどりながら,順次計算 文 到達エイリアス集合 RA(s) 1 Φ 2 {a, (1, new Integer)} 3 {a, (1, new Integer)}, {b, (2, new Integer)} Integer a, b, c; 4 {a, (1, new Integer)}, 1: a = new Integer(1); 2: b = new Integer(2); {c, b, (2, new Integer)} 3: c = b; 5 {a, (1, new Integer)}, 4: System. out. println(c); {c, b, (2, new Integer)} 5: c = a; 6 {c, a, (1, new 6: System. out. println(c); Integer)}, {b, (2, new Integer)} 2000/03/09 第 126回 ソフトウェア 学研究会 5

Phase 1: n AFG構築(続き) AFG ⇔ AFG節点/AFG辺により構築 n n メソッド → メソッドAFG クラス →

Phase 1: n AFG構築(続き) AFG ⇔ AFG節点/AFG辺により構築 n n メソッド → メソッドAFG クラス → クラスAFG public class Calc { Integer i; }public Calc() {i = new Integer(0); public void inc() { i = new Integer(i. int. Value() + 1); } public void add(int c) { i = new Integer(i. int. Value() + c); } }public Integer result() {return(i); } 2000/03/09 第 126回 ソフトウェア 学研究会 11

Phase 3: n 単純式x … 例: a, b, c, new Calc() Step 1: n

Phase 3: n 単純式x … 例: a, b, c, new Calc() Step 1: n AFGによるエイリアス計算 グラフ到達問題(AFG + MFG) 限定式x. y … 例: b. result() Step 1: Step 2: Step 3: (インスタンス)xに関するエイリアス計算 X に関する情報の抽出 (エイリアス集合をX) yに関するエイリアス計算 class Test { Calc a = new Calc(); Calc b = new Calc(); Integer c; Test() { a. inc(); b. add(1); c = b. result(); } } public class Calc { Integer i; }public Calc() {i = new Integer(0); public void inc() { i = new Integer(i. int. Value() + 1); } public void add(int c) { i = new Integer(i. int. Value() + c); } }public Integer result() {return(i);

Phase 3: AFGによるエイリア…(続き) 例: 限定式b. result() bに関するエイリアス計算(エイリアス集合をB) Step 2: B に関する情報の抽出 型: Calcクラス メソッド:

Phase 3: AFGによるエイリア…(続き) 例: 限定式b. result() bに関するエイリアス計算(エイリアス集合をB) Step 2: B に関する情報の抽出 型: Calcクラス メソッド: Calc: : Calc(), Calc: : add(), Calc: : result() …Object-Context(B) Step 3: result()に関するエイリアス計算 Step 1: class Test { Calc a = new Calc(); Calc b = new Calc(); Integer c; Test() { a. inc(); b. add(1); c = b. result(); } } public class Calc { Integer i; }public Calc() {i = new Integer(0); public void inc() { i = new Integer(i. int. Value() + 1); } public void add(int c) { i = new Integer(i. int. Value() + c); } }public Integer result() {return(i);

オブジェクトコンテキスト n Object-Context(A) ⇔ エイリアス集合A に属するオ ブジェクトの,呼び出されうるメソッド n Flow-Insensitive …メソッド呼び出し順を考慮しない 例: {Calc: : Calc(),

オブジェクトコンテキスト n Object-Context(A) ⇔ エイリアス集合A に属するオ ブジェクトの,呼び出されうるメソッド n Flow-Insensitive …メソッド呼び出し順を考慮しない 例: {Calc: : Calc(), Calc: : add(), Calc: : result()} n Flow-Sensitive …メソッド呼び出し順を考慮する 例: Calc: : Calc()→Calc: : add()→Calc: : result() public class Calc { Integer i; }public Calc() {i = new Integer(0); public void inc() { i = new Integer(i. int. Value() + 1); } public void add(int c) { i = new Integer(i. int. Value() + c); } }public Integer result() {return(i); Flow-Insensitive } public class Calc { Integer i; }public Calc() {i = new Integer(0); public void inc() { i = new Integer(i. int. Value() + 1); } public void add(int c) { i = new Integer(i. int. Value() + c); } }public Integer result() {return(i); Flow-Sensitive }

評価(4/4) n 同一クラスのインスタンス間でのエイリアス情報共有に よる正確性低下 n n エイリアスをインスタンス独立に解析(非共有) エイリアスを非独立に解析(共有) エイリアス プログラム 計算対象クラス 非共有 共有 Text.

評価(4/4) n 同一クラスのインスタンス間でのエイリアス情報共有に よる正確性低下 n n エイリアスをインスタンス独立に解析(非共有) エイリアスを非独立に解析(共有) エイリアス プログラム 計算対象クラス 非共有 共有 Text. Editor test. My. Text. Area 平均 最小 最大 4. 42 1 24 Weird. X com. jcraft. weirdx. Client 15. 37 1 46 24. 54 1 47 ANTLR antlr. Make. Grammer 5. 94 1 18 18. 77 1 76 9. 16 1 37 17. 19 1 105 Dynamic. Java koala. dynamicjava. inter preter. Type. Checker 2000/03/09 平均 最小 8. 31 1 最大 30 Debian/GNU Linux on Pentium. III-667 MHz 512 MB 第 126回 ソフトウェア 学研究会 24