Continuation-passing Style (CPS) Assignment-converted/alphatized IR - - PowerPoint PPT Presentation

continuation passing style cps assignment converted
SMART_READER_LITE
LIVE PREVIEW

Continuation-passing Style (CPS) Assignment-converted/alphatized IR - - PowerPoint PPT Presentation

Continuation-passing Style (CPS) Assignment-converted/alphatized IR (.alpha) e ::= (let ([x e] ...) e) | (lambda (x ...) e) | (lambda x e) | (apply e e) | (e e ...) | (prim op e ...) | (apply-prim op e) | (if e e e) | (call/cc e) | x |


slide-1
SLIDE 1

Continuation-passing Style (CPS)

slide-2
SLIDE 2

e ::= (let ([x e] ...) e) | (lambda (x ...) e) | (lambda x e) | (apply e e) | (e e ...) | (prim op e ...) | (apply-prim op e) | (if e e e) | (call/cc e) | x | (quote dat)

Assignment-converted/alphatized IR (.alpha)

slide-3
SLIDE 3

e ::= (let ([x e]) e) | (apply ae ae) | (ae ae ...) | (prim op ae ...) | (apply-prim op ae) | (if ae e e) | (call/cc ae) | ae ae ::= (lambda (x ...) e) | (lambda x e) | x | (quote dat)

Administrative normal form (ANF) (.anf)

slide-4
SLIDE 4

e ::= (let ([x (apply-prim op ae)]) e) | (let ([x (prim op ae ...)]) e) | (apply ae ae) | (ae ae ...) | (if ae e e) ae ::= (lambda (x ...) e) | (lambda x e) | x | (quote dat)

Continuation-passing style (CPS) (.cps)

slide-5
SLIDE 5

e ::= (let ([x (apply-prim op ae)]) e) | (let ([x (prim op ae ...)]) e) | (apply ae ae) | (ae ae ...) | (if ae e e) ae ::= (lambda (x ...) e) | (lambda x e) | x | (quote dat)

  • Programs in CPS require no stack and never return.
  • Instead, at each application, a continuation (a callback

function) is passed forward explicitly.

  • Points that would otherwise have extended the stack now

create a closure (where the environment saves local variables and the stack tail).

  • Return points become invocations of the current continuation.
slide-6
SLIDE 6

(let ([x ((lambda (y z) z) a b)]) e) ((lambda (k y z) (k 0 z)) (lambda (k v) ecps) a b)

All functions take an extra continuation parameter. As call/cc lets us pass continuations as values, so must they (despite not using it). ecps has a free var for e’s cont.

slide-7
SLIDE 7

call/cc = (lambda (k f) (f k k))

slide-8
SLIDE 8

Visualizing CPS (example)

slide-9
SLIDE 9

(define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2))))) (fib 4)

IR

slide-10
SLIDE 10

(define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))

fn {+} (fib (- n 2)) [n = 4]

(fib 3)

IR

slide-11
SLIDE 11

(define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))

fn {+} (fib (- n 2)) [n = 4]

(fib 2)

fn {+} (fib (- n 2)) [n = 3]

IR

slide-12
SLIDE 12

(define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))

fn {+} (fib (- n 2)) [n = 4] fn {+} (fib (- n 2)) [n = 3] fn {+} (fib (- n 2)) [n = 2]

(fib 1)

IR

slide-13
SLIDE 13

(define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))

fn {+} (fib (- n 2)) [n = 4] fn {+} (fib (- n 2)) [n = 3] fn {+} (fib (- n 2)) [n = 2]

{1}

IR

slide-14
SLIDE 14

(define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))

fn {+} (fib (- n 2)) [n = 4] fn {+} (fib (- n 2)) [n = 3] fn {+} {1}

(fib 0)

IR

slide-15
SLIDE 15

(define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))

fn {+} (fib (- n 2)) [n = 4] fn {+} (fib (- n 2)) [n = 3] fn {+} {1}

IR

slide-16
SLIDE 16

(define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))

fn {+} (fib (- n 2)) [n = 4] fn {+} (fib (- n 2)) [n = 3]

1

IR

slide-17
SLIDE 17

(define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))

fn {+} (fib (- n 2)) [n = 4] fn {+} {1}

(fib 1)

IR

slide-18
SLIDE 18

(define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))

fn {+} (fib (- n 2)) [n = 4] fn {+} {1}

1

IR

slide-19
SLIDE 19

(define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))

fn {+} (fib (- n 2)) [n = 4]

2

IR

slide-20
SLIDE 20

(define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))

fn {+} {2}

(fib 2)

IR

slide-21
SLIDE 21

(define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))

fn {+} {2}

(fib 1)

IR

fn {+} (fib (- n 2)) [n = 2]

slide-22
SLIDE 22

(define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))

fn {+} {2}

1

IR

fn {+} (fib (- n 2)) [n = 2]

slide-23
SLIDE 23

(define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))

fn {+} {2}

IR

fn {+} {1}

(fib 0)

slide-24
SLIDE 24

(define (fib n) (if (<= n 1) n (+ (fib (- n 1)) (fib (- n 2)))))

fn {+} {2}

IR

fn {+} {1}

3

slide-25
SLIDE 25

(define (fib n) (let ([c (<= n 1)]) (if c n 0(let ([n-1 (- n 1)]) 1(let ([v0 (fib n-1)]) 2(let ([n-2 (- n 2)]) 3(let ([v1 (fib n-2)]) 4(let ([s (+ v0 v1)]) 5s)))))))

ANF

(fib 4)

slide-26
SLIDE 26

(define (fib n) (let ([c (<= n 1)]) (if c n 0(let ([n-1 (- n 1)]) 1(let ([v0 (fib n-1)]) 2(let ([n-2 (- n 2)]) 3(let ([v1 (fib n-2)]) 4(let ([s (+ v0 v1)]) 5s)))))))

ANF

(fib 3)

letk v0 e2 [n=4,n-1=3,…]

slide-27
SLIDE 27

(define (fib n) (let ([c (<= n 1)]) (if c n 0(let ([n-1 (- n 1)]) 1(let ([v0 (fib n-1)]) 2(let ([n-2 (- n 2)]) 3(let ([v1 (fib n-2)]) 4(let ([s (+ v0 v1)]) 5s)))))))

ANF

(fib 2)

letk v0 e2 [n=4,n-1=3,…] letk v0 e2 [n=3,n-1=2,…]

slide-28
SLIDE 28

(define (fib n) (let ([c (<= n 1)]) (if c n 0(let ([n-1 (- n 1)]) 1(let ([v0 (fib n-1)]) 2(let ([n-2 (- n 2)]) 3(let ([v1 (fib n-2)]) 4(let ([s (+ v0 v1)]) 5s)))))))

ANF

(fib 1) -> 1

letk v0 e2 [n=4,n-1=3,…] letk v0 e2 [n=3,n-1=2,…] letk v0 e2 [n=2,n-1=1,…]

slide-29
SLIDE 29

(define (fib n) (let ([c (<= n 1)]) (if c n 0(let ([n-1 (- n 1)]) 1(let ([v0 (fib n-1)]) 2(let ([n-2 (- n 2)]) 3(let ([v1 (fib n-2)]) 4(let ([s (+ v0 v1)]) 5s)))))))

ANF

(fib 0) -> 0

letk v0 e2 [n=4,n-1=3,…] letk v0 e2 [n=3,n-1=2,…] letk v1 e4 [v0=1,n=2,n-1=1,…]

slide-30
SLIDE 30

(define (fib n) (let ([c (<= n 1)]) (if c n 0(let ([n-1 (- n 1)]) 1(let ([v0 (fib n-1)]) 2(let ([n-2 (- n 2)]) 3(let ([v1 (fib n-2)]) 4(let ([s (+ v0 v1)]) 5s)))))))

ANF

s [s=1,v0=1,v1=0,…]

letk v0 e2 [n=4,n-1=3,…] letk v0 e2 [n=3,n-1=2,…]

slide-31
SLIDE 31

(define (fib n) (let ([c (<= n 1)]) (if c n 0(let ([n-1 (- n 1)]) 1(let ([v0 (fib n-1)]) 2(let ([n-2 (- n 2)]) 3(let ([v1 (fib n-2)]) 4(let ([s (+ v0 v1)]) 5s)))))))

ANF

letk v0 e2 [n=4,n-1=3,…] letk v1 e4 [v0=1,n=3,n-1=2,…]

(fib 1) -> 1

slide-32
SLIDE 32

(define (fib n) (let ([c (<= n 1)]) (if c n 0(let ([n-1 (- n 1)]) 1(let ([v0 (fib n-1)]) 2(let ([n-2 (- n 2)]) 3(let ([v1 (fib n-2)]) 4(let ([s (+ v0 v1)]) 5s)))))))

ANF

letk v0 e2 [n=4,n-1=3,…]

s [s=2,v0=1,v1=1,…]

slide-33
SLIDE 33

(define (fib n) (let ([c (<= n 1)]) (if c n 0(let ([n-1 (- n 1)]) 1(let ([v0 (fib n-1)]) 2(let ([n-2 (- n 2)]) 3(let ([v1 (fib n-2)]) 4(let ([s (+ v0 v1)]) 5s)))))))

ANF

letk v1 e4 [v0=2,n=4,n-1=3,…]

(fib 2)

slide-34
SLIDE 34

(define (fib n) (let ([c (<= n 1)]) (if c n 0(let ([n-1 (- n 1)]) 1(let ([v0 (fib n-1)]) 2(let ([n-2 (- n 2)]) 3(let ([v1 (fib n-2)]) 4(let ([s (+ v0 v1)]) 5s)))))))

ANF

letk v1 e4 [v0=2,n=4,n-1=3,…]

(fib 1) -> 1

letk v0 e2 [n=2,n-1=3,…]

slide-35
SLIDE 35

(define (fib n) (let ([c (<= n 1)]) (if c n 0(let ([n-1 (- n 1)]) 1(let ([v0 (fib n-1)]) 2(let ([n-2 (- n 2)]) 3(let ([v1 (fib n-2)]) 4(let ([s (+ v0 v1)]) 5s)))))))

ANF

letk v1 e4 [v0=2,n=4,n-1=3,…]

(fib 0) -> 0

letk v1 e4 [v0=1,n=2,n-1=3,…]

slide-36
SLIDE 36

(define (fib n k) (let ([c (<= n 1)]) (if c (k n) (let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s)))))))))))

CPS

(fib 4 print)

slide-37
SLIDE 37

(define (fib n k) (let ([c (<= n 1)]) (if c (k n) (let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s)))))))))))

CPS

(fib 3 k) print

(lambda (v0) …)

n=4 k =

slide-38
SLIDE 38

(define (fib n k) (let ([c (<= n 1)]) (if c (k n) (let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s)))))))))))

CPS

(fib 2 k)

(lambda (v0) …)

n=4 k = print

(lambda (v0) …)

n=3 k =

slide-39
SLIDE 39

(define (fib n k) (let ([c (<= n 1)]) (if c (k n) (let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s)))))))))))

CPS

(fib 1 k)

(lambda (v0) …)

n=3 k = print

(lambda (v0) …)

n=2 k =

(lambda (v0) …)

n=4 k =

slide-40
SLIDE 40

(define (fib n k) (let ([c (<= n 1)]) (if c (k n) (let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s)))))))))))

CPS

(k 1)

(lambda (v0) …)

n=3 k = print

(lambda (v0) …)

n=2 k =

(lambda (v0) …)

n=4 k =

slide-41
SLIDE 41

(define (fib n k) (let ([c (<= n 1)]) (if c (k n) (let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s)))))))))))

CPS

(fib 0 k)

(lambda (v0) …)

n=3 k = print

(lambda (v1) …)

n=2 v0=1 k

(lambda (v0) …)

n=4 k =

slide-42
SLIDE 42

(define (fib n k) (let ([c (<= n 1)]) (if c (k n) (let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s)))))))))))

CPS

(k 0)

(lambda (v0) …)

n=3 k = print

(lambda (v1) …)

n=2 v0=1 k

(lambda (v0) …)

n=4 k =

slide-43
SLIDE 43

(define (fib n k) (let ([c (<= n 1)]) (if c (k n) (let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s)))))))))))

CPS

(k 1)

(lambda (v0) …)

n=3 k = print

(lambda (v0) …)

n=4 k =

slide-44
SLIDE 44

(define (fib n k) (let ([c (<= n 1)]) (if c (k n) (let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s)))))))))))

CPS

(fib 1 k)

(lambda (v1) …)

n=3 v0=1 k print

(lambda (v0) …)

n=4 k =

slide-45
SLIDE 45

(define (fib n k) (let ([c (<= n 1)]) (if c (k n) (let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s)))))))))))

CPS

(k 1)

(lambda (v1) …)

n=3 v0=1 k print

(lambda (v0) …)

n=4 k =

slide-46
SLIDE 46

(define (fib n k) (let ([c (<= n 1)]) (if c (k n) (let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s)))))))))))

CPS

(k 2) print

(lambda (v0) …)

n=4 k =

slide-47
SLIDE 47

(define (fib n k) (let ([c (<= n 1)]) (if c (k n) (let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s)))))))))))

CPS

(fib 2 k) print

(lambda (v1) …)

n=4 v0=2 k

slide-48
SLIDE 48

(define (fib n k) (let ([c (<= n 1)]) (if c (k n) (let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s)))))))))))

CPS

(fib 1 k) print

(lambda (v1) …)

n=4 v0=2 k

(lambda (v0) …)

n=2 k =

slide-49
SLIDE 49

(define (fib n k) (let ([c (<= n 1)]) (if c (k n) (let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s)))))))))))

CPS

(k 1) print

(lambda (v1) …)

n=4 v0=2 k

(lambda (v0) …)

n=2 k =

slide-50
SLIDE 50

(define (fib n k) (let ([c (<= n 1)]) (if c (k n) (let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s)))))))))))

CPS

(fib 0 k) print

(lambda (v1) …)

n=4 v0=2 k

(lambda (v1) …)

n=2 v0=1 k

slide-51
SLIDE 51

(define (fib n k) (let ([c (<= n 1)]) (if c (k n) (let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s)))))))))))

CPS

(k 0) print

(lambda (v1) …)

n=4 v0=2 k

(lambda (v1) …)

n=2 v0=1 k

slide-52
SLIDE 52

(define (fib n k) (let ([c (<= n 1)]) (if c (k n) (let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s)))))))))))

CPS

(k 1) print

(lambda (v1) …)

n=4 v0=2 k

slide-53
SLIDE 53

(define (fib n k) (let ([c (<= n 1)]) (if c (k n) (let ([n-1 (- n 1)]) (fib n-1 (lambda (v0) (let ([n-2 (- n 2)]) (fib n-2 (lambda (v1) (let ([s (+ v0 v1)]) (k s)))))))))))

CPS

(k 3) print