CS61A Lecture 24

Post on 08-Jan-2016

45 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

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

CS61A Lecture 24

2011-08-01Colleen Lewis

1

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

Goals

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

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

3

mce review

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

4

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

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

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

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

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

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

(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)

(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)

(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)

(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)

(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

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)

analyze

analyzeList

representing expression

STK Scheme expression(λ(env)

17

(define (mc-eval exp env)

((analyze exp) env))

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))

(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

(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)

(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

(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

(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

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

(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

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

(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

(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)

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

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

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

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))

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

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

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))

top related