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

Slides:



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

コンパイラ演習 第 6 回 (2011/11/17) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴 潮田 資秀 小酒井 隆広 山下 諒蔵 佐藤 春旗 大山 恵弘 佐藤 秀明 住井 英二郎.
コンパイラ演習 第 12 回 (2012/01/05) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴 潮田 資秀 小酒井 隆広 山下 諒蔵 佐藤 春旗 大山 恵弘 佐藤 秀明 住井 英二郎.
“Extensible Pattern Matching via a Lightweight Language Extension” の Survey POPL meeting 7/25 Kazuhiro Inaba
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
2006/10/26 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
(Rubyistのための) 超音速:ML入門
OCamlはじめの一歩 First Step to OCaml 小笠原 啓 (有)ITプランニング
2006/11/9 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
JavaScript プログラミング入門 2006/11/10 神津.
関数(1) 第11回 [6月29日、H.16(‘04)] 今日のメニュー 1 前回の課題 2 前回の宿題 3 いろいろな関数の演習 4 課題
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第4回 配列(2) 情報・知能工学系 山本一公
ML 演習 第 1 回 佐藤 春旗, 山下 諒蔵, 前田 俊行 May 30, 2006.
ML 演習 第 8 回 2007/07/17 飯塚 大輔, 後藤 哲志, 前田 俊行
ソフトウェア基礎科学 授業資料: 論理関係(logical relations)のお話
2006/10/5 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
Javaのための暗黙的に型定義される構造体
6/19 前回復習 for文による繰り返し計算 演習1:1から10まで足して画面に結果を表示する 提出者: 1人
コンパイラ演習番外編 (その2): JVM コンテスト
コンパイラ演習番外編 (その1): min-rt 改 コンテスト
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
2006/10/12 山下 諒蔵 佐藤 春旗 前田俊行 大山 恵弘 佐藤 秀明 住井 英二郎
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
OCommand : 型安全な シェルプログラミングのための 領域特化言語の提案
コンパイラ演習 第 8 回 (2011/12/01) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴
コンパイラ演習 第 9 回 (2011/12/08) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴
コンパイラ演習 第12回 2006/1/26 大山 恵弘 佐藤 秀明.
2006/12/7 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2007/1/18 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
2006/10/19 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井英二郎
2006/11/02 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
条件式 (Conditional Expressions)
2006/11/16 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
コンパイラ演習 第 4 回 (2011/10/27) 中村 晃一 野瀬 貴史 前田 俊行 秋山 茂樹 池尻 拓朗 鈴木 友博 渡邊 裕貴
~sumii/class/proenb2010/ml4/
2007/1/11 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
米澤研究室 全体ミーティング 2010/12/22 M2 渡邊裕貴.
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
大域的データフロー解析 流れグラフ 開始ブロック 基本ブロックをnodeとし、 基本ブロック間の制御関係をedgeとするグラフを、
TAL : Typed Assembly Language について
CGと形状モデリング 授業資料 長井 超慧(東京大学)
ML 演習 第 4 回 末永 幸平, 遠藤 侑介, 大山 恵弘 2005/06/21.
C 言語について 補足資料 資料および授業の情報は :
暗黙的に型付けされる構造体の Java言語への導入
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
インラインスクリプトに対するデータフロー 解析を用いた XHTML 文書の構文検証
A Provably Sound TAL for Back-end Optimization について
国立情報学研究所 ソフトウェア研究系 助教授/
 型推論1(単相型) 2007.
順序付き線形型に基づく 木構造処理プログラムから ストリーム処理プログラムへの変換
依存型で型付けされた 副作用のある関数のための 型保存コンパイラ
コンパイラ演習 第11回 2006/1/19 大山 恵弘 佐藤 秀明.
フロントエンドとバックエンドのインターフェース
 型推論3(MLの多相型).
国立情報学研究所 ソフトウェア研究系 助教授/
~sumii/class/proenb2009/ml4/
2006/7/18(通信コース)2006/7/26(情報コース) 住井
ソフトウェア理解支援を目的とした 辞書の作成法
全体ミーティング 2010/05/19 渡邊 裕貴.
~sumii/class/proenb2010/ml5/
言語プロセッサ 第12日目 平成20年1月9日.
SMP/マルチコアに対応した 型付きアセンブリ言語
PROGRAMMING IN HASKELL
全体ミーティング(6/3) 修士2年 飯塚 大輔.
参考:大きい要素の処理.
:: の扱い 長谷川啓.
POPL ミーティング 6/7 Inside ADL
プログラミング演習II 2003年12月10日(第7回) 木村巌.
情報処理Ⅱ 小テスト 2005年2月1日(火).
2007/6/26(通信コース)2007/6/27(情報コース) 住井
Presentation transcript:

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

今回の内容 バリアント/レコード 表現方法 型付け パターンマッチ if 式への変換

バリアント/レコード

バリアントのメモリレイアウト 先頭にタグを追加したタプルのように配置 タグ名は整数にエンコード 異なる type のタグは同じ整数を使用してもよい 要素数は可変 type t = A of string * int | B | C of string | ... (0,“str1”,13) または (1) または (2,“str2”) または... A → 0 B → 1 C → 2 ...

レコードのメモリレイアウト ラベル名でソートしたタプルのように配置 type s = type s = {bar: int; baz: float; foo: string} type s = {foo: string; bar: int; baz: float} (3, 4.22, "hoge") ソート

中間コード上での表現 新たにプリミティブを追加 バリアント: 生成/タグ取得/要素取得 レコード : 生成/要素取得 レコード : 生成/要素取得 既存のプリミティブに吸収してもよい 損をすることもある かえって実装が大変 最適化の精度が落ちる 実装方法は各自の判断に任せます

バリアントの型付け タグ名と型情報との関連を管理 タグ名から型が一意に決まるように 型付け規則を決めると楽 タグ名から型が一意に決まるように 型付け規則を決めると楽 つまり複数のバリアント型で 同じタグ名が使われていたら型エラーとする TagEnv(A) = (t, [string; int]) TagEnv(B) = (t, []) TagEnv(C) = (t, [string]) type t = A of string * int | B | C of string | ...

レコードの型付け ラベル名と型情報との関連を管理 ラベル名から型が一意に決まるように 型付け規則を決めると楽 ラベル名から型が一意に決まるように 型付け規則を決めると楽 つまり複数のレコード型で 同じラベル名が使われていたら型エラーとする LabelEnv(bar) = LabelEnv(baz) = LabelEnv(foo) = (s,[bar→int; baz→float; foo→string]) type s = {bar: int; baz: float; foo: string}

パターンマッチ

パターン式の導入 基本的な定義 p ::= (パターン式) | _ (ワイルドパターン) | c | x (定数パターン) | (p1,…, pn) | c p | {l1=p1; …; ln=pn} (パターン式) (ワイルドパターン) (定数パターン) (変数パターン) (タプルパターン) (バリアントパターン) (レコードパターン)

パターン式の型付け Γ ├ p : τ, (B) Γ: 自由変数の型環境 p : パターン式 τ: p の型 B : p の中で束縛される変数の型環境 読み方: 型環境 Γ のもとでパターン p は型τに 型付けされ、p 中で束縛される変数の 型環境は B となる

パターン式の型付け規則の例 (抜粋) (変数パターン) Γ ├ x : τ, (x : τ) パターン式で束縛 された変数の型環境 (タプルパターン) Γ ├ p1 : τ1, (B1) ... Γ ├ pn : τn, (Bn) for all i≠j, varname(Bi)∩varname(Bj) = 0 Γ ├ (p1, ... , pn) : τ1×…× τn, (B1, ... , Bn) タプルの各要素で束縛された変数の 名前が重複していないことを確認

match 式の導入 基本的な定義 拡張は後述 e ::= (式) ... match e with (パターンマッチ) p1 -> e1 | ... | pn -> en (式) (パターンマッチ)

match 式の型付け パターン式が束縛した変数の型環境を利用 Γ ├ e : τ Γ ├ p1 : τ, (B1) Γ, B1 ├ e1 : τ' ... Γ ├ pn : τ, (Bn) Γ, Bn ├ en : τ' Γ ├ match e with p1 ->e1 | ... | pn ->en : τ'

e が p1 に マッチするなら 1 しないなら 0 を表す式に変換 パターンマッチの ナイーブな実装方法 e が p1 に マッチするなら 1 しないなら 0 を表す式に変換 v は fresh な変数 if 式に変換する let v = e in let t1 = (test (p1,v)) in if t1 then (bind_vars (p1,v)) e1 else … let tn = (test (pn,v)) in if tn then (bind_vars (pn,v)) en match e with p1 -> e1 | ... | pn -> en p1 の中の 変数パターンを 束縛する式に変換

パターンマッチの ナイーブな実装方法の例 v は fresh な変数 let v = e in let t1 = let (x1, x2, x3) = v in x1 = 1 && x3 = 2 in if t1 then let y = x2 in e1 else … match e with (1, y, 2)-> e1 | (_, _, _) -> e2

パターンマッチのコンパイル に関する参考文献 Caml Light でのパターンマッチ実装法 Xavier Leroy, “The ZINC experiment: an economical implementation of the ML language” http://pauillac.inria.fr/~xleroy/publi/ZINC.ps.gz O’Caml が採用したパターンマッチ最適化の手法 Fabrice Le Fessant, Luc Maranget “Optimizing Pattern-Matching” http://pauillac.inria.fr/~maranget/papers/opt-pat.ps.gz パターンマッチ最適化の heuristics Kevin Scott and Norman Ramsey, “When Do Match-compilation Heuristics Matter?” http://www.cs.virginia.edu/~techrep/CS-2000-13.pdf

共通課題 次の match 式を if 式に変換せよ 「最良」と思われる変換結果を提出せよ 「最良」の定義は各自で設定すること match e with (_,1,4) -> e1 | (_,1,5) -> e2 | (1,2,3) -> e3 | (3,2,3) -> e4 | (1,1,2) -> e5 | (1,1,x) -> e6 | (y,_,_) -> e7

コンパイラ係用選択課題 パターンマッチをMinCamlか自作コンパイラに実装せよ 以下のパターンを扱えるようにすること ワイルドパターン 定数パターン 変数パターン バリアントパターン パターンに1つもマッチしなかったときは どうすれば良いか考えて実装せよ

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