SlideShare una empresa de Scribd logo
1 de 14
20周遅れのコンパイラ開発
そのうち HLS 対応
りょうす
2016/4/9
Agenda
• 今取り組んでいること
– CPSを使ったコンパイラ
• 今後勉強すること
– A正規形とK正規形
– OCaml と型推論
今取り組んでいること
• CPS を使ったコンパイラ
– 開発言語: Common Lisp
– ターゲットの言語: Mini Scheme
– 生成されるもの: VM のコード(HLS ではない!!)
CPS(Continuation Passing Style)
- 1992 年の本
- ML を使用している
参考資料
- 199X 年(半ば?)の東大
で行われていた実習
- Scheme
mini-scheme(例)
• 再帰を使った階乗の例
(:fix ((fact (n)
(:if (:= n 0)
1
(:* n (fact (:- n 1))))))
(fact 10))
mini-scheme → CPS
• 再帰を使った階乗の例
(:fix ((fact (n)
(:if (:= n 0)
1
(:* n (fact (:- n 1))))))
(fact 10))
(:FIXH
((FACT (|sym1| N)
(:FIXS ((|sym2| (|sym3|) (:APP |sym1| (|sym3|))))
(:= (N 0) NIL
((:APP |sym2| (1))
(:- (N 1) (|sym7|)
((:FIXS
((|sym5| (|sym6|) (:* (N |sym6|) (|sym4|) ((:APP |sym2|
(|sym4|))))))
(:APP FACT (|sym5| |sym7|))))))))))
(:FIXS ((|sym8| (|sym9|) (:APP EXIT (|sym9|)))) (:APP FACT
(|sym8| 10))))
CPS → CPS(η-Reduction)
• 再帰を使った階乗の例
(:FIXH
((FACT (|sym1| N)
(:FIXS ((|sym2| (|sym3|) (:APP |sym1| (|sym3|))))
(:= (N 0) NIL
((:APP |sym2| (1))
(:- (N 1) (|sym7|)
((:FIXS
((|sym5| (|sym6|) (:* (N |sym6|) (|sym4|) ((:APP |sym2|
(|sym4|))))))
(:APP FACT (|sym5| |sym7|))))))))))
(:FIXS ((|sym8| (|sym9|) (:APP EXIT (|sym9|)))) (:APP FACT
(|sym8| 10))))
(:FIXH
((FACT (|sym1| N)
(:= (N 0) NIL
((:APP |sym1| (1))
(:- (N 1) (|sym7|)
((:FIXS
((|sym5| (|sym6|) (:* (N |sym6|) (|sym4|) ((:APP |sym1|
(|sym4|))))))
(:APP FACT (|sym5| |sym7|)))))))))
(:APP FACT (EXIT 10)))
CPS→ VM
• 再帰を使った階乗の例
(:FIXH
((FACT (|sym1| N)
(:= (N 0) NIL
((:APP |sym1| (1))
(:- (N 1) (|sym7|)
((:FIXS
((|sym5| (|sym6|) (:* (N |sym6|) (|sym4|) ((:APP |sym1|
(|sym4|))))))
(:APP FACT (|sym5| |sym7|)))))))))
(:APP FACT (EXIT 10)))
((:JUMP (:LABEL |:MAIN|)) MAIN (:CONST (:LABEL |:MAIN|)) EXIT
(:CONST (:LABEL |:EXIT|)) |:EXIT| (:HALT :R1) |:MAIN|
(:JUMP (:LABEL |:label0|)) (:LIVE-REG 0 (1 1 1 0 0 0 0 0 0 0)) |:FACT|
(:= :R2 0) (:CONDITIONAL-JUMP (:LABEL |:label1|)) (:- :R2 1 :R9)
(:JUMP (:LABEL |:label2|)) (:LIVE-REG 0 (1 1 0 0 0 0 0 0 0 0)) |:sym5|
(:RECORD-REF :R0 2 :R9) (:RECORD-REF :R0 1 :R8) (:POP 3) (:* :R8 :R1 :R1)
(:RECORD-REF :R9 0 :R8) (:MOVE :R9 :R0) (:JUMP :R8) |:label2|
(:STACK (:HEAP-LIST (:LABEL |:sym5|) :R2 :R1) :R1) (:RECORD-REF :R0 0 :R8)
(:MOVE :R9 :R2) (:JUMP :R8) |:label1| (:RECORD-REF :R1 0 :R9)
(:MOVE :R1 :R0)
(:MOVEI 1 :R1) (:JUMP :R9) |:label0|
(:HEAP (:HEAP-LIST (:LABEL |:FACT|)) :R9) (:RECORD-REF :R9 0 :R8)
(:MOVE :R9 :R0) (:MOVEI (:ADDRESS EXIT) :R1) (:MOVEI 10 :R2) (:JUMP :R8))
VM も作った
• vmgen(gforth) でつくった VM (抜粋)
 stack definitions:
E stack data-stack sp Cell
E s" Operand" single inst-stream type-prefix operand
E s" Imm" single inst-stream type-prefix imm
E s" Cell" single data-stack type-prefix s
 ----------------------------------------------------------------
add ( operand -- )
regs[operand.r2] = regs[operand.r0] + regs[operand.r1];
addi8 ( operand -- )
regs[operand.r2] = regs[operand.r0] + operand.r1;
addi32 ( operand imm32 -- )
regs[operand.r2] = regs[operand.r0] + imm32;
 ----------------------------------------------------------------
sub ( operand -- )
regs[operand.r2] = regs[operand.r0] - regs[operand.r1];
subi8 ( operand -- )
regs[operand.r2] = regs[operand.r0] - operand.r1;
Zynq 上で動く
T-Kernel VM の結果
(この例はフィボナッチ) VM
OpenAMP か
TrustZone(SafeG) を
使用
今と後
Scheme CPS VM
今
Scheme CPS VM
後
IROHA
今後勉強すること
• A正規形とK正規形
• OCaml と型推論
おしまい

Más contenido relacionado

Destacado

Analog Devices の IP コアを使う
Analog Devices の IP コアを使うAnalog Devices の IP コアを使う
Analog Devices の IP コアを使うryos36
 
高速化のポイント
高速化のポイント高速化のポイント
高速化のポイントryos36
 
SDSoC と Vivado
SDSoC と VivadoSDSoC と Vivado
SDSoC と Vivadoryos36
 
Synthesijer で作るFORTH仮想マシン
Synthesijer で作るFORTH仮想マシンSynthesijer で作るFORTH仮想マシン
Synthesijer で作るFORTH仮想マシンryos36
 
Continuation Passing Style and Macros in Clojure - Jan 2012
Continuation Passing Style and Macros in Clojure - Jan 2012Continuation Passing Style and Macros in Clojure - Jan 2012
Continuation Passing Style and Macros in Clojure - Jan 2012Leonardo Borges
 
クラシフィケーション・ツリー法入門
クラシフィケーション・ツリー法入門クラシフィケーション・ツリー法入門
クラシフィケーション・ツリー法入門H Iseri
 
Polyphony IO まとめ
Polyphony IO まとめPolyphony IO まとめ
Polyphony IO まとめryos36
 
How to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & TricksHow to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & TricksSlideShare
 
Getting Started With SlideShare
Getting Started With SlideShareGetting Started With SlideShare
Getting Started With SlideShareSlideShare
 

Destacado (10)

Analog Devices の IP コアを使う
Analog Devices の IP コアを使うAnalog Devices の IP コアを使う
Analog Devices の IP コアを使う
 
高速化のポイント
高速化のポイント高速化のポイント
高速化のポイント
 
SDSoC と Vivado
SDSoC と VivadoSDSoC と Vivado
SDSoC と Vivado
 
Synthesijer で作るFORTH仮想マシン
Synthesijer で作るFORTH仮想マシンSynthesijer で作るFORTH仮想マシン
Synthesijer で作るFORTH仮想マシン
 
Continuation Passing Style and Macros in Clojure - Jan 2012
Continuation Passing Style and Macros in Clojure - Jan 2012Continuation Passing Style and Macros in Clojure - Jan 2012
Continuation Passing Style and Macros in Clojure - Jan 2012
 
クラシフィケーション・ツリー法入門
クラシフィケーション・ツリー法入門クラシフィケーション・ツリー法入門
クラシフィケーション・ツリー法入門
 
Polyphony IO まとめ
Polyphony IO まとめPolyphony IO まとめ
Polyphony IO まとめ
 
BCCとGCCの比較
BCCとGCCの比較BCCとGCCの比較
BCCとGCCの比較
 
How to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & TricksHow to Make Awesome SlideShares: Tips & Tricks
How to Make Awesome SlideShares: Tips & Tricks
 
Getting Started With SlideShare
Getting Started With SlideShareGetting Started With SlideShare
Getting Started With SlideShare
 

Más de ryos36

Pycairo を使ってみる その1
Pycairo を使ってみる その1Pycairo を使ってみる その1
Pycairo を使ってみる その1ryos36
 
ストーリーとは
ストーリーとはストーリーとは
ストーリーとはryos36
 
CNN でテニス選手の動きを解析する
CNN でテニス選手の動きを解析するCNN でテニス選手の動きを解析する
CNN でテニス選手の動きを解析するryos36
 
Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)ryos36
 
Polyphony の並列化
Polyphony の並列化Polyphony の並列化
Polyphony の並列化ryos36
 
Polyphony 新機能ツアー
Polyphony 新機能ツアーPolyphony 新機能ツアー
Polyphony 新機能ツアーryos36
 
Polyphony: Python ではじめる FPGA
Polyphony: Python ではじめる FPGAPolyphony: Python ではじめる FPGA
Polyphony: Python ではじめる FPGAryos36
 
Stellaris を使った組み込みアプリ開発ガイド
Stellaris を使った組み込みアプリ開発ガイドStellaris を使った組み込みアプリ開発ガイド
Stellaris を使った組み込みアプリ開発ガイドryos36
 
研究者のための Python による FPGA 入門
研究者のための Python による FPGA 入門研究者のための Python による FPGA 入門
研究者のための Python による FPGA 入門ryos36
 
PYNQ 祭り: Pmod のプログラミング
PYNQ 祭り: Pmod のプログラミングPYNQ 祭り: Pmod のプログラミング
PYNQ 祭り: Pmod のプログラミングryos36
 
SDSoC でストリーム
SDSoC でストリームSDSoC でストリーム
SDSoC でストリームryos36
 
並列計算への道 2015年版
並列計算への道 2015年版並列計算への道 2015年版
並列計算への道 2015年版ryos36
 
NiosII と RTOS について
NiosII と RTOS についてNiosII と RTOS について
NiosII と RTOS についてryos36
 

Más de ryos36 (13)

Pycairo を使ってみる その1
Pycairo を使ってみる その1Pycairo を使ってみる その1
Pycairo を使ってみる その1
 
ストーリーとは
ストーリーとはストーリーとは
ストーリーとは
 
CNN でテニス選手の動きを解析する
CNN でテニス選手の動きを解析するCNN でテニス選手の動きを解析する
CNN でテニス選手の動きを解析する
 
Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)Polyphony の行く末(2018/3/3)
Polyphony の行く末(2018/3/3)
 
Polyphony の並列化
Polyphony の並列化Polyphony の並列化
Polyphony の並列化
 
Polyphony 新機能ツアー
Polyphony 新機能ツアーPolyphony 新機能ツアー
Polyphony 新機能ツアー
 
Polyphony: Python ではじめる FPGA
Polyphony: Python ではじめる FPGAPolyphony: Python ではじめる FPGA
Polyphony: Python ではじめる FPGA
 
Stellaris を使った組み込みアプリ開発ガイド
Stellaris を使った組み込みアプリ開発ガイドStellaris を使った組み込みアプリ開発ガイド
Stellaris を使った組み込みアプリ開発ガイド
 
研究者のための Python による FPGA 入門
研究者のための Python による FPGA 入門研究者のための Python による FPGA 入門
研究者のための Python による FPGA 入門
 
PYNQ 祭り: Pmod のプログラミング
PYNQ 祭り: Pmod のプログラミングPYNQ 祭り: Pmod のプログラミング
PYNQ 祭り: Pmod のプログラミング
 
SDSoC でストリーム
SDSoC でストリームSDSoC でストリーム
SDSoC でストリーム
 
並列計算への道 2015年版
並列計算への道 2015年版並列計算への道 2015年版
並列計算への道 2015年版
 
NiosII と RTOS について
NiosII と RTOS についてNiosII と RTOS について
NiosII と RTOS について
 

20周遅れ

  • 2. Agenda • 今取り組んでいること – CPSを使ったコンパイラ • 今後勉強すること – A正規形とK正規形 – OCaml と型推論
  • 3. 今取り組んでいること • CPS を使ったコンパイラ – 開発言語: Common Lisp – ターゲットの言語: Mini Scheme – 生成されるもの: VM のコード(HLS ではない!!)
  • 4. CPS(Continuation Passing Style) - 1992 年の本 - ML を使用している
  • 6. mini-scheme(例) • 再帰を使った階乗の例 (:fix ((fact (n) (:if (:= n 0) 1 (:* n (fact (:- n 1)))))) (fact 10))
  • 7. mini-scheme → CPS • 再帰を使った階乗の例 (:fix ((fact (n) (:if (:= n 0) 1 (:* n (fact (:- n 1)))))) (fact 10)) (:FIXH ((FACT (|sym1| N) (:FIXS ((|sym2| (|sym3|) (:APP |sym1| (|sym3|)))) (:= (N 0) NIL ((:APP |sym2| (1)) (:- (N 1) (|sym7|) ((:FIXS ((|sym5| (|sym6|) (:* (N |sym6|) (|sym4|) ((:APP |sym2| (|sym4|)))))) (:APP FACT (|sym5| |sym7|)))))))))) (:FIXS ((|sym8| (|sym9|) (:APP EXIT (|sym9|)))) (:APP FACT (|sym8| 10))))
  • 8. CPS → CPS(η-Reduction) • 再帰を使った階乗の例 (:FIXH ((FACT (|sym1| N) (:FIXS ((|sym2| (|sym3|) (:APP |sym1| (|sym3|)))) (:= (N 0) NIL ((:APP |sym2| (1)) (:- (N 1) (|sym7|) ((:FIXS ((|sym5| (|sym6|) (:* (N |sym6|) (|sym4|) ((:APP |sym2| (|sym4|)))))) (:APP FACT (|sym5| |sym7|)))))))))) (:FIXS ((|sym8| (|sym9|) (:APP EXIT (|sym9|)))) (:APP FACT (|sym8| 10)))) (:FIXH ((FACT (|sym1| N) (:= (N 0) NIL ((:APP |sym1| (1)) (:- (N 1) (|sym7|) ((:FIXS ((|sym5| (|sym6|) (:* (N |sym6|) (|sym4|) ((:APP |sym1| (|sym4|)))))) (:APP FACT (|sym5| |sym7|))))))))) (:APP FACT (EXIT 10)))
  • 9. CPS→ VM • 再帰を使った階乗の例 (:FIXH ((FACT (|sym1| N) (:= (N 0) NIL ((:APP |sym1| (1)) (:- (N 1) (|sym7|) ((:FIXS ((|sym5| (|sym6|) (:* (N |sym6|) (|sym4|) ((:APP |sym1| (|sym4|)))))) (:APP FACT (|sym5| |sym7|))))))))) (:APP FACT (EXIT 10))) ((:JUMP (:LABEL |:MAIN|)) MAIN (:CONST (:LABEL |:MAIN|)) EXIT (:CONST (:LABEL |:EXIT|)) |:EXIT| (:HALT :R1) |:MAIN| (:JUMP (:LABEL |:label0|)) (:LIVE-REG 0 (1 1 1 0 0 0 0 0 0 0)) |:FACT| (:= :R2 0) (:CONDITIONAL-JUMP (:LABEL |:label1|)) (:- :R2 1 :R9) (:JUMP (:LABEL |:label2|)) (:LIVE-REG 0 (1 1 0 0 0 0 0 0 0 0)) |:sym5| (:RECORD-REF :R0 2 :R9) (:RECORD-REF :R0 1 :R8) (:POP 3) (:* :R8 :R1 :R1) (:RECORD-REF :R9 0 :R8) (:MOVE :R9 :R0) (:JUMP :R8) |:label2| (:STACK (:HEAP-LIST (:LABEL |:sym5|) :R2 :R1) :R1) (:RECORD-REF :R0 0 :R8) (:MOVE :R9 :R2) (:JUMP :R8) |:label1| (:RECORD-REF :R1 0 :R9) (:MOVE :R1 :R0) (:MOVEI 1 :R1) (:JUMP :R9) |:label0| (:HEAP (:HEAP-LIST (:LABEL |:FACT|)) :R9) (:RECORD-REF :R9 0 :R8) (:MOVE :R9 :R0) (:MOVEI (:ADDRESS EXIT) :R1) (:MOVEI 10 :R2) (:JUMP :R8))
  • 10. VM も作った • vmgen(gforth) でつくった VM (抜粋) stack definitions: E stack data-stack sp Cell E s" Operand" single inst-stream type-prefix operand E s" Imm" single inst-stream type-prefix imm E s" Cell" single data-stack type-prefix s ---------------------------------------------------------------- add ( operand -- ) regs[operand.r2] = regs[operand.r0] + regs[operand.r1]; addi8 ( operand -- ) regs[operand.r2] = regs[operand.r0] + operand.r1; addi32 ( operand imm32 -- ) regs[operand.r2] = regs[operand.r0] + imm32; ---------------------------------------------------------------- sub ( operand -- ) regs[operand.r2] = regs[operand.r0] - regs[operand.r1]; subi8 ( operand -- ) regs[operand.r2] = regs[operand.r0] - operand.r1;
  • 11. Zynq 上で動く T-Kernel VM の結果 (この例はフィボナッチ) VM OpenAMP か TrustZone(SafeG) を 使用