2007/1/11 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎

Slides:



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

コンパイラ演習 第 6 回 2005/11/17 大山 恵弘 佐藤 秀明. 今回の内容 実マシンコード生成 – アセンブリ生成 (emit.ml) – スタブ、ライブラリとのリンク 末尾呼び出し最適化 – 関数呼び出しからの効率的なリターン (emit.ml) –[ 参考 ]CPS 変換 種々の簡単な拡張.
コンパイラ演習 第 6 回 (2011/11/17) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴 潮田 資秀 小酒井 隆広 山下 諒蔵 佐藤 春旗 大山 恵弘 佐藤 秀明 住井 英二郎.
コンパイラ演習 第 12 回 (2012/01/05) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴 潮田 資秀 小酒井 隆広 山下 諒蔵 佐藤 春旗 大山 恵弘 佐藤 秀明 住井 英二郎.
Region-based Memory Management in Cyclone について 発表者 : 前田俊行.
アルゴリズムとデータ構造 第2回 線形リスト(復習).
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
2006/11/9 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
ML 演習 第 1 回 佐藤 春旗, 山下 諒蔵, 前田 俊行 May 30, 2006.
ML 演習 第 8 回 2007/07/17 飯塚 大輔, 後藤 哲志, 前田 俊行
ソフトウェア基礎科学 授業資料: 論理関係(logical relations)のお話
2006/10/5 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2006/11/30 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
アルゴリズムとデータ構造1 2007年6月12日
コンパイラ演習番外編 (その2): JVM コンテスト
コンパイラ演習番外編 (その1): min-rt 改 コンテスト
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
2006/10/12 山下 諒蔵 佐藤 春旗 前田俊行 大山 恵弘 佐藤 秀明 住井 英二郎
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
コンパイラ演習 第 8 回 (2011/12/01) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴
コンパイラ演習 第 9 回 (2011/12/08) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴
コンパイラ演習 第12回 2006/1/26 大山 恵弘 佐藤 秀明.
2006/12/7 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2007/1/18 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
プログラミング実習 1・2 クラス 第 1 週目 担当教員:  渡邊 直樹.
2006/10/19 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井英二郎
2006/11/02 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2006/11/16 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
コンパイラ演習 第 4 回 (2011/10/27) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
Solving Shape-Analysis Problems in Languages with Destructive Updating
TAL : Typed Assembly Language について
型付きアセンブリ言語を用いた安全なカーネル拡張
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
暗黙的に型付けされる構造体の Java言語への導入
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
“Separating Regular Languages with First-Order Logic”
コンパイラ 2012年11月15日
プログラミング入門2 第11回 情報工学科 篠埜 功.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
国立情報学研究所 ソフトウェア研究系 助教授/
 型推論1(単相型) 2007.
コンパイラ演習 第11回 2006/1/19 大山 恵弘 佐藤 秀明.
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクト指向プログラミングと開発環境
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
 型推論3(MLの多相型).
Javaバーチャルマシンを利用した 動的依存関係解析手法の提案
2007/6/12(通信コース)2007/6/13(情報コース) 住井
情報工学Ⅱ (第9回) 月曜4限 担当:北川 晃.
Type Systems and Programming Languages ; chapter 13 “Reference”
~sumii/class/proenb2010/ml2/
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
2006/6/27(通信コース)2006/7/5(情報コース) 住井
4.プッシュダウンオートマトンと 文脈自由文法の等価性
18. Case Study : Imperative Objects
SMP/マルチコアに対応した 型付きアセンブリ言語
情報処理Ⅱ 2007年12月3日(月) その1.
全体ミーティング(6/3) 修士2年 飯塚 大輔.
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
プログラミング演習II 2003年12月10日(第7回) 木村巌.
情報処理Ⅱ 小テスト 2005年2月1日(火).
Static Enforcement of Security with Types
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

2007/1/11 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎 コンパイラ演習 第 11 回 2007/1/11 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎

エスケープ解析 今回の内容 メモリに置かれる値のうち ヒープではなくスタックに確保できるもの を見つけることができる メモリに置かれる値のうち ヒープではなくスタックに確保できるもの を見つけることができる 利点: スタックに確保すると解放が簡単 ヒープの解放は大変 ガーベジコレクション等が必要

基本的な方針 「型」にもとづいて解析する 具体的には メモリに置かれる値の型を 「その値が関数からエスケープするか」 を表すフラグで拡張する メモリに置かれる値の型を 「その値が関数からエスケープするか」 を表すフラグで拡張する 「関数からエスケープする」 = 関数から帰った後もアクセスされうる 関数の返り値またはその一部となる 関数のスコープ外の変数またはその一部に代入される など

エスケープフラグ: true = エスケープするかも 簡単な例 (1/4) エスケープフラグ: true = エスケープするかも 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) let f y = let g x = x + y in (* g : (int → int)true *) g 関数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) 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 となる = エスケープする

副作用 (代入) がない場合の エスケープの定義 関数の返り値はエスケープする 関数 closure がエスケープするなら 関数の自由変数もエスケープする Tuple がエスケープするなら その各要素もエスケープする 配列がエスケープするなら その各要素もエスケープする

副作用 (代入) がある場合 上手くいかない定義 「エスケープする領域に代入される値は エスケープする」 a はエスケープする 「エスケープする領域に代入される値は  エスケープする」 a はエスケープする g : (int arraytrue) arraytrue let a = Array.create 1 0 in g.(0)  a a はエスケープしない? g : (int arrayfalse) arrayfalse let a = Array.create 1 0 in g.(0)  a

上手くいかない例 以下のコードは型検査をパスするが エスケープしないはずの値が エスケープしてしまう 以下のコードは型検査をパスするが エスケープしないはずの値が エスケープしてしまう f : (int arrayfalse) arrayfalse  int arrayfalse  unit let g = Array.create … in let rec h () = let a = Array.create … in f g a in h (); g.(0).(0) g はエスケープしない a もエスケープしない? もし f が次のような関数だったら let rec f g a = g.(0)  a

副作用 (代入) がある場合再考 案1: 代入される値は全てエスケープするとみなす “”の右側は全てエスケープするとみなす 案1: 代入される値は全てエスケープするとみなす “”の右側は全てエスケープするとみなす 案2: 生成された時の関数のスタックフレーム外に 参照が渡る値はエスケープするとみなす 関数の返り値のみならず 引数として使われた時点でエスケープするとみなす など…

型にもとづくエスケープ解析 の手順 (1/2) 対象言語 (MinCaml 等) の型を エスケープフラグで拡張する 何がエスケープして 何がエスケープしないのかを 型付け規則として定義する 型付け規則に従った型検査をパスすれば エスケープ解析が正しくなるように定義する (型付け規則の例は別紙参照)

型にもとづくエスケープ解析 の手順 (2/2) 目的のプログラムに対して型付け規則を適用し エスケープフラグに関する制約を抽出 目的のプログラムに対して型付け規則を適用し エスケープフラグに関する制約を抽出 型付け規則を「下から上に」当てはめていく この時点でフラグの値はまだ確定していない 反復法等によりフラグ間の制約を解消 とりあえず全てのフラグを false とする 制約に矛盾が生じる部分からフラグを true に変更 矛盾がなくなるまで II.を繰り返す (型付けの例は別紙参照)

共通課題 次のプログラム中で生成される 各tuple/array にエスケープフラグを付加せよ できる限り賢く解析せよ 講義と別紙資料で紹介した戦略よりも賢くできるはず 厳密なアルゴリズム/型付けは考慮せずともよい 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 ()

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

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

参考: 型にもとづく解析いろいろ リージョンベースメモリ管理 Dependent types Resource usage analysis Benjamin C. Pierce, editor. Advanced Topics in Types and Programming Languages, Chapter 3. Dependent types 静的な配列境界検査 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/ その他たくさん