コンパイラ演習第 11 回 2006/1/19 大山恵弘 佐藤秀明 今回の内容 バリアント / レコード 表現方法 型付け パターンマッチ 型付け switch 文への変換 簡単な最適化 マッチング漏れ 以降のフェーズでの処理 発展 exhaustivenessinformation の利用 パター

Similar documents
今回の内容 エスケープ解析 メモリに置かれる値のうち ヒープではなくスタックに alocate できるものを発見 Garbagecolection の負荷を軽減 JavaSE6 が採用 2006 年夏にリリース予定 [ 参考 ] リージョン推論 静的メモリ管理の一般的枠組み 本講義では MLKit[

コンパイラ演習 第 7 回

構造化プログラミングと データ抽象

構造化プログラミングと データ抽象

ML 演習 第 4 回

ex05_2012.pptx

Microsoft PowerPoint - ProD0107.ppt

生成された C コードの理解 コメント元になった MATLAB コードを C コード内にコメントとして追加しておくと その C コードの由来をより簡単に理解できることがよくありま [ 詳細設定 ] [ コード外観 ] を選択 C コードのカスタマイズ より効率的な C コードを生成するベストプラクテ

PowerPoint プレゼンテーション

Microsoft PowerPoint - 09.pptx

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

情報工学実験 C コンパイラ第 2 回説明資料 (2017 年度 ) 担当 : 笹倉 佐藤

Boost.Preprocessor でプログラミングしましょう DigitalGhost

今日の内容 Garbage Collection (GC, ごみ集め ) 参照されなくなったメモリ領域を解放すること 配列境界検査

Java Scriptプログラミング入門 3.6~ 茨城大学工学部情報工学科 08T4018Y 小幡智裕

ソフトウェア基礎 Ⅰ Report#2 提出日 : 2009 年 8 月 11 日 所属 : 工学部情報工学科 学籍番号 : K 氏名 : 當銘孔太

PowerPoint Presentation

プログラミング基礎

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること


24th Embarcadero Developer Camp

Clipboard

メソッドのまとめ

Microsoft PowerPoint - C_Programming(3).pptx

Microsoft PowerPoint - CproNt02.ppt [互換モード]

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ

memo

模擬試験問題(第1章~第3章)

kiso2-09.key

プログラミングA

プログラミング入門1

memo

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

プログラミング入門1

SuperH RISC engineファミリ用 C/C++コンパイラパッケージ V.7~V.9 ご使用上のお願い

Microsoft PowerPoint - ruby_instruction.ppt

(1) プログラムの開始場所はいつでも main( ) メソッドから始まる 順番に実行され add( a,b) が実行される これは メソッドを呼び出す ともいう (2)add( ) メソッドに実行が移る この際 add( ) メソッド呼び出し時の a と b の値がそれぞれ add( ) メソッド

論理と計算(2)

Microsoft PowerPoint - ad11-09.pptx

基礎プログラミング2015

Microsoft Word - matlab-coder-code-generation-quick-start-guide-japanese-r2016a

メソッドのまとめ

第3回 配列とリスト

Programming D 1/15

Microsoft PowerPoint - handout07.ppt [互換モード]

PowerPoint プレゼンテーション

ML 演習 第 4 回

ex04_2012.ppt

PowerPoint プレゼンテーション

SuperH RISC engine C/C++ コンパイラ Ver.7 不具合内容 - 過去のお知らせ SuperH RISC engine C/C++ コンパイラ Ver.7 台における不具合内容を以下に示します のチェックツールをルネサスエレクトロニクス株式会社のホームページ

PowerPoint プレゼンテーション

スライド 1

計算機プログラミング

Microsoft PowerPoint - 11.pptx

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

模擬試験問題(第1章~第3章)

Microsoft PowerPoint - 計算機言語 第7回.ppt

テキスト処理第 12 回 ( ) 田中哲産業技術総合研究所情報技術研究部門 u.ac.jp /

第8回 関数

プログラミング基礎I(再)

Microsoft Word - Javacc.docx

Taro-ポインタ変数Ⅰ(公開版).j

プログラミング実習I

Prog1_6th


情報実習Ⅱ

プレポスト【解説】

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdiu.h> #define InFile "data.txt" #define OutFile "surted.txt" #def

Microsoft PowerPoint ppt

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

関数の呼び出し ( 選択ソート ) 選択ソートのプログラム (findminvalue, findandreplace ができているとする ) #include <stdio.h> #define InFile "data.txt" #define OutFile "sorted.txt" #def

PowerPoint Presentation

Prog2_12th

講習No.12

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

オブジェクト指向プログラミング・同演習 5月21日演習課題

第 2 章 PL/SQL の基本記述 この章では PL/SQL プログラムの基本的な記述方法について説明します 1. 宣言部 2. 実行部 3. 例外処理部

PowerPoint プレゼンテーション

マニュアル訂正連絡票

プログラミング入門1

- VHDL 演習 ( 組み合せ論理回路 ) 回路 半加算器 (half adder,fig.-) 全加算器を構成する要素である半加算器を作成する i) リスト - のコードを理解してから, コンパイル, ダウンロードする ii) 実験基板上のスイッチ W, が, の入力,LED, が, の出力とな

3. 標準入出力

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

<4D F736F F D2091E63589F182628CBE8CEA8D758DC08E9197BF2E646F6378>

CプログラミングI

Microsoft PowerPoint ppt

Prog1_15th

Microsoft Word - problem5.doc

Microsoft PowerPoint ppt

Microsoft PowerPoint - prog09.ppt

Microsoft PowerPoint - prog09.ppt

Java講座

第1回 プログラミング演習3 センサーアプリケーション

論理と計算(2)

C#の基本2 ~プログラムの制御構造~

break 文 switch ブロック内の実行中の処理を強制的に終了し ブロックから抜けます switch(i) 強制終了 ソースコード例ソースファイル名 :Sample7_1.java // 入力値の判定 import java.io.*; class Sample7_1 public stati

演習1

2-1 / 語問題 項書換え系 4.0. 準備 (3.1. 項 代入 等価性 ) 定義 3.1.1: - シグネチャ (signature): 関数記号の集合 (Σ と書く ) - それぞれの関数記号は アリティ (arity) と呼ばれる自然数が定められている - Σ (n) : アリ

プロジェクトマネジメント知識体系ガイド (PMBOK ガイド ) 第 6 版 訂正表 - 第 3 刷り 注 : 次の正誤表は PMBOK ガイド第 6 版 の第 1 刷りと第 2 刷りに関するものです 本 ( または PDF) の印刷部数を確認するには 著作権ページ ( 通知ページおよび目次の前 )

Transcription:

コンパイラ演習第 11 回 2006/1/19 大山恵弘 佐藤秀明 今回の内容 バリアント / レコード 表現方法 型付け パターンマッチ 型付け switch 文への変換 簡単な最適化 マッチング漏れ 以降のフェーズでの処理 発展 exhaustivenessinformation の利用 パターン式の拡張 バリアント / レコード バリアントのメモリレイアウト 先頭にタグを追加したタプルのように配置 タグ名は整数にエンコード 異なる type のタグは同じ整数を使用してもよい 要素数は可変 type t = A of string * int B C of string A 0 B 1 C 2 (0, str1, 13) または (1) または (2, str2 ) または レコードのメモリレイアウト ラベル名でソートしたタプルのように配置 type s = {foo: string; bar: int; baz: float} ソート type s = {bar: int; baz: float; foo: string} (3, 4.22, "hoge") 中間コード上での表現 新たにプリミティブを追加 バリアント : 生成 / タグ名取得 / 要素取得 レコード : 生成 / 要素取得 既存のプリミティブに吸収してもよい 損をすることもある かえって実装が大変 最適化の精度が落ちる 実装方法は各自の判断に任せます 1

型付け タグ名 / ラベル名と型情報との関連を管理 外部関数としてまとめておくとよい タグ名 / ラベル名から型は一意に決定 複数の type で同じ名が使用される場合はエラー パターンマッチ type t = A of string * int B C of string TagEnv(A) = (t, [string; int]) TagEnv(B) = (t, []) TagEnv(C) = (t, [string]) type s = {bar: int; baz: float; foo: string} LabelEnv(bar) = LabelEnv(baz) = LabelEnv(foo) = (s, [bar int; baz float; foo string]) パターン式の導入 基本的な定義 拡張は後述 p ::= _ c x (p 1,, p n ) c p {l 1 =p 1 ; ; l n =p n } ( パターン式 ) ( ワイルドパターン ) ( 定数パターン ) ( 変数パターン ) ( タプルパターン ) ( バリアントパターン ) ( レコードパターン ) パターン式の型付け (1/2) 同じ名前の変数はパターン式の中に 2 回以上出現できない 型システムで保証すると楽 Γ - p : τ, (B) Γ: 前提となる型環境 p: 型付けするパターン式 τ: p の型 B: p の中で束縛される変数の型環境 パターン式の型付け (2/2) match 文の導入 ( 変数パターン ) Γ - x : τ, (x : τ) ( タプルパターン ) Γ - p 1 : τ 1, (B 1 ) Γ - p n : τ n, (B n ) for all i j, varname(b i ) varname(b j ) = 0 Γ - (p 1,, p n ) : τ 1 τ n, (B 1,, B n ) タプルの各要素で束縛された変数の名前が重複していないことを確認 パターン式で束縛された変数の型環境 基本的な定義 拡張は後述 e ::= p 1 -> e 1 p n -> e n ( 式 ) ( パターンマッチ ) 2

match 文の型付け パターン式が束縛した変数の型環境を利用 Γ - e : τ Γ - p 1 : τ, (B 1 ) Γ, B 1 - e 1 : τ' Γ - p n : τ, (B n ) Γ, B n - e n : τ' Γ - p 1 ->e 1 p n ->e n : τ' switch 文への変換 match 文を低レベルなプリミティブに分解 定数とのマッチング switch 変数束縛 let 一見うまくいきそうだが e ::= switch e c 1 -> e 1 c n -> e n _ -> e' ( 式 ) (switch) ナイーブに変換すると (1, 2, v, 4) -> e 1 (_, _, _, _) -> e 2 eror ならば e 2 に実行が移ることをどう表現するか? 処理の巻き戻し, x 3,x 4 switch x 1 1 -> (switch x 2 2 -> let v = x 3 in (switch x 4 4 -> e 1 _ -> error) _ -> error) _ -> e 2 いろいろな案 マッチングの成否を option 型で表現して返す matche 1 Success(result)->result Failure->e 2 バリアントの生成 / 展開を毎回行うコスト マッチングの失敗を例外として処理 trye 1 MatchFailure->e 2 例外処理によるオーバヘッド増加 eror の後にすることを継続として渡す クロージャ作成 / 関数呼び出しが重い eror の後にすることをインライン展開 eror が複数存在するときはコード量爆発 最適化のフェーズでやるべきことかも 解決策 : 専用プリミティブの追加 fail_match マッチングに失敗 e 1 e 2 e 1 の評価中 fail_match に到達したら e 2 の評価にジャンプ 手続き型的な挙動を表現 大域的脱出みたいなもの ただのジャンプだから軽い, x 3,x 4 (switch x 1 1 -> (switch x 2 2 -> let v = x 3 in (switch x 4 4 -> e 1 e 2 バリアント / レコードの処理 タプル同様に展開して各要素をマッチング バリアントの場合はタグも展開してマッチング タグは整数定数と同じように扱える {a=1; b=2} -> e 1 {a=2; b=3} -> e 2 let (a, b) = fields(e) in switch a 1 -> (switch b 2 -> e 1 2 -> _ -> fail_match A(1, 2) -> e 1 B -> e 2 let t = tag(e) in switch t A -> ) = fields(e) in (switch x1 ) B -> e 2 _ -> fail_match 3

簡単なマッチング最適化 (1/2) 先頭パターンから定数が連続するとき 連続する定数の種類ごとにまとめてマッチング 定数が連続する部分の候補に結局マッチしなかったらそれ以降の候補にジャンプ ( 1, 8 ) -> e 1 ( 2, _ ) -> e 2 ( 1, 10 ) -> e 3 ( v, _) -> e 4 (switch x 1 1 -> (switch x 2 8 -> e 1 10 -> e 3 2 -> e 2 let v = x 1 in e 4 簡単なマッチング最適化 (2/2) 先頭パターンから同じ名前の変数が連続するとき まとめて変数束縛 連続するのがワイルドパターンなら束縛すら不要 ( v, 8 ) -> e 1 ( v, 10 ) -> e 2 ( 1, _) -> e 3 (let v = x 1 in switch x 2 8 -> e 1 10 -> e 2 switch x 1 1 -> e 3 _ -> fail_match マッチング漏れ で捕捉されない fail_match = マッチするパターンがない場合 対処法の例 コンパイル時に警告だけ表示 実行時の異常終了を実現するしくみが必要 例外処理の枠組みで対処してもよい マッチング漏れがあればコンパイルを通さない 以降の fail_match の扱い 生きている変数 FV(fail_match)=( 以降の処理で生きている変数 ) スタック / レジスタ割り当ての状態 fail_match に到達したら破棄してよい 次の処理を追跡する前に状態を巻き戻す アセンブリ生成 その後に実行するコードへジャンプ switch のアセンブリ生成 case の数による 2 3 個程度なら if-then-else の連鎖でよい それ以上ならジャンプテーブルを作成 switch x 0 -> e 0 1 -> e 1 2 -> e 2 mul x, 4, y ld [table+y], z b z nop table:.word label_e0.word label_e1.word label_e2 label_e0: (e 0 の処理 ) label_e1: (e 1 の処理 ) label_e2: (e 2 の処理 ) 発展 : exhaustiveness information 型情報やマッチングの文脈からいろいろなことが分かる マッチングが必ず成功するパターン マッチングが必ず失敗するパターン 絶対に使用されないパターン 評価結果を変えない判定順序入れ替え 行 : 各マッチング候補間の判定順序 列 : パターン中の各要素間の判定順序 コンパイル時に活用可能 コード最適化 冗長 / 不完全な match 式について警告を出す 4

コード最適化の例 (1/3) 最適化しないと match x 0, y 0 [], _ -> 1 _, [] -> 2 _::_, _::_ -> 3 リストは [] (::) をタグにもつバリアントとみなす (switch x ( (switch y [] -> 2 (switch x (::) -> (switch y ) コード最適化の例 (2/3) match 文の第 2 第 3 パターンを入れ替え (switch x (::) -> (switch y (switch y [] -> 2 絶対に使われないパターンを削除 (switch x (::) -> (switch y ) (switch y [] -> 2) コード最適化の例 (3/3) 冗長なマッチング判定を削除 (switch x _ -> (switch y ) 2 サイズの小さい式をインライン展開 (switch x _ -> (switch y _ -> 2)) 2 不要な を除去 switch x _ -> (switch y _ -> 2) 発展 : パターン式の拡張 p 1. p n p 1,.,p n はすべて同じ型 / 変数束縛を持つ 型システムで保証するとよい pwhene e が不成立なら fail_match p 1 asp 2 letp=e letrecfp 1.p n =e など 最適化の適用例 : 最大反復回数を定め 変化がなくなるまで各フェーズを反復 共通課題 次の match 文を switch 文に変換せよ 最良 と思われる変換結果を提出せよ 最良 の定義は各自で設定すること 処理の巻き戻し をどう表現するかは自由 (_, A(4)) -> e 1 (_, A(5)) -> e 2 (1, B) -> e 3 (3, B) -> e 4 (1, A(2)) -> e 5 (1, A(x)) -> e 6 (y, _) -> e 7 コンパイラ係用選択課題 パターンマッチを自作コンパイラに実装せよ 以下のパターンを扱えるようにすること ワイルドパターン 定数パターン 変数パターン バリアントパターン マッチング漏れに 対処 すること その他の実装方針は自由に決めてよい ただし第 2 要素の持ちうるタグは A と B のみ 5

課題の提出先と締め切り 課題の提出についての注意 提出先 :compiler-enshu@yl.is.s.u-tokyo.ac.jp 共通課題の締め切り : 2 週間後 (2/2) の午後 1 時 コンパイラ係用課題の締め切り : 2006 年 3 月 31 日 Subject:report11< 学籍番号 >< アカウント > 本文にも氏名と学籍番号を明記のこと プログラムだけでなく 説明 考察 感想なども書くこと 基本的にはメールの本文に解答を記述 多くのソースを送る必要がある課題では ソースを tar ファイルなどに固めてメールに添付のこと 参考文献 CamlLight でのパターンマッチ実装法 TheZINCexperiment:aneconomicalimplementation ofthemllanguage htp://pauilac.inria.fr/~xleroy/publi/zinc.ps.gz OCaml が採用したパターンマッチ最適化の手法 OptimizingPatern-Matching htp://pauilac.inria.fr/~maranget/papers/opt-pat.ps.gz パターンマッチ最適化の heuristics WhenDoMatch-compilationHeuristicsMater? htp://www.cs.virginia.edu/~techrep/cs-2000-13.pdf 6