発表者: 稲葉 一浩 複雑ネットワーク・地図グラフ セミナー 2017/1/19

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

プログラミング言語論 第3回 BNF 記法について(演習付き) 篠埜 功. 構文の記述 プログラミング言語の構文はどのように定式化できるか? 例1 : for ループの中に for ループが書ける。 for (i=0; i
プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
Problem J: いにしえの数式 問題作成・解説: 北村 解答作成協力: 八森.
区間グラフにおける区間表現からMPQ-treeを効率よく構成するアルゴリズム
This slide was a material for the “Reading PLDI Papers (PLDIr)” study group written by Kazuhiro Inaba ( ), under my own understanding of.
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
東京工科大学 コンピュータサイエンス学部 亀田弘之
SHA-1の高速化tips 2007/9/15
ラベル付き区間グラフを列挙するBDDとその応用
コンパイラ 2011年10月17日
稲葉 一浩 (k.inaba) Python と プログラミングコンテスト 稲葉 一浩 (k.inaba)
データ構造とアルゴリズム 第10回 mallocとfree
アルゴリズムとデータ構造1 2007年6月12日
Object Group ANalizer Graduate School of Information Science and Technology, Osaka University OGAN visualizes representative interactions between a pair.
Paper from PVLDB vol.7 (To appear in VLDB 2014)
情報科学1(G1) 2016年度.
F11: Analysis III (このセッションは論文2本です)
コンパイラ 2012年10月15日
2007/1/11 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
第20章 Flyweight ~同じものを共有して無駄をなくす~
プログラム静的解析手法の効率化と 解析フレームワークの構築に関する研究
Solving Shape-Analysis Problems in Languages with Destructive Updating
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
プログラミング言語入門 手続き型言語としてのJava
点素パス問題に対するアルゴリズム 小林 佑輔 東京大学 大学院情報理工学系研究科 組合せ最適化セミナー 2012 年 7月 13日
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
プログラミング言語論 第3回 BNF記法について(演習付き)
PROGRAMMING IN HASKELL
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
オブジェクト指向プログラムにおける エイリアス解析について
インラインスクリプトに対するデータフロー 解析を用いた XHTML 文書の構文検証
Online Decoding of Markov Models under Latency Constraints
“Separating Regular Languages with First-Order Logic”
アルゴリズムとデータ構造 補足資料11-1 「mallocとfree」
限られた保存領域を使用する Javaプログラムの実行トレース記録手法の 提案と評価
Javaプログラムの変更を支援する 影響波及解析システム
第7回 プログラミングⅡ 第7回
A Provably Sound TAL for Back-end Optimization について
First Course in Combinatorial Optimization
連続領域におけるファジィ制約充足問題の 反復改善アルゴリズムによる解法 Solving by heuristic repair Algorithm of the Fuzzy Constraint Satisfaction Problems with Continuous Domains 北海道大学.
多様なプログラミング言語に対応可能な コードクローン検出ツール CCFinderSW
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
インスタンスの型を考慮したJavaプログラムの実行経路の列挙手法の提案
プログラミング入門2 第9回 ポインタ 情報工学科 篠埜 功.
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
統計ソフトウエアRの基礎.
アルゴリズムとプログラミング (Algorithms and Programming)
依存関係の局所性を利用した プログラム依存グラフの 効率的な構築法
米澤研究室 全体ミーティング 2010/07/07 M2 渡邊裕貴.
This slide was a material for the “Reading PLDI Papers (PLDIr)” study group written by Kazuhiro Inaba ( ), under my own understanding of.
Type Systems and Programming Languages ; chapter 13 “Reference”
A02 計算理論的設計による知識抽出モデルに関する研究
アルゴリズムとデータ構造1 2009年6月15日
Post-Kona paper 解説 P0083R1: Splicing Maps and Sets (Rev.3) 稲葉 一浩
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
Jan 2015 Speaker: Kazuhiro Inaba
情報処理Ⅱ 2007年12月3日(月) その1.
プログラミング 4 文字列.
アルゴリズムとデータ構造 2010年6月17日
ソフトウェア工学 知能情報学部 新田直也.
演算子のオーバーロード.
回帰テストにおける実行系列の差分の効率的な検出手法
識別子の読解を目的とした名詞辞書の作成方法の一試案
This slide was a material for the “Reading PLDI Papers (PLDIr)” study group written by Kazuhiro Inaba ( ), under my own understanding of.
プログラミング 2 静的変数.
Presentation transcript:

発表者: 稲葉 一浩 複雑ネットワーク・地図グラフ セミナー 2017/1/19 論文紹介 Reading: “Giga-Scale Exhaustive Points-to Analysis for Java in under a Minute” (from OOPSLA’15) 発表者: 稲葉 一浩 複雑ネットワーク・地図グラフ セミナー 2017/1/19

About the paper Presented in OOPSLA: ACM SIGPLAN (= SIG on Programming LANguages) International Conference on Object-Oriented Programming, Systems, Languages, and Applications

Points-to Analysis? コンピュータープログラムの解析の一つ 高速化や安全性の検査などに用いられる (典型的には)ラベル付き有向グラフでの 制約付きreachability問題に帰着する近似解法で 解かれる

巨大な コンピュータ プログラム Points-to Analysis? int[] newZeroVector() { return new int[3]; } プログラム中のある箇所で 確保したメモリ領域を 指す可能性のある変数は どれか?(aやbやresultは⇗を 指すか? 巨大な コンピュータ プログラム void crosProduct( int[] a, int[] b, int[] result ) { result[0] = a[1] * b[2] – b[2] * a[1]; result[1] = a[2] * b[0] – b[0] * a[2]; result[2] = a[0] * b[1] – b[1] * a[0]; }

a や b と result が 同じ領域を指すか指さないかで大違い Alias Analysis Points-to Analysisは “Alias Analysis” (二つの変数が 同じメモリ領域を指す可能性があるか?) を含み、 この解析の情報がよく使われる。 a や b と result が 同じ領域を指すか指さないかで大違い void crosProduct( int[] a, int[] b, int[] result ) { result[0] = a[1] * b[2] – b[2] * a[1]; result[1] = a[2] * b[0] – b[0] * a[2]; result[2] = a[0] * b[1] – b[1] * a[0]; }

About the paper Context-Free Points-to Analysis が In:|V|=160万 |E|=200万 Out: 1.5G組 のプログラムに対して 40秒 でできました

帰着先: (All-Pairs) Context-Free Language Reachability 入力 辺ラベル付き有向グラフ 文脈自由文法 出力 文法に従ったラベル列で 到達可能な全点対 Known Algorithm O(|G|・|V|^3 / log|V|) 3 1 × + + × 2 ) Expr ::= Term | Expr + Term Term ::= Factor | Term × Factor Factor ::= 1 | 2 | 3 | ( Expr )

Context-Free Points-to Analysis ⇒ Context-Free Graph Reachability alloc where h_1 is a unique ID for this program location x h1 x = new Object; x = y; x = y.f; x.f = y; assign x y load-f x y store-f x y

x x y x y x y h1 正確には x = new Object; x = y; x = y.f; x.f = y; alloc assign x y x = new Object; x = y; x = y.f; x.f = y; assign load-f x y load-f store-f x y store-f

Example from the paper

(To Java Experts) x = h; y = x; y = x; x = h; プログラムの実行順序は無視 (どちらも y may point-to h) 関数の呼び出しも代入で表現 (異なる場所(context)での関数使用は混ざる) Obj f(Obj x, Obj y) { return y; } z = f(h1, h2); u = f(h3, h4); x=h1; y=h2; z=y; x=h3; y=h4; u=y;

x y Grammar h1 Alias ::= PointsTo PointsTo Bridge ::= load-f Alias store-f (for all f) T ::= (assign | Bridge)* PointsTo ::= T alloc Grammar x h1 alloc y assign load-f store-f x = new Object; x = y; x = y.f; x.f = y;

変数 x が h1 で確保された メモリを指すかもしれない Alias ::= PointsTo PointsTo Bridge ::= load-f Alias store-f (for all f) T ::= (assign | Bridge)* PointsTo ::= T alloc Grammar pointsTo x h1 変数 x が h1 で確保された メモリを指すかもしれない

変数 x と変数 y が同じ メモリを指すかもしれない x y Grammar Alias ::= PointsTo PointsTo Bridge ::= load-f Alias store-f (for all f) T ::= (assign | Bridge)* PointsTo ::= T alloc Grammar pointsTo pointsTo x y 変数 x と変数 y が同じ メモリを指すかもしれない

y.f = w; z = x.f; ⇒ 要はz=w;と同じ効果 z x y w Grammar 変数 x と変数 y が同じメモリを指すかも Alias ::= PointsTo PointsTo Bridge ::= load-f Alias store-f (for all f) T ::= (assign | Bridge)* PointsTo ::= T alloc Grammar Alias load-f store-f z x y w y.f = w; 変数 x と変数 y が同じメモリを指すかも z = x.f; ⇒ 要はz=w;と同じ効果

x=x1; x1=x2; …; xn=y; y=new Object; 変数 x がメモリ h を指すかも Alias ::= PointsTo PointsTo Bridge ::= load-f Alias store-f (for all f) T ::= (assign | Bridge)* PointsTo ::= T alloc Grammar (assign | Bridge)* alloc x y h x=x1; x1=x2; …; xn=y; y=new Object; 変数 x がメモリ h を指すかも h

Bridge の over approximaton (後述) アルゴリズム Alias ::= PointsTo PointsTo Bridge ::= load-f Alias store-f T ::= (assign | Bridge)* PointsTo ::= T alloc Bridge の over approximaton (後述) T は 推移閉包(ラベルなしのreachbility)を効率的に 管理するデータ構造 [21] 現在の T から Bridgeかどうか判定

Bridge の over approximation CFL Reachability の制限されたケース “Bidirected Dyck CFL Reachability” で近似 O(|E| log |E|) k-Dyck CFL とは、k 種類の括弧対 (2k種類の文字) 上の「括弧の対応がとれてる」を意味する文法 S ::= ε | SS |(S) | 【S】 | {S}| 「S」 Bidirected: (a,【,b)∈E iff (b,】,a)∈E assign連結成分を潰し、load-f と store-f を括弧対と考える

Datalog 商用ソルバ 既存手法2 提案手法 実験結果 既存手法1

Bridgeの近似の精度