コンパイラ演習 第12回 2006/1/26 大山 恵弘 佐藤 秀明.

Slides:



Advertisements
Similar presentations
コンパイラ演習 第 6 回 2005/11/17 大山 恵弘 佐藤 秀明. 今回の内容 実マシンコード生成 – アセンブリ生成 (emit.ml) – スタブ、ライブラリとのリンク 末尾呼び出し最適化 – 関数呼び出しからの効率的なリターン (emit.ml) –[ 参考 ]CPS 変換 種々の簡単な拡張.
Advertisements

コンパイラ演習 第 6 回 (2011/11/17) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴 潮田 資秀 小酒井 隆広 山下 諒蔵 佐藤 春旗 大山 恵弘 佐藤 秀明 住井 英二郎.
コンパイラ演習 第 12 回 (2012/01/05) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴 潮田 資秀 小酒井 隆広 山下 諒蔵 佐藤 春旗 大山 恵弘 佐藤 秀明 住井 英二郎.
Region-based Memory Management in Cyclone について 発表者 : 前田俊行.
プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
2006/11/9 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
ML 演習 第 1 回 佐藤 春旗, 山下 諒蔵, 前田 俊行 May 30, 2006.
ML 演習 第 8 回 2007/07/17 飯塚 大輔, 後藤 哲志, 前田 俊行
第11回 整列 ~ シェルソート,クイックソート ~
全体ミーティング (4/25) 村田雅之.
Javaのための暗黙的に型定義される構造体
2006/11/30 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
コンパイラ演習番外編 (その2): JVM コンテスト
コンパイラ演習番外編 (その1): min-rt 改 コンテスト
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
2006/10/12 山下 諒蔵 佐藤 春旗 前田俊行 大山 恵弘 佐藤 秀明 住井 英二郎
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
情報工学概論 (アルゴリズムとデータ構造)
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
2006/12/7 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2007/1/18 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2006/10/19 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井英二郎
2006/11/02 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2006/11/16 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
プログラミング論 II 電卓,逆ポーランド記法電卓
コンパイラ演習 第 4 回 (2011/10/27) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
2007/1/11 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
第11回 整列 ~ シェルソート,クイックソート ~
アスペクト指向プログラミングを用いたIDSオフロード
型付きアセンブリ言語を用いた安全なカーネル拡張
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
暗黙的に型付けされる構造体の Java言語への導入
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
インラインスクリプトに対するデータフロー 解析を用いた XHTML 文書の構文検証
“Separating Regular Languages with First-Order Logic”
コンパイラ 2012年11月15日
プログラミング入門2 第11回 情報工学科 篠埜 功.
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
国立情報学研究所 ソフトウェア研究系 助教授/
 型推論1(単相型) 2007.
コンパイラ演習 第11回 2006/1/19 大山 恵弘 佐藤 秀明.
アスペクト指向言語のための 独立性の高いパッケージシステム
情報処理Ⅱ 第2回:2003年10月14日(火).
オブジェクト指向プログラミングと開発環境
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
 型推論3(MLの多相型).
JAVAバイトコードにおける データ依存解析手法の提案と実装
アルゴリズムとプログラミング (Algorithms and Programming)
第5回 プログラミングⅡ 第5回
SMP/マルチコアに対応した 型付きアセンブリ言語
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
コンパイラ 第12回 実行時環境 ― 変数と関数 ― 38号館4階N-411 内線5459
ソフトウェア工学 知能情報学部 新田直也.
プログラミング演習I 2003年6月11日(第9回) 木村巌.
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
情報処理Ⅱ 小テスト 2005年2月1日(火).
Static Enforcement of Security with Types
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

コンパイラ演習 第12回 2006/1/26 大山 恵弘 佐藤 秀明

今回の内容 エスケープ解析 [参考]リージョン推論 メモリに置かれる値のうち、ヒープではなく スタックにallocateできるものを発見 Garbage collectionの負荷を軽減 Java SE 6が採用 2006年夏にリリース予定 [参考]リージョン推論 静的メモリ管理の一般的枠組み 本講義ではML Kit[Tofte et al.]をもとに 説明します 全ての値をスタック(の一般形)に確保

背景

型システムの広範な応用 プログラム解析に対する要求の高まり 解法: 型システムの採用 プログラムの安全性を実行前に保証したい 動的解析は面倒 様々な静的解析を統一的に定式化したい 理論的基盤の強化 解法: 型システムの採用 コンパイル時に型チェックを実行 型チェックを通ったプログラムは必ず安全 解析アルゴリズムを型付け規則で記述 アルゴリズムの実装/数学的証明が 共通な枠組みの下で可能

型を用いた静的解析の例 Dependent types Resource usage analysis 静的な配列境界検査 http://cs-www.bu.edu/fac/hwxi/ Resource usage analysis 計算資源(ファイル、ソケット等)が正しく使用 されているかチェック http://www.kb.ecei.tohoku.ac.jp/~koba/publications. html Information flow analysis 機密情報が外部に漏れないことを保証 http://www.cs.cornell.edu/Info/People/jgm/lang- based-security/

エスケープ解析

「エスケープ」するデータ構造 「関数からエスケープする」=現在実行中の 関数を抜けた後もアクセスできる ポインタが返り値としてreturnされる ポインタがグローバル変数に代入される エスケープするか否かを表すフラグρを tuple/closure/arrayの型情報に追加 決してエスケープしない→スタックに確保可能 エスケープするかも→ヒープに確保する必要性

エスケープ解析の正当性 × エスケープするものが誤ってスタックに 置かれるとまずい 有効な策: アルゴリズムを型付け規則で表現 エスケープするものが誤ってスタックに 置かれるとまずい dangling pointerを用いたスタック領域破壊の危険性 有効な策: アルゴリズムを型付け規則で表現 安全性を型システム上で証明 dangling pointerが発生しない または dangling pointerを用いたアクセスが起こらない 実体は 既にない × ポインタ pop ポインタは まだ 生きてる push 別の値を 指してしまう! スタック スタック スタック

直感的な例(1/4) 組pは関数fから戻った後はアクセスできな いので、型(int × int)falseが与えられる let f x = let p = (3, 4) in (* p : (int × int)false *) let (a, b) = p in a + b in ... 組pは関数fから戻った後はアクセスできな いので、型(int × int)falseが与えられる

直感的な例(2/4) 関数gのclosureは関数fから返されるので、 型(int → int)trueが与えられる let f y = let g x = x + y in (* g : (int → int)true *) g in ... 関数gのclosureは関数fから返されるので、 型(int → int)trueが与えられる

直感的な例(3/4) 関数gのclosureがエスケープするので、 gの自由変数である配列aもエスケープする let f y = let a = Array.create 5 0 in (* a : (int array)true *) let g x = x + a.(2) in (* g : (int → int)true *) g in ... 関数gのclosureがエスケープするので、 gの自由変数である配列aもエスケープする

直感的な例(4/4) 組pは関数fの内部から見てグローバルな領 域に代入されるので、型(int × int)trueとなる let t = ref (0, 0) in let f () = let p = (1, 2) in (* p : (int × int)true *) t := p in ... 組pは関数fの内部から見てグローバルな領 域に代入されるので、型(int × int)trueとなる

型解析の一般的な手順(1/2) 対象言語の型を、必要な情報で拡張 型付け規則を書き下す 目的のプログラムに対して型付けを実行 エスケープするか否かを表すフラグなど 型付け規則を書き下す エスケープ情報の生成/伝搬ルールを定義 目的のプログラムに対して型付けを実行 型付け規則を「下から上に」当てはめる この時点でフラグの値はまだ確定していない

型解析の一般的な手順(2/2) 前項の型付けから制約を抽出 反復法等によりフラグ間の制約を解消 拡張したフラグに関する論理式の集合 フラグの情報が伝搬される条件を表現 反復法等によりフラグ間の制約を解消 各フラグの値を確定させる とりあえずすべてのフラグをfalseとする 制約に矛盾する部分からフラグをtrueに変更 矛盾がなくなるまでii.を繰り返す

解析戦略の例(1/3) (副作用を考慮しなくてもわかる)制約の例 関数の返り値はエスケープする 関数closureがエスケープするなら 関数の自由変数もエスケープする tupleがエスケープするなら その各要素もエスケープする 配列がエスケープするなら その各要素もエスケープする

解析戦略の例(2/3) 副作用を考慮し出すと途端に難しくなる 「グローバル変数へ代入」を 「現在のフレームからポインタ漏洩」で近似 ポインタの解析は面倒 「グローバル変数へ代入」を 「現在のフレームからポインタ漏洩」で近似 ローカルで生成した変数以外へのポインタ渡し はすべてエスケープとみなす

解析戦略の例(3/3) 配列の型にもう一つフラグGを追加 Gの立った配列への代入はエスケープと みなす 実際に式を解析する例は巻末資料を参照 現在のフレームよりもグローバルなレベル にある配列であることを表現 関数のbodyの型付けは、bodyの実行開始時に 参照可能な全変数のGフラグを立ててから行う Gの立った配列への代入はエスケープと みなす 実際に式を解析する例は巻末資料を参照

リージョン推論

(ML Kitにおける)リージョンの概念 全メモリ空間をスタックのように管理 リージョン≒スタックフレーム 全ての値をスタックに確保 各リージョンのpush/popは 関数のcall/returnと必ずしも同期しない

静的解析によるリージョン導入 各々のリージョンをいつpush/popすべきか 各リージョンの存在期間を極限まで短くしたい 使用する前にできるだけ遅くpush 使用し終わったらできるだけ早くpop 各リージョンをpush/popする順序は 入れ子構造に制限される 最初にpushされたリージョンは最後にpopされる 適当なpush/popのタイミングを コンパイラが静的解析により推論 メモリのallocate/deallocateを自動で管理

リージョンのための構文拡張 letregion ρ in e end e@ρ 式eを評価する直前に新規リージョンρをpush eの評価結果を得た直後にρをpop e@ρ 式eの値をリージョンρ内に確保 eは値を生成する式に限られる タプル生成: (x, y, z)@ρ クロージャ生成: let rec f x @ρ = … int生成: 1@ρ などなど

Region Polymorphism 関数の返り値は関数の外側で定義された リージョンに格納 関数の返り値は関数の外側で定義された リージョンに格納 関数から返った後も使用されるから どのリージョンに返り値を格納するかは 呼び出し元によって異なる リージョンを(構文上の)引数として指定 let rec f [ρ] x = … in ... f [ρ’] x’ … 定義 適用

リージョン推論の例(fac) let rec fac [ρret] n = letregion ρbool in if (letregion ρ0 in (n = (0@ρ0))@ρbool end) then 1@ρret else letregion ρarg, ρret’ in (fac [ρret’] (letregion ρ1 in (n-(1@ρ1))@ρarg end) * n)@ρret end end in letregion ρ5 in fac [ρans] (5@ρ5) end let rec fac n = if n = 0 then 1 else fac (n-1) * n in fac 5 ただしρansは式全体の 返り値を格納する リージョン (式の外側で定義済み)

リージョン推論の改良 効率的なリージョン操作 リージョン概念の一般化 複数の値を同一リージョンに確保するように まとめる 複数の値を同一リージョンに確保するように まとめる 既存リージョンの内容をリセットして再利用 リージョン概念の一般化 リージョンのサイズを可変にする 任意のポイントでのリージョン確保/解放 push/popの順序は入れ子構造でなくともよい ヒープに対するmalloc/freeの自動挿入に近い

共通課題(1/2) 次のプログラム中で生成される各 tuple/arrayにエスケープフラグを付加せよ。 できる限り賢く解析せよ 講義と巻末資料で紹介した戦略よりも賢くできるはず dangling pointerを用いるアクセスを発生させないこと 厳密なアルゴリズム/型付けは考慮せずともよい let a = Array.create 1 (1, 2) in let b = (3, 4) in let rec g p = p in let rec f () = let c = if (条件式) then a else Array.create 1 (g (5, 6)) in c.(0) <- b; c in f ()

共通課題(2/2) リージョン推論を前出のfacの例のようにナ イーブに行うと、末尾呼び出し最適化が困 難になる場合がある。このことについて以 下の各項目に答えよ。 困難とは具体的に何か。 この問題を引き起こす本質的な原因はどこに あるか。 解決するためにはシステムにどのような変更 を加えればよいか。(自由に挙げよ)

コンパイラ係用選択課題 エスケープ解析を実装せよ。 副作用については保守的に実装してもよい 例: arrayへの代入はすべてエスケープとみなす

課題の提出先と締め切り 提出先: compiler-enshu@yl.is.s.u-tokyo.ac.jp 共通課題の締め切り: 2週間後(2/9)の午後1時 コンパイラ係用課題の締め切り: 2006年3月31日 Subject: report 12 <学籍番号> <アカウント > 本文にも氏名と学籍番号を明記のこと

課題の提出についての注意 プログラムだけでなく、説明・考察・感想など も書くこと 基本的にはメールの本文に解答を記述 多くのソースを送る必要がある課題では、ソ ースをtarファイルなどに固めてメールに添 付のこと

参考文献 ML Kit情報 リージョン(+型) のちゃんとした教科書 http://www.it-c.dk/research/mlkit/ Benjamin C. Pierce, editor. Advanced Topics in Types and Programming Languages, Chapter 3. 理学部7号館3階の図書室にあります

コンパイラ係のコンパイラ部分の成績評価について(1) 各コンパイラ係と大山、佐藤の間で面談をします 基本的にはレイトレ競技会の付近の日または当日 compiler-enshu@…にメールしてアポをとって下さい 場所は地下端末室、時間は20分程度 やること: 自作コンパイラの特徴・独創的な点などの説明 自作コンパイラによる、プログラム(レイトレ含む) のコンパイル・実行のデモ 自作コンパイラでコンパイルしたレイトレが自作CPUまた はシミュレータ上で動く様子を見せて下さい

コンパイラ係のコンパイラ部分の成績評価について(2) 選択課題を必ず一つ以上提出して下さい GC、オブジェクト指向、多相型、例外、パター ンマッチ、エスケープ解析 これらと同等以上の難度を有する言語機構の 実装をもって選択課題の提出とみなすことは 可能です 選択課題の提出〆切:3月31日

コンパイラでない係のコンパイラ部分の成績評価について 共通課題の提出状況と提出内容をもとに 評価します