SlideShare a Scribd company logo
1 of 15
言語処理系入門
第 9 回:コンパイラ II :クロージャ変
換
2009 年 12 月 25 日(金)
服部 健太
クロージャ変換
 関数定義から自由変数の参照をなくす
 関数は,自由変数が格納されたレコード(クロージャレコー
ド)を引数で受け取る.
 自由変数の参照はレコードの対応するフィールド参照に置き換
える
 例:
let sum = (let c = ref 0 in fn n -> c := n)
in sum 3
let sum =
( let c = ref 0 in
let f clos n = let c = clos[1] in c := n
in { f; c } )
in sum[0] sum 3
関数本体に自由変数の参照はない
自由変数 c をクロージャレコードに格納
クロージャ表現の例
code
v1
:
vn
code1
v1
:
vn
code2
code3
v1
:
vn
code2
vn+1
:
vp
code1
Vp+1
vq
:
1-block closure
2-block closures
Linked closures
再帰関数のクロージャ表現の例
code
v1
:
vn
1-block closure
Env.Closure code1
v1
:
vn
Closure
Environment
2-block closure
code f
v1
:
vn
code g
w1
:
wn
code f
code g
v1
:
vn
w1
:
wn
let rec f x = … g…
and g y = … f …
CPS 式の構文(少し変更)
 K ::= E
 | let x1 = E1 and … and xn = En in K
 | let rec x1 = E1 and … and xn = En in K
 | if V then K1 else K2
 | case V of l1 x1 -> K1 | … | ln xn -> Kn
 | V k V | k V
 E ::= V
    | let x1 = E1 and … and xn = En in E
    | let rec x1 = E1 and … and xn = En in E
 |{ l1=V1;…; ln = Vn } | l(V)
 | fn k x -> K | fn x -> K
 | V.l | V1.l <-V2
 | op(V1, … ,Vn)
 V ::= c | x | k --- ただし, k, x∈Variable
関数呼び出しや分岐を
伴わない単純な式
ネストした let/let rec の簡約
 クロージャ変換の前に, let x = (let y = E1 in E2) in
E3 のようにネストした let 式を let y = E1 in let x =
E2 in E3 のような形に変換しておく
 このとき, y のスコープが E3 にまで拡大するので,もし
, E3 に y の自由な出現があった場合, y を rename ( α
変換)する必要がある.
 let x = (let y = E1 in E2) in E3
⇒ let y’ = E1 in let x = E2[y←y’] in E3
 let rec の場合は以下のように変換する
 let rec x = (let y = E1 in E2) in E3
⇒ let rec y’ = E1 and x = E2[y←y’] in E3
クロージャ変換後の式の構文
 K ::= E
 | let x1 = E1 and … and xn = En in K
 | let rec x1 = E1 and … and xn = En in K
 | if V then K1 else K2
 | case V of l1 -> K1 | … | ln -> Kn
 | p V k V | p k V
 E ::= V
 |{V1;…; Vn }
 | code p k x = K in E
 | V#l | V1#l <- V2
 | op(V1, … ,Vn)
 V ::= c | x | k --- ただし, k, x∈Variable
 l ∈ Nat
クロージャ変換
 関数定義
[[fn x1 … xn -> K]] ⇒
code f clos x1 … xn =
let y1 = clos#1 and … ym = clos#m
in [[K]]
in { f; y1; … ; ym }
 関数適用
[[V V1 … Vn]] ⇒
let f = V#0 in f V V1 … Vn
y1, y2, … ym は関数定
義に含まれる自由変数
自由変数の定義
 FV(E) は式 E に出現する自由変数の集合であ
り,以下のように再帰的に定義される
 FV(c) = φ
 FV(x) = {x}
 FV(fn x -> E) = FV(E)/{x}
 FV(let x = E1 in E2) = FV(E1) FV(∪ E2)/{x}
 FV(let rec x = E1 in E2) = (FV(E1) FV(∪ E2))/{x}
 FV(E1 E2) = FV(E1) FV(∪ E2)
レコードの変換
 フィールドラベル付きのレコードをラベルなしのレ
コードに変換する
 ラベルのかわりに位置でフィールドにアクセスする
 クロージャ変換ではないが,ついでにやってしまう
 事前にラベルと位置の対応表を作っておく.
 型検査のフェーズなど
 レコード生成
 [[l1=V1;…; ln = Vn ]] ⇒{V1;…; Vn }
 フィールド参照
 [[V.l]] ⇒ V#pos_of(l)
 [[V1.l<-V2]] ⇒ V1#pos_of(l)<-V2
タグ付きデータの変換
 タグ付きデータをレコードに変換する
 タグに対応する整数値とデータの2つのフィールドを含んだレ
コードで表現
 例: @Foo(3) ⇒ { 0; 3 }
 事前にタグにあらかじめ整数値を割当てておく
 こちらも型検査フェーズなどで
 タグ付きデータ生成
 [[l(V)]] { num_of(l); V }⇒
 case 式
 [[case V of l1 x1 -> K1 | … | ln xn -> Kn]] ⇒
let x = V#0 in case x of
num_of(l1) -> let x1 = V#1 in [[K1]]
| …
いくつかの最適化
 再帰呼び出しの場合,クロージャから関数のコード
ポインタをいちいち取り出す必要はない.
 code fact’ fact n =
 … let fact’ = fact#0 in fact’ fact (n-1) …
 code fact’ fact n =
 … fact’ fact (n-1) …
 呼び出し先の関数がわかっていて(直接関数を呼び
出す場合),かつその関数が自由変数を含まない場
合,クロージャを渡す必要はない
 let f x = x + x in f (f 10)
 自由変数を含まないで,かつ, escape しない関数
はクロージャ生成は不要
参考: lambda lifting
 クロージャを作る代わりに,自由変数を引数で明示的に渡すよ
うに変換する.
 例:
let rec sum n =
if n = 1 then 1
else let f x = n + x in
        f (sum (n - 1))
in sum 100
⇒
let rec sum n =
if n = 1 then 1
else let f w x = w + x in
        f n (sum (n - 1))
in sum 100
n は自由変数
自由変数を受け
取る引数を追加
演習問題
 今週のサンプルプログラムを動かしてみよ
 講義で紹介した最適化を実装せよ
次回予定
 日時:
 2010 年 1 月 8 日(金) 10 : 30 - 12 : 00
 場所:
 LB2 3F/C1
 内容:
 コンパイル III :コード生成,実行時ライブラリ
, GC

More Related Content

What's hot

apg4b 4.05 ポインタ
apg4b 4.05 ポインタapg4b 4.05 ポインタ
apg4b 4.05 ポインタAPG4b
 
プログラムの実行順序
プログラムの実行順序プログラムの実行順序
プログラムの実行順序APG4b
 
コンパクト性とC1級の問題
コンパクト性とC1級の問題コンパクト性とC1級の問題
コンパクト性とC1級の問題nabeshimamasataka
 
代数的データ型をラムダ計算の中で表現する方法
代数的データ型をラムダ計算の中で表現する方法代数的データ型をラムダ計算の中で表現する方法
代数的データ型をラムダ計算の中で表現する方法syamino
 
Tapl 5
Tapl 5Tapl 5
Tapl 5rf0444
 
プログラミング講座
プログラミング講座プログラミング講座
プログラミング講座Yu Yu
 
言語処理系入門€5
言語処理系入門€5言語処理系入門€5
言語処理系入門€5Kenta Hattori
 
repマクロ
repマクロrepマクロ
repマクロAPG4b
 
mlr-grep - レコード指向grep
mlr-grep - レコード指向grepmlr-grep - レコード指向grep
mlr-grep - レコード指向grepRyoichi KATO
 
while文
while文while文
while文APG4b
 
yieldとreturnの話
yieldとreturnの話yieldとreturnの話
yieldとreturnの話bleis tift
 
Implicit Implicit Scala
Implicit Implicit ScalaImplicit Implicit Scala
Implicit Implicit ScalaKota Mizushima
 
SICP
SICPSICP
SICPS W
 
my_min関数の動作説明
my_min関数の動作説明my_min関数の動作説明
my_min関数の動作説明APG4b
 
Implicit Explicit Scala
Implicit Explicit ScalaImplicit Explicit Scala
Implicit Explicit ScalaKota Mizushima
 
Adding simpl GVN path into GHC
Adding simpl GVN path into GHCAdding simpl GVN path into GHC
Adding simpl GVN path into GHCKei Hibino
 
Protocol-Oriented Integers に想うジェネリックプログラミングの未来
Protocol-Oriented Integers に想うジェネリックプログラミングの未来Protocol-Oriented Integers に想うジェネリックプログラミングの未来
Protocol-Oriented Integers に想うジェネリックプログラミングの未来Tomohiro Kumagai
 

What's hot (20)

apg4b 4.05 ポインタ
apg4b 4.05 ポインタapg4b 4.05 ポインタ
apg4b 4.05 ポインタ
 
プログラムの実行順序
プログラムの実行順序プログラムの実行順序
プログラムの実行順序
 
コンパクト性とC1級の問題
コンパクト性とC1級の問題コンパクト性とC1級の問題
コンパクト性とC1級の問題
 
代数的データ型をラムダ計算の中で表現する方法
代数的データ型をラムダ計算の中で表現する方法代数的データ型をラムダ計算の中で表現する方法
代数的データ型をラムダ計算の中で表現する方法
 
Tapl 5
Tapl 5Tapl 5
Tapl 5
 
プログラミング講座
プログラミング講座プログラミング講座
プログラミング講座
 
言語処理系入門€5
言語処理系入門€5言語処理系入門€5
言語処理系入門€5
 
repマクロ
repマクロrepマクロ
repマクロ
 
mlr-grep - レコード指向grep
mlr-grep - レコード指向grepmlr-grep - レコード指向grep
mlr-grep - レコード指向grep
 
while文
while文while文
while文
 
yieldとreturnの話
yieldとreturnの話yieldとreturnの話
yieldとreturnの話
 
Implicit Implicit Scala
Implicit Implicit ScalaImplicit Implicit Scala
Implicit Implicit Scala
 
CPS & CTO
CPS & CTOCPS & CTO
CPS & CTO
 
SICP
SICPSICP
SICP
 
C++11
C++11C++11
C++11
 
my_min関数の動作説明
my_min関数の動作説明my_min関数の動作説明
my_min関数の動作説明
 
Implicit Explicit Scala
Implicit Explicit ScalaImplicit Explicit Scala
Implicit Explicit Scala
 
Adding simpl GVN path into GHC
Adding simpl GVN path into GHCAdding simpl GVN path into GHC
Adding simpl GVN path into GHC
 
前期講座09
前期講座09前期講座09
前期講座09
 
Protocol-Oriented Integers に想うジェネリックプログラミングの未来
Protocol-Oriented Integers に想うジェネリックプログラミングの未来Protocol-Oriented Integers に想うジェネリックプログラミングの未来
Protocol-Oriented Integers に想うジェネリックプログラミングの未来
 

Viewers also liked

言語処理系入門€6
言語処理系入門€6言語処理系入門€6
言語処理系入門€6Kenta Hattori
 
Bemutatkozás jó
Bemutatkozás jóBemutatkozás jó
Bemutatkozás jóBia3
 
Ppt kaakko135° kauppatie 4.4.2012
Ppt kaakko135° kauppatie 4.4.2012Ppt kaakko135° kauppatie 4.4.2012
Ppt kaakko135° kauppatie 4.4.2012hyvantuulenrannikko
 
言語処理系入門€7
言語処理系入門€7言語処理系入門€7
言語処理系入門€7Kenta Hattori
 
корпоративная политика зарождение
корпоративная политика   зарождениекорпоративная политика   зарождение
корпоративная политика зарождениеVasy Ivanov
 
Ce platforma de blog să alegi?
Ce platforma de blog să alegi?Ce platforma de blog să alegi?
Ce platforma de blog să alegi?Didi Kasa
 
取り残されたIt未開の地
取り残されたIt未開の地取り残されたIt未開の地
取り残されたIt未開の地Kenta Hattori
 
Latihan geografi tingkatan 1
Latihan geografi tingkatan 1Latihan geografi tingkatan 1
Latihan geografi tingkatan 1Zubaidah Halim
 
Leslie Cabarga -- Logo, Font & Lettering Bible: A Comprehensive Guide to the ...
Leslie Cabarga -- Logo, Font & Lettering Bible: A Comprehensive Guide to the ...Leslie Cabarga -- Logo, Font & Lettering Bible: A Comprehensive Guide to the ...
Leslie Cabarga -- Logo, Font & Lettering Bible: A Comprehensive Guide to the ...Didi Kasa
 

Viewers also liked (10)

言語処理系入門€6
言語処理系入門€6言語処理系入門€6
言語処理系入門€6
 
Bemutatkozás jó
Bemutatkozás jóBemutatkozás jó
Bemutatkozás jó
 
Ppt kaakko135° kauppatie 4.4.2012
Ppt kaakko135° kauppatie 4.4.2012Ppt kaakko135° kauppatie 4.4.2012
Ppt kaakko135° kauppatie 4.4.2012
 
言語処理系入門€7
言語処理系入門€7言語処理系入門€7
言語処理系入門€7
 
корпоративная политика зарождение
корпоративная политика   зарождениекорпоративная политика   зарождение
корпоративная политика зарождение
 
Ce platforma de blog să alegi?
Ce platforma de blog să alegi?Ce platforma de blog să alegi?
Ce platforma de blog să alegi?
 
取り残されたIt未開の地
取り残されたIt未開の地取り残されたIt未開の地
取り残されたIt未開の地
 
Latihan geografi tingkatan 1
Latihan geografi tingkatan 1Latihan geografi tingkatan 1
Latihan geografi tingkatan 1
 
Cubism
CubismCubism
Cubism
 
Leslie Cabarga -- Logo, Font & Lettering Bible: A Comprehensive Guide to the ...
Leslie Cabarga -- Logo, Font & Lettering Bible: A Comprehensive Guide to the ...Leslie Cabarga -- Logo, Font & Lettering Bible: A Comprehensive Guide to the ...
Leslie Cabarga -- Logo, Font & Lettering Bible: A Comprehensive Guide to the ...
 

Similar to 言語処理系入門€9

言語処理系入門€8
言語処理系入門€8言語処理系入門€8
言語処理系入門€8Kenta Hattori
 
2013computer s1
2013computer s12013computer s1
2013computer s1munich1502
 
基底変換、固有値・固有ベクトル、そしてその先
基底変換、固有値・固有ベクトル、そしてその先基底変換、固有値・固有ベクトル、そしてその先
基底変換、固有値・固有ベクトル、そしてその先Taketo Sano
 
2次関数と表現行列と内積
2次関数と表現行列と内積2次関数と表現行列と内積
2次関数と表現行列と内積政孝 鍋島
 
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミングYuto Takei
 
ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3noname409
 
言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10Kenta Hattori
 
虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数Taketo Sano
 

Similar to 言語処理系入門€9 (10)

言語処理系入門€8
言語処理系入門€8言語処理系入門€8
言語処理系入門€8
 
2013computer s1
2013computer s12013computer s1
2013computer s1
 
PRML 10.4 - 10.6
PRML 10.4 - 10.6PRML 10.4 - 10.6
PRML 10.4 - 10.6
 
基底変換、固有値・固有ベクトル、そしてその先
基底変換、固有値・固有ベクトル、そしてその先基底変換、固有値・固有ベクトル、そしてその先
基底変換、固有値・固有ベクトル、そしてその先
 
2次関数と表現行列と内積
2次関数と表現行列と内積2次関数と表現行列と内積
2次関数と表現行列と内積
 
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング
[Basic 11] 文脈自由文法 / 構文解析 / 言語解析プログラミング
 
ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3ディジタル信号処理の課題解説 その3
ディジタル信号処理の課題解説 その3
 
言語処理系入門€10
言語処理系入門€10言語処理系入門€10
言語処理系入門€10
 
PRML 第4章
PRML 第4章PRML 第4章
PRML 第4章
 
虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数虚数は作れる!Swift で学ぶ複素数
虚数は作れる!Swift で学ぶ複素数
 

More from Kenta Hattori

オブジェクト指向入門2
オブジェクト指向入門2オブジェクト指向入門2
オブジェクト指向入門2Kenta Hattori
 
オブジェクト指向入門1
オブジェクト指向入門1オブジェクト指向入門1
オブジェクト指向入門1Kenta Hattori
 
オブジェクト指向入門10
オブジェクト指向入門10オブジェクト指向入門10
オブジェクト指向入門10Kenta Hattori
 
オブジェクト指向入門9
オブジェクト指向入門9オブジェクト指向入門9
オブジェクト指向入門9Kenta Hattori
 
オブジェクト指向入門8
オブジェクト指向入門8オブジェクト指向入門8
オブジェクト指向入門8Kenta Hattori
 
オブジェクト指向入門7
オブジェクト指向入門7オブジェクト指向入門7
オブジェクト指向入門7Kenta Hattori
 
オブジェクト指向入門6
オブジェクト指向入門6オブジェクト指向入門6
オブジェクト指向入門6Kenta Hattori
 
オブジェクト指向入門5
オブジェクト指向入門5オブジェクト指向入門5
オブジェクト指向入門5Kenta Hattori
 
オブジェクト指向入門4
オブジェクト指向入門4オブジェクト指向入門4
オブジェクト指向入門4Kenta Hattori
 
オブジェクト指向入門3
オブジェクト指向入門3オブジェクト指向入門3
オブジェクト指向入門3Kenta Hattori
 
ソフトウェア・テスト入門2
ソフトウェア・テスト入門2ソフトウェア・テスト入門2
ソフトウェア・テスト入門2Kenta Hattori
 
ソフトウェア・テスト入門1
ソフトウェア・テスト入門1ソフトウェア・テスト入門1
ソフトウェア・テスト入門1Kenta Hattori
 
ソフトウェア・テスト入門8
ソフトウェア・テスト入門8ソフトウェア・テスト入門8
ソフトウェア・テスト入門8Kenta Hattori
 
ソフトウェア・テスト入門7
ソフトウェア・テスト入門7ソフトウェア・テスト入門7
ソフトウェア・テスト入門7Kenta Hattori
 
ソフトウェア・テスト入門6
ソフトウェア・テスト入門6ソフトウェア・テスト入門6
ソフトウェア・テスト入門6Kenta Hattori
 
ソフトウェア・テスト入門5
ソフトウェア・テスト入門5ソフトウェア・テスト入門5
ソフトウェア・テスト入門5Kenta Hattori
 
ソフトウェア・テスト入門4
ソフトウェア・テスト入門4ソフトウェア・テスト入門4
ソフトウェア・テスト入門4Kenta Hattori
 
ソフトウェア・テスト入門3
ソフトウェア・テスト入門3ソフトウェア・テスト入門3
ソフトウェア・テスト入門3Kenta Hattori
 
アルゴリズムとデータ構造15
アルゴリズムとデータ構造15アルゴリズムとデータ構造15
アルゴリズムとデータ構造15Kenta Hattori
 
アルゴリズムとデータ構造14
アルゴリズムとデータ構造14アルゴリズムとデータ構造14
アルゴリズムとデータ構造14Kenta Hattori
 

More from Kenta Hattori (20)

オブジェクト指向入門2
オブジェクト指向入門2オブジェクト指向入門2
オブジェクト指向入門2
 
オブジェクト指向入門1
オブジェクト指向入門1オブジェクト指向入門1
オブジェクト指向入門1
 
オブジェクト指向入門10
オブジェクト指向入門10オブジェクト指向入門10
オブジェクト指向入門10
 
オブジェクト指向入門9
オブジェクト指向入門9オブジェクト指向入門9
オブジェクト指向入門9
 
オブジェクト指向入門8
オブジェクト指向入門8オブジェクト指向入門8
オブジェクト指向入門8
 
オブジェクト指向入門7
オブジェクト指向入門7オブジェクト指向入門7
オブジェクト指向入門7
 
オブジェクト指向入門6
オブジェクト指向入門6オブジェクト指向入門6
オブジェクト指向入門6
 
オブジェクト指向入門5
オブジェクト指向入門5オブジェクト指向入門5
オブジェクト指向入門5
 
オブジェクト指向入門4
オブジェクト指向入門4オブジェクト指向入門4
オブジェクト指向入門4
 
オブジェクト指向入門3
オブジェクト指向入門3オブジェクト指向入門3
オブジェクト指向入門3
 
ソフトウェア・テスト入門2
ソフトウェア・テスト入門2ソフトウェア・テスト入門2
ソフトウェア・テスト入門2
 
ソフトウェア・テスト入門1
ソフトウェア・テスト入門1ソフトウェア・テスト入門1
ソフトウェア・テスト入門1
 
ソフトウェア・テスト入門8
ソフトウェア・テスト入門8ソフトウェア・テスト入門8
ソフトウェア・テスト入門8
 
ソフトウェア・テスト入門7
ソフトウェア・テスト入門7ソフトウェア・テスト入門7
ソフトウェア・テスト入門7
 
ソフトウェア・テスト入門6
ソフトウェア・テスト入門6ソフトウェア・テスト入門6
ソフトウェア・テスト入門6
 
ソフトウェア・テスト入門5
ソフトウェア・テスト入門5ソフトウェア・テスト入門5
ソフトウェア・テスト入門5
 
ソフトウェア・テスト入門4
ソフトウェア・テスト入門4ソフトウェア・テスト入門4
ソフトウェア・テスト入門4
 
ソフトウェア・テスト入門3
ソフトウェア・テスト入門3ソフトウェア・テスト入門3
ソフトウェア・テスト入門3
 
アルゴリズムとデータ構造15
アルゴリズムとデータ構造15アルゴリズムとデータ構造15
アルゴリズムとデータ構造15
 
アルゴリズムとデータ構造14
アルゴリズムとデータ構造14アルゴリズムとデータ構造14
アルゴリズムとデータ構造14
 

言語処理系入門€9