コンパイラ演習 第 2 回 (2010/10/14) 秋山 茂樹 池尻 拓朗 前田 俊行 鈴木 友博 渡邊 裕貴 潮田 資秀 小酒井 隆広

Slides:



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

コンパイラ演習 第 6 回 (2011/11/17) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴 潮田 資秀 小酒井 隆広 山下 諒蔵 佐藤 春旗 大山 恵弘 佐藤 秀明 住井 英二郎.
コンパイラ演習 第 12 回 (2012/01/05) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴 潮田 資秀 小酒井 隆広 山下 諒蔵 佐藤 春旗 大山 恵弘 佐藤 秀明 住井 英二郎.
プログラミング実習 1 ・ 2 ク ラス 第 2 週目 担当教員 : 渡邊 直樹. 課題 2 ● 2 × 2型行列の固有値, 固有ベクトルを求め る EigMatrix.java というプログラムを作成せ よ。 ● 行列の各要素はコマンド・プロンプトから入力 ● 計算した結果もコマンド・プロンプトに表示.
プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
(Rubyistのための) 超音速:ML入門
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
2006/11/9 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
ML 演習 第 1 回 佐藤 春旗, 山下 諒蔵, 前田 俊行 May 30, 2006.
プログラミング言語としてのR 情報知能学科 白井 英俊.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
Relaxed Dependency Analysis
ソフトウェア基礎科学 授業資料: 論理関係(logical relations)のお話
2006/10/5 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2006/11/30 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
コンパイラ演習番外編 (その1): min-rt 改 コンテスト
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
2006/10/12 山下 諒蔵 佐藤 春旗 前田俊行 大山 恵弘 佐藤 秀明 住井 英二郎
C言語 配列 2016年 吉田研究室.
コンパイラ演習 第 8 回 (2011/12/01) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴
コンパイラ演習 第 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 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
二分探索木によるサーチ.
第7回 条件による繰り返し.
最適化の方法 中田育男著 コンパイラの構成と最適化 朝倉書店, 1999年 第11章.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
第7回 条件による繰り返し.
国立情報学研究所 ソフトウェア研究系 助教授/
 型推論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(通信コース) 住井
言語プロセッサ 第12日目 平成20年1月9日.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
PROGRAMMING IN HASKELL
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2003年11月19日(第6回) 木村巌.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
情報処理Ⅱ 小テスト 2005年2月1日(火).
コンピュータの高速化により, 即座に計算できるようになってきたが, 手法的にはコンピュータ出現以前に考え出された 方法が数多く使われている。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
2007/6/26(通信コース)2007/6/27(情報コース) 住井
Presentation transcript:

コンパイラ演習 第 2 回 (2010/10/14) 秋山 茂樹 池尻 拓朗 前田 俊行 鈴木 友博 渡邊 裕貴 潮田 資秀 小酒井 隆広 秋山 茂樹 池尻 拓朗 前田 俊行 鈴木 友博 渡邊 裕貴 潮田 資秀 小酒井 隆広 山下 諒蔵 佐藤 春旗 大山 恵弘 佐藤 秀明 住井 英二郎

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

型推論 MinCaml では typing.ml 部分式の型を unify しながら型を決めていく 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, let rec では型環境を拡張

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

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

K 正規化 MinCaml では kNormal.ml 部分式を明示的に変数へ束縛することで K 正規形に変換する ⇒ 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 とする この最適化は 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

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

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

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

定数畳み込み 演算のオペランドが「明らかに」定数だったら コンパイラが計算してしまう 例: 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 は副作用を持たない これは 「関数適用や配列への代入を含まない」 で近似するのが簡単 インライン化や定数畳み込みの後に行うと吉

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

最適化の繰り返し (MinCamlの場合) 最適化による変化がなくなるまで 最適化処理を繰り返す ただし一定の回数を超えたらそこで打ち切る let rec iter n e =   Format.eprintf "iteration %d@." n;   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'

各処理の詳細 次のドキュメントを参考にしてください 住井先生ご提供 「MinCamlの疑似コード」 http://min-caml.sourceforge.net/min-caml.pdf

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

共通課題 下の式を K 正規化および α 変換せよ 前問題で得られた答を A 正規化せよ let rec x x = let x = let x = x - -x in x - (let x = -x in x - -x) in x - -x in let x = x 125 in x - -x

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

課題の提出先と締め切り 提出先: compiler-report-2010@yl.is.s.u-tokyo.ac.jp 締め切り: 2 週間後 (10/28) の午後 1 時 (JST) Subject: Report 2 <学籍番号:6桁> 例: Report 2 101099 本文にも氏名と学籍番号を明記のこと 半角スペース 1 個ずつ 質問は compiler-query-2010@yl.is.s.u-tokyo.ac.jp まで