2. コンパイラのバックエンド
ソース
プログラム 字句・構文解析 型検査 CPS 変換
Cps.convTyping.checkparse
クロージャ変換コード生成
目的
コード
実行時
ライブラリ
中間言語
抽象構文木
GC など実行時に必要な処理
実行時にロード・リンクされる
C 言語で実装されることが多い
C 言語,アセンブリコード,
VM の中間言語(バイトコード) etc 今日のトピックス
2010/1/8 2言語処理系入門 10
3. クロージャ変換した後
K ::= def x1 = E1 and … and xn = En
| 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
| V (V1, … ,Vn)
E ::= V
|{V1;…; Vn }
| code f (x1,…,xn) = K in E
| V#l | V1#l <- V2
| op(V1, … ,Vn)
V ::= c | x∈Var
l ∈ Nat
大域変数の定義
2010/1/8 3言語処理系入門 10
4. コード生成の前処理
let rec の除去
let 式とフィールド更新の組み合わせに変換する
[[let rec x = { …, li = x,… } in E]] ⇒
let x = { …, li = null,… }
in let _ = x#i<-x in E
レコード生成,フィールド参照・更新をプリミティブ演算に変
換
[[{V1,…, Vn}]] ⇒
let r = record(n) in
let _ = setfld(r,1,V1) and … _ = setfld(r,n,Vn)
in r
code のリフトアップ
式の中に散らばった code 定義を抜き出して集める
残りの式は,最初に実行される code の本体となる
2010/1/8 4言語処理系入門 10
5. コード生成の元言語
C ::= code f (x1,…,xn) = K
K ::= def x1 = E1 and … and xn = En
| let x1 = E1 and … and xn = En in K
| if V then K1 else K2
| case V of l1 -> K1 | … | ln -> Kn
| V (V1, … ,Vn)
E ::= V
| op(V1, … ,Vn)
V ::= c | x∈Var
l ∈ Nat
2010/1/8 5言語処理系入門 10