cs61a lecture 24

35
CS61A Lecture 24 2011-08-01 Colleen Lewis 1

Upload: magee

Post on 08-Jan-2016

56 views

Category:

Documents


2 download

DESCRIPTION

CS61A Lecture 24. 2011-08-01 Colleen Lewis. Clicker poll . Have you started project 4 part 1? Yes – we’re done! Yes – we’re close to done! Yes – we started Yes – we started reading the project/code No – we haven’t started. Goals. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: CS61A Lecture 24

CS61A Lecture 24

2011-08-01Colleen Lewis

1

Page 2: CS61A Lecture 24

Clicker poll Have you started project 4 part 1?A)Yes – we’re done!B)Yes – we’re close to done!C)Yes – we started D)Yes – we started reading the project/codeE)No – we haven’t started

2

Page 3: CS61A Lecture 24

Goals

• Increase comfort with the meta-circular evaluator (MCE)

• Identify inefficiency• See efficiency improvement using analyze• Connect the ideas in analyze to compiling

3

Page 4: CS61A Lecture 24

mce review

• You could define new functions in mce?–A. True–B. False

4

Page 5: CS61A Lecture 24

How many calls to mc-eval?

;;; M-Eval input:

(define (fact n)

(if (= n 0)

1

(* n (fact (- n 1)))))

A)1 B) 2 C) 3 D) 4 E) 5Does this make any calls to mc-apply?A) Yes B) NO!!!

5

Page 6: CS61A Lecture 24

How many calls to mc-eval?;;; M-Eval input:

(define (simple x) x)

A)1 B) 2 C) 3 D) 4 E) 5

(define (mc-eval exp env)

(display (list 'mc-eval 'exp: exp))

(newline)

(cond ((self-evaluating? exp) exp)

(mc-eval exp: (define (simple x) x))

(mc-eval exp: (lambda (x) x))

6

Page 7: CS61A Lecture 24

How many calls to mc-eval?

;;; M-Eval input:

(simple 5)

A)1 B) 2 C) 3 D) 4 E) 5(mc-eval exp: (simple 5))

(mc-eval exp: simple)

(mc-eval exp: 5)

(mc-eval exp: x)

7

Page 8: CS61A Lecture 24

REVIEW What is a procedure?

STk> (mc-eval '(lambda (x) (* x x)) '(((a) 3)))

(procedure (x) ((* x x)) (((a) 3)))

8

car cdr

((a).(3))Params: xBody: (+ x x)

Globala: 3

procedure

car cdr

(x)

car cdr

((* x x))

car cdr car cdr

Page 9: CS61A Lecture 24

How many calls to mc-eval?

DEMO(fact 0)

(procedure

(n)

((if (= n 0)

1

(* n (fact (- n 1)))))

env)

9

1

2 3

45

6 7 89

Page 10: CS61A Lecture 24

calls to mc-eval(mc-eval exp: (fact 0))

(mc-eval exp: fact)

(mc-eval exp: 0)

(mc-eval exp:

(if (= n 0) 1 (* n (fact (- n 1)))))

(mc-eval exp: (= n 0))

(mc-eval exp: =)

(mc-eval exp: 0)

(mc-eval exp: n)

(mc-eval exp: 1)

10

Page 11: CS61A Lecture 24

(fact 1)(fact 1)

(mc-eval exp: (fact 1))

(mc-eval exp: fact)

(mc-eval exp: 1)

(mc-eval exp: (if (= n 0) 1 (* n (fact (- n 1)))))

(mc-eval exp: (= n 0))

(mc-eval exp: =)

(mc-eval exp: 0)

(mc-eval exp: n)

(mc-eval exp: (* n (fact (- n 1))))

(mc-eval exp: *)

(mc-eval exp: (fact (- n 1)))

(mc-eval exp: fact)

(mc-eval exp: (- n 1))

(mc-eval exp: -)

(mc-eval exp: 1)

(mc-eval exp: n)

11

(mc-eval exp:

(if (= n 0) 1 (* n

(fact (- n 1)))))

(mc-eval exp: (= n 0))

(mc-eval exp: =)

(mc-eval exp: 0)

(mc-eval exp: n)

(mc-eval exp: 1)

(mc-eval exp: n)

Page 12: CS61A Lecture 24

(fact 1)(fact 1)

(mc-eval exp: (fact 1))

(mc-eval exp: fact)

(mc-eval exp: 1)

(mc-eval exp: (if (= n 0) 1 (* n (fact (- n 1)))))

(mc-eval exp: (= n 0))

(mc-eval exp: =)

(mc-eval exp: 0)

(mc-eval exp: n)

(mc-eval exp: (* n (fact (- n 1))))

(mc-eval exp: *)

(mc-eval exp: (fact (- n 1)))

(mc-eval exp: fact)

(mc-eval exp: (- n 1))

(mc-eval exp: -)

(mc-eval exp: 1)

(mc-eval exp: n)

12

(mc-eval exp:

(if (= n 0) 1 (* n

(fact (- n 1)))))

(mc-eval exp: (= n 0))

(mc-eval exp: =)

(mc-eval exp: 0)

(mc-eval exp: n)

(mc-eval exp: 1)

(mc-eval exp: n)

Page 13: CS61A Lecture 24

(fact 2)

13

(mc-eval exp: (if (= n 0) 1 (* n (fact (- n 1)))))(mc-eval exp: (= n 0))(mc-eval exp: =)(mc-eval exp: 0)(mc-eval exp: n)(mc-eval exp: (* n (fact (- n 1))))(mc-eval exp: *)(mc-eval exp: (fact (- n 1)))(mc-eval exp: fact)(mc-eval exp: (- n 1))(mc-eval exp: -)(mc-eval exp: 1)(mc-eval exp: n)

(mc-eval exp: (if (= n 0) 1 (* n (fact (- n 1)))))(mc-eval exp: (= n 0))(mc-eval exp: =)(mc-eval exp: 0)(mc-eval exp: n)(mc-eval exp: (* n (fact (- n 1))))(mc-eval exp: *)(mc-eval exp: (fact (- n 1)))(mc-eval exp: fact)(mc-eval exp: (- n 1))(mc-eval exp: -)(mc-eval exp: 1)(mc-eval exp: n)

(mc-eval exp: (if (= n 0) 1 (* n (fact (- n 1)))))(mc-eval exp: (= n 0))(mc-eval exp: =)(mc-eval exp: 0)(mc-eval exp: n)(mc-eval exp: 1)(mc-eval exp: n)(mc-eval exp: n)

(mc-eval exp: (fact 2))(mc-eval exp: fact)(mc-eval exp: 2)

Page 14: CS61A Lecture 24

(fact 3)

14

(mc-eval exp: (if (= n 0) 1 (* n (fact (- n 1)))))(mc-eval exp: (= n 0))(mc-eval exp: =)(mc-eval exp: 0)(mc-eval exp: n)(mc-eval exp: (* n (fact (- n 1))))(mc-eval exp: *)(mc-eval exp: (fact (- n 1)))(mc-eval exp: fact)(mc-eval exp: (- n 1))(mc-eval exp: -)(mc-eval exp: 1)(mc-eval exp: n)

(mc-eval exp: (if (= n 0) 1 (* n (fact (- n 1)))))(mc-eval exp: (= n 0))(mc-eval exp: =)(mc-eval exp: 0)(mc-eval exp: n)(mc-eval exp: (* n (fact (- n 1))))(mc-eval exp: *)(mc-eval exp: (fact (- n 1)))(mc-eval exp: fact)(mc-eval exp: (- n 1))(mc-eval exp: -)(mc-eval exp: 1)(mc-eval exp: n)

(mc-eval exp: (if (= n 0) 1 (* n (fact (- n 1)))))(mc-eval exp: (= n 0))(mc-eval exp: =)(mc-eval exp: 0)(mc-eval exp: n)(mc-eval exp: 1)(mc-eval exp: n)(mc-eval exp: n)

(mc-eval exp: (fact 2))(mc-eval exp: fact)(mc-eval exp: 2)

(mc-eval exp: (if (= n 0) 1 (* n (fact (- n 1)))))(mc-eval exp: (= n 0))(mc-eval exp: =)(mc-eval exp: 0)(mc-eval exp: n)(mc-eval exp: (* n (fact (- n 1))))(mc-eval exp: *)(mc-eval exp: (fact (- n 1)))(mc-eval exp: fact)(mc-eval exp: (- n 1))(mc-eval exp: -)(mc-eval exp: 1)(mc-eval exp: n)

Page 15: CS61A Lecture 24

(define (mc-eval exp env)

(cond

((self-evaluating? exp)...

((variable? exp)...

((quoted? exp) ...

((assignment? exp) ...

((definition? exp) ...

((if? exp) ...

((lambda? exp) ...

((begin? exp) ...

((cond? exp) ...

((application? exp) ...

(else (error “what?"))))

15

Each call to mc-eval

could have a lot of sub-

calls!

Most didn’t depend upon the environment so I

could do in advance

Page 16: CS61A Lecture 24

analzye

(define (mc-eval exp env)

( env))

What is the domain and range of analyze?A.Domain: function Range: function B.Domain: expression Range: function C.Domain: function Range: expression D.Domain: expression Range: expression E.Other

16

(analyze exp)

Page 17: CS61A Lecture 24

analyze

analyzeList

representing expression

STK Scheme expression(λ(env)

17

(define (mc-eval exp env)

((analyze exp) env))

Page 18: CS61A Lecture 24

analyze

(define (analyze exp)

(cond

((self-evaluating? exp)

((quoted? exp) …

((variable? exp) …

((assignment? exp) …

((definition? exp) …

((if? exp) …

((lambda? exp) …

((begin? exp) …

((cond? exp) …

((application? exp) …

(else (error "Unknown" exp))))

18

(define (mc-eval exp env) ((analyze exp) env))

Page 19: CS61A Lecture 24

(define (mc-eval exp env)

(cond

((self-evaluating? exp) exp)

((quoted? exp) (text-of-quotation exp)) ((variable? exp)(lookup-variable-value exp env))

…(define (analyze exp)

(cond

((self-evaluating? exp)

(analyze-self-evaluating exp))

((quoted? exp)

(analyze-quoted exp))

((variable? exp)

(analyze-variable exp))

19

Page 20: CS61A Lecture 24

(define (mc-eval exp env)

(cond

((self-evaluating? exp) exp) ...

(define (analyze exp)

(cond

((self-evaluating? exp)

(analyze-self-evaluating exp))...

(define (analyze-self-evaluating exp)

(lambda (env) exp))

Is the domain and range correct? A) Yes B) No

20

analyzeList

representing expression

STK Scheme expression(λ(env)

Page 21: CS61A Lecture 24

(define (mc-eval exp env)

(cond ...((variable? exp)(lookup-variable-value exp env))

...

(define (analyze exp)

(cond ...

((variable? exp) (analyze-variable exp))

...

(define (analyze-variable exp)

;; write this!

(lambda (env) (lookup-variable-value exp env)))

Is the thing you returned entirely scheme (it only needs to be interpreted by STk)? A) Yes B) No C) ???

21

Page 22: CS61A Lecture 24

(define (lookup-variable-value var env)

(define (env-loop env)

(define (scan vars vals)

(cond

((null? vars)

(env-loop (enclosing-environment env)))

((eq? var (car vars))

(car vals))

(else (scan (cdr vars) (cdr vals)))))

(if (eq? env the-empty-environment)

(error "Unbound variable" var)

(let ((frame (first-frame env)))

(scan (frame-variables frame)

(frame-values frame)))))

(env-loop env))

22

Page 23: CS61A Lecture 24

(define (mc-eval exp env)

(cond ...

((quoted? exp) (text-of-quotation exp))

...

(define (text-of-quotation exp) (cadr exp))

(define (analyze exp)

(cond ...

((quoted? exp)

(analyze-quoted exp))

...

23

analyze-quoted

Page 24: CS61A Lecture 24

Two versions of analyze-quoted(define (analyze-quoted_v1 exp)

(lambda (env) (text-of-quotation exp)))

(define (analyze-quoted_v2 exp)

(let ((qval (text-of-quotation exp)))

(lambda (env) qval)))

A)Only v1 worksB)Only v2 worksC)v1 is betterD)v2 is betterE)They are the same

24

Page 25: CS61A Lecture 24

(define (mc-eval exp env)

(cond ...

((if? exp) (eval-if exp env))

...

(define (analyze exp)

(cond ...

((if? exp) (analyze-if exp)) ...

...

(define (eval-if exp env)

(if (true? (mc-eval (if-predicate exp) env))

(mc-eval (if-consequent exp) env)

(mc-eval (if-alternative exp) env)))

25

Write analyze-ifIs the

analyzed code faster if it is run multiple times?A)Y B)N

Page 26: CS61A Lecture 24

analyze-if solution

(define (analyze-if exp)

(let ((pproc (analyze (if-predicate exp)))

(cproc (analyze (if-consequent exp)))

(aproc (analyze (if-alternative exp))))

(lambda (env)

(if (true? (pproc env))

(cproc env)

(aproc env)))))

Is the thing you returned entirely scheme (it only needs to be interpreted by STk)? A) Yes B) No C) ???

26

Page 27: CS61A Lecture 24

(analyze '(if #t 3 4))(define (analyze exp)

(cond ((self-evaluating? exp)

(analyze-self-evaluating exp))

((if? exp) (analyze-if exp))...

(define (analyze-if exp)

(let ((pproc (analyze (if-predicate exp)))

(cproc (analyze (if-consequent exp)))

(aproc (analyze (if-alternative exp))))

(lambda (env)

(if (true? (pproc env))

(cproc env)

(aproc env)))))

27

Page 28: CS61A Lecture 24

(analyze '(if #t 3 4))(define (analyze exp)

(cond ((self-evaluating? exp)

(analyze-self-evaluating exp))

((if? exp) (analyze-if exp))...

(define (analyze-if exp)

(let ((pproc (analyze (if-predicate exp)))

(cproc (analyze (if-consequent exp)))

(aproc (analyze (if-alternative exp))))

(lambda (env)

(if (true? ( pproc env))

( cproc env)

( approc env)))))

28

(λ(e) #t)

(λ(e) 3)

(λ(e) 4)

Page 29: CS61A Lecture 24

Do we save time using the analyzing mce?

(sent-sum '(1 2 3 4 5 6 7 8))

A) Yes B) No C)??(sent-sum '())

A) Yes B) No C)??(list (+ 2 3) (+ 4 5) (+ 2 3))

A) Yes B) No C)??(list (sq 2) (sq 3) (sq 4))

A) Yes B) No C)??

29

Page 30: CS61A Lecture 24

Compiling Java

cory [344] ~/javaexample # emacs HelloWorld.java &cory [346] ~/javaexample # javac HelloWorld.javacory [347] ~/javaexample # java HelloWorldhello worldcory [348] ~/javaexample # lsHelloWorld.java HelloWorld.class

30

Compile

Run

Makes an executabl

e file

Page 31: CS61A Lecture 24

Compilers

• Analyze syntax • Make something that can be run on a

computer• Provide optimization• Provide useful feedback to the programmer

when there are errors

31

Page 32: CS61A Lecture 24

Frames in MCE(below the line)

((x y) . (2 4))

or

((x y) 2 4 )

32

Globalx: 2y: 4

E1a: 5b: 7c: 3

((a b c) . (5 7 3))

or

((a b c) 5 7 3 )

(define (frame-variables frame)

(car frame))

(define (frame-values frame)

(cdr frame))

Page 33: CS61A Lecture 24

Environments(below the line)

List of frames! (define the-empty-environment '())

(extend-environment

'(x y) ;; vars

'(2 4) ;; vals

the-empty-environment) ;; base-env

(define (extend-environment vars vals base-env)

(cons

(make-frame vars vals)

base-env))

33

Error checking omitted

Page 34: CS61A Lecture 24

Environments(below the line)

List of frames! (define the-empty-environment '())

(extend-environment

'(x y) ;; vars

'(2 4) ;; vals

the-empty-environment) ;; base-env

34

car cdr

((x y).(1 2))

Globalx: 2y: 4

Frame

Environment

Page 35: CS61A Lecture 24

Environments (Below the line)

35

Globalx: 2y: 4

E1a: 5b: 7c: 3

car cdr

((x y).(1 2))

car cdr

((a b c).(5 7 3))