2006/10/12 山下 諒蔵 佐藤 春旗 前田俊行 大山 恵弘 佐藤 秀明 住井 英二郎

Slides:



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

コンパイラ演習 第 6 回 (2011/11/17) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴 潮田 資秀 小酒井 隆広 山下 諒蔵 佐藤 春旗 大山 恵弘 佐藤 秀明 住井 英二郎.
コンパイラ演習 第 12 回 (2012/01/05) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴 潮田 資秀 小酒井 隆広 山下 諒蔵 佐藤 春旗 大山 恵弘 佐藤 秀明 住井 英二郎.
プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
(Rubyistのための) 超音速:ML入門
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
2006/11/9 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
プログラミング基礎I(再) 山元進.
ML 演習 第 1 回 佐藤 春旗, 山下 諒蔵, 前田 俊行 May 30, 2006.
ML 演習 第 8 回 2007/07/17 飯塚 大輔, 後藤 哲志, 前田 俊行
プログラミング言語としてのR 情報知能学科 白井 英俊.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
Relaxed Dependency Analysis
ソフトウェア基礎科学 授業資料: 論理関係(logical relations)のお話
2006/10/5 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
確率・統計Ⅰ 第11回 i.i.d.の和と大数の法則 ここです! 確率論とは 確率変数、確率分布 確率変数の独立性 / 確率変数の平均
2006/11/30 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
コンパイラ演習番外編 (その1): min-rt 改 コンテスト
プログラミング言語論 第4回 式の構文、式の評価
コンパイラ演習 第 8 回 (2011/12/01) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
コンパイラ演習 第 9 回 (2011/12/08) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴
コンパイラ演習 第12回 2006/1/26 大山 恵弘 佐藤 秀明.
2006/12/7 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2007/1/18 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
プログラミング実習 1・2 クラス 第 1 週目 担当教員:  渡邊 直樹.
2006/10/19 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井英二郎
2006/11/02 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
条件式 (Conditional Expressions)
2006/11/16 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
コンパイラ演習 第 4 回 (2011/10/27) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴
2007/1/11 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
Tokuda Lab. NISHIMURA Taichi
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
第7回 条件による繰り返し.
型付きアセンブリ言語を用いた安全なカーネル拡張
暗黙的に型付けされる構造体の Java言語への導入
第10回関数 Ⅱ (ローカル変数とスコープ).
最適化の方法 中田育男著 コンパイラの構成と最適化 朝倉書店, 1999年 第11章.
第7回 条件による繰り返し.
A Provably Sound TAL for Back-end Optimization について
国立情報学研究所 ソフトウェア研究系 助教授/
 型推論1(単相型) 2007.
Java8について 2014/03/07.
依存型で型付けされた 副作用のある関数のための 型保存コンパイラ
コンパイラ演習 第11回 2006/1/19 大山 恵弘 佐藤 秀明.
コンパイラ資料 実行時環境.
 型推論3(MLの多相型).
B演習(言語処理系演習)第2回 田浦.
2007/6/12(通信コース)2007/6/13(情報コース) 住井
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
第14回 前半:ラムダ計算(演習付) 後半:小テスト
国立情報学研究所 ソフトウェア研究系 助教授/
プログラミング言語論 第10回 情報工学科 篠埜 功.
~sumii/class/proenb2010/ml2/
述語論理式の構文と意味 一階述語論理式の構文 一階述語論理式の意味 述語,限量記号 自然言語文の述語論理式表現 解釈 妥当,充足不能
2006/6/27(通信コース)2006/7/5(情報コース) 住井
2008/7/16(情報コース)2008/7/22(通信コース) 住井
関数型言語の基礎 型なしl計算 型理論 構成的プログラミング GUIにあらわれる関数概念 PBD VL
18. Case Study : Imperative Objects
言語プロセッサ 第12日目 平成20年1月9日.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
PROGRAMMING IN HASKELL
プログラミング演習II 2003年11月19日(第6回) 木村巌.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
情報処理Ⅱ 小テスト 2005年2月1日(火).
コンピュータの高速化により, 即座に計算できるようになってきたが, 手法的にはコンピュータ出現以前に考え出された 方法が数多く使われている。
Presentation transcript:

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

今日の内容 型推論 (type inference) K 正規形 (K-normal form) α変換 (α-conversion) 式の評価で現れる中間結果を明示的に変数に束縛 α変換 (α-conversion) 異なる変数が異なる名前を持つように変換 最適化 インライン化 (inlining) 定数畳み込み (constant folding) 不要な束縛の除去

型推論 MinCaml では typing.ml 部分式の型を unify しながら型を決定 let, letrec では型環境を拡張 X = Y X の型と Y の型を unify, 式全体は bool 型 X + Y X の型と int 型を unify, Y の型と int 型を unify, 式全体は int 型 if X then Y else Z X の型と bool 型を unify, Y の型と Z の型を unify, 式全体は Y の型 let, letrec では型環境を拡張

MinCaml 特有の型推論処理 型環境に含まれない変数を外部変数とみなす 型が決まらない変数を int 型とみなす 多相型なし typing.ml での、Var(x)の処理部分に注目 型が決まらない変数を int 型とみなす typing.ml での、Var({contents=None}) の処理部分に注目 多相型なし let rec f x = x in (f 123, f 12.3) は型エラーとする

K 正規形 ML Kit (http://www.it-c.dk/research/mlkit/) というコンパイラの中間言語 計算の中間結果を全て変数として明示化

K 正規化 MinCaml では kNormal.ml 部分式もすべて明示的に変数へ束縛する ⇒ ML を RISC アセンブリに少し近づける 例: (x – y) – (y – z) → let i1 = x – y in let i2 = y – z in i1 – i2

K 正規化の簡単な最適化 最初から変数になっている部分式は、 そのままにしておく 最初から変数になっている部分式は、 そのままにしておく 例: 123 – x は let i1 = 123 in let i2 = x in i1 – i2 ではなく、単に let i1 = 123 in i1 – x とする MinCaml では insert_let という 補助関数によって実現されている

α変換 MinCaml では alpha.ml 束縛変数の名前を “fresh” なものにつけかえる ⇒ 意味的に異なる変数には異なる名前を持たせ 以降の処理を容易にする 例: let x = 123 – 456 in let x = x – 789 in –x ↓ let x1 = 123 – 456 in let x2 = x1 – 789 in –x2

最適化 インライン化 (inlining) 定数畳み込み (constant folding) 不要な束縛の除去

関数呼び出しのオーバーヘッド 関数呼び出しにはオーバーヘッドがある 呼び出し時: レジスタの退避、スタックポインタの更新… リターン時: レジスタの復帰、スタックポインタの更新… 関数として呼び出さずに 関数本体の処理が行えれば オーバーヘッドがかからない

インライン化 コードサイズが爆発する コンパイルが停止しない 関数の呼び出しを、その関数の本体で置き換える let rec f x y z = M in …(f a b c)… → let rec f x y z = M in …([a,b,c/x,y,z]M’)… インライン化する項は、直前にα変換する 注意: むやみにインライン化すると… コードサイズが爆発する コンパイルが停止しない ⇒ 何らかの heuristics を用いる必要ありn

定数畳み込み 演算のオペランドが「明らかに」定数だったらコンパイラが計算してしまう let x = 7 in let y = 3 in x – y → let x = 7 in let y = 3 in 4 インライン化の後に行うと吉

不要な束縛の除去 (変数定義の場合) 副作用がなく、変数も使用されないようなletを 省略する let x = M in N → N ただし x は Nに現れない M は副作用を持たない 「関数適用を含まない」で近似するのが簡単 インライン化や定数畳み込みの後に行うと good

不要な束縛の除去 (関数定義の場合) 関数定義自体に副作用はないので、使用されない関数定義はすべて除去してよい 一般に let rec … in N において、 N に現れる関数は使用される 使用される関数の定義に現れる関数は使用される 面倒だったら 「一つでも N に現れる関数があったらすべて残す」でも十分

最適化の繰り返し (MinCamlの場合) let rec iter n e = if n = 0 then e else let e' = Elim.f (ConstFold.f (Inline.f (Assoc.f (Beta.f e)))) in if e = e' then e else iter (n - 1) e' let lexbuf outchan l = Id.counter := 0; Typing.extenv := M.empty; Emit.f outchan (RegAlloc.f (Simm13.f (Virtual.f (Closure.f (iter !limit (Alpha.f (KNormal.f (Typing.f (Parser.exp Lexer.token l)))))))))

詳細 別紙の図を参考にしてください 住井先生ご提供 低レベル実装に依存しない抽象的な形で記述されているので、コンパイラの処理を高レベルで理解するのに役立ちます

参考:A 正規化 ネストした let を平らにする 結果の式:A 正規形 (A-normal form) let x = (let y = M1 in M2) in M3 → let y = M1 in let x = M2 in M3 ただし、y は M3 の中に現れないものとする (正しくα変換されていれば常に成り立つ) 参考論文: Flanagan, Sabry, Duba, Felleisen., “The Essence of Compiling with Continuations”, in PLDI 1993.

共通課題 下の式を K 正規化およびα変換せよ。 前出の「簡単な最適化」はしてもよいが、 それ以外の最適化はしないこと。 let rec x x = let x = let x = x - -x in x - -x in x - -x in let x = x 123 in x - -x 前問題で得られた答を A 正規化せよ。

共通課題 インライン化の際にα変換を行わないと、 プログラムの意味が変わってしまう例を挙げよ。ただし、インライン化する前のプログラムは、 元から正しくα変換されているものとする。 インライン化や定数畳み込み等の 最適化を繰り返す際に、 「項のサイズは増えないが、 回数制限がないと止まらない」 ような例を挙げよ (ただし、最適化等をせず普通に実行したら、 正常に停止するような例に限る)。

課題の提出先と締め切り 提出先: compiler-enshu@yl.is.s.u-tokyo.ac.jp 締め切り: 2 週間後 (10/26) の午後 1 時 Subject: Report 2 <学籍番号> <アカウント> 本文にも氏名と学籍番号を明記のこと