1 / 64

Lecture 16 The Environment Model

Lecture 16 The Environment Model. Substitution Model. Represents computation as doing substitutions for bound variables at reduction of let, application: let val x = v in e  e { v / x } (fn( x : t )=> e )( v )  e { v / x } let val x = fn z:’a=>z in x(x(x))

easter
Download Presentation

Lecture 16 The Environment Model

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Lecture 16The Environment Model

  2. Substitution Model • Represents computation as doing substitutions for bound variables at reduction of let, application: let val x = v in e e{v/x} (fn(x:t)=>e)(v) e{v/x} let val x = fn z:’a=>z in x(x(x)) end (fn z=>z)((fn z=>z)(fn z=>z))

  3. Problems • Not a realistic implementation: substitution is too slow (fn(x:t)=>e)(v) e{v/x} … could be many x’s to substitute for… • Doesn’t handle refs: no aliasing ref2? let val a = ref 2 in(fn(x,y)=>…x:=1…!y…) (a,a) end  (fn(x,y)=>…x:=1…!y…)(ref 2,ref 2) ? …(ref 2):=1…!(ref 2)… ?

  4. Environment Model Don’t substitute for variables; look them up lazily in an environment! • No substitution, realistic cost model • The environment is a finite map from variables to values • Example:let val x = 2 val y = “hello” val f = fn z:int=>xin f(x + size(y)) end Evaluate: f(x + size(y)) in environment: x: 2y: “hello”f: fn z:int=>x ?

  5. Variables • To evaluate a variable, look it up in the environment. To look it up, we start with the last binding added to the environment and then work towards the nil. • Evaluating “x” in this environment yields 3: nil x : 2 y : 4 x : 3 Blue boxes: bindings env z : 3

  6. Let expressions To evaluate let val x = e1 in e2: • Evaluate e1 in the current environment • Extend the current environment with a binding that maps x to the value of e1 • Evaluate e2 in the extended environment • Restore the old environment (i.e., remove the binding for x) • Return the value of e2

  7. Let Example let val x = (1,2) in #1 x end nil current env

  8. Let Example let val x = (1,2) in #1 x end 1. Evaluating (1,2) yields a pointer to a tuple in memory. 1 2 nil current env

  9. Let Example let val x = (1,2) in #1 x end 1. Evaluating (1,2) yields a pointer to a tuple in memory. 1 2 2. Extend the environment with a binding for x. x: current env nil current env

  10. Let Example let val x = (1,2) in #1 x end 1. Evaluating (1,2) yields a pointer to a tuple in memory. 1 2 2. Extend the environment with a binding for x. 3. Evaluate the body of the let in the new environment. x evaluates to a pointer to the tuple, so #1 x evaluates to the first component, namely 1. x: current env nil

  11. Let Example let val x = (1,2) in #1 x end 1. Evaluating (1,2) yields a pointer to a tuple in memory. 1 2 2. Extend the environment with a binding for x. 3. Evaluate the body of the let in the new environment. x evaluates to a pointer to the tuple, so #1 x evaluates to the first component, namely 1. x: current env current env 4. Restore the old environment. nil

  12. Let Example let val x = (1,2) in #1 x end 1. Evaluating (1,2) yields a pointer to a tuple in memory. 1 2 2. Extend the environment with a binding for x. 3. Evaluate the body of the let in the new environment. x evaluates to a pointer to the tuple, so #1 x evaluates to the first component, namely 1. x: current env 4. Restore the old environment. nil 5. Return the value we got: 1

  13. Pictorial Overview: • Primitive values like integers, reals, unit, or nil evaluate to themselves. • A tuple value, such as (1,2,3) evaluates to a pointer to a box in memory containing the values of the sub-expressions: 1 2 3

  14. Multiple Declarations To evaluate:let val x = e1 val y = e2 val z = e3 in e4 end Do the same the same thing as you would for:let val x = e1 in let val y = e2 in let val z = e3 in e4 end end end

  15. Example let val x = (3,4)in let val y = (x,x) in #1(#2 y) end end let val x = (3,4) val y = (x,x)in #1(#2 y)end current env nil

  16. Evaluation of Example let val x = (3,4)in let val y = (x,x) in #1(#2 y) end end let val x = (3,4) val y = (x,x)in #1(#2 y)end 3 4 current env nil

  17. Evaluation of Example let val x = (3,4)in let val y = (x,x) in #1(#2 y) end end let val x = (3,4) val y = (x,x)in #1(#2 y)end 3 4 current env x : current env nil

  18. Evaluation of Example let val x = (3,4)in let val y = (x,x) in #1(#2 y) end end let val x = (3,4) val y = (x,x)in #1(#2 y)end 3 4 current env x : nil

  19. Evaluation of Example let val x = (3,4)in let val y = (x,x) in #1(#2 y) end end let val x = (3,4) val y = (x,x)in #1(#2 y)end current env y : 3 4 current env x : nil

  20. Evaluation of Example let val x = (3,4)in let val y = (x,x) in #1(#2 y) end end let val x = (3,4) val y = (x,x)in #1(#2 y)end current env y : 3 4 x : nil

  21. Evaluation of Example let val x = (3,4)in let val y = (x,x) in #1(#2 y) end end let val x = (3,4) val y = (x,x)in #1(#2 y)end current env y : 3 4 x : Result : 3 nil

  22. Evaluation of Example let val x = (3,4)in let val y = (x,x) in #1(#2 y)end end let val x = (3,4) val y = (x,x)in#1(#2 y)end y : Restore last env 3 4 current env x : Result is 3 nil

  23. Evaluation of Example let val x = (3,4)in let val y = (x,x) in #1(#2 y) end end let val x = (3,4) val y = (x,x)in#1(#2 y)end y : 3 4 x : Restore original env Result is 3 current env nil

  24. Refs • To evaluate ref e, evaluate e to a value first, and then allocate a new ref cell, place the value in the ref cell, and return a pointer to the ref cell. For instance, ref (1,2,3)evaluates to: 1 2 3 ref cells = red boxes.

  25. Ref Example let val x = ref 2 in val y = x in x:=1; !y end 2 current env nil

  26. Ref Example let val x = ref 2 in val y = x in x:=1; !y end x : current env 2 nil

  27. Ref Example let val x = ref 2 in val y = x in x:=1; !y end x : current env 2 nil

  28. Ref Example let val x = ref 2 in val y = x in x:=1; !y end y : current env x : 2 nil

  29. Ref Example let val x = ref 2 in val y = x in x:=1; !y end y : current env x : 1 nil

  30. Ref Example let val x = ref 2 in val y = x in x:=1; !y end Result: 1 y : current env x : 1 nil

  31. Functions Static scope: ML, Java, Scheme, … Dynamic scope:Perl, Python, BASIC let val x = 2 val f = fn z:int => xinlet val x = “bye” in f(size(x)) end • How do we make sure the environment has the (correct) binding for x? • We must keep track of the environment at the point where the function was evaluated. • Function evaluation: fn z:int => x, not f(size(x)) • We create a closure • A pair of a function and its environment

  32. Functions • To evaluate a function(fn x => e)create a closure out of the function and the current environment and return a pointer to the closure. nil x : 2 y : 4 current env

  33. Creating closures • To evaluate a function (fn x => e)create a closure out of the function and the current environment and return a pointer to the closure. fn x => e nil x : 2 y : 4 current env I’ll draw closures using yellow. Result

  34. Function Example fn z:int => x x : 2 current env current env let val x = 2 val f = fn z:int => xinlet val x = “bye” in f(size(x)) end nil

  35. Function Example fn z:int => x x : 2 current env let val x = 2 val f = fn z:int => xinlet val x = “bye” in f(size(x)) end f: nil

  36. Function Example fn z:int => x x : 2 x : current env let val x = 2 val f = fn z:int => xinlet val x = “bye” in f(size(x)) end “bye” f: nil

  37. Function Example fn z:int => x x : 2 x : current env let val x = 2 val f = fn z:int => xinlet val x = “bye” inf(size(x)) end “bye” f: nil

  38. Function Calls To evaluate e1(e2): • evaluate e1 -- you should get a pointer to a closure. • evaluate e2 to a value. • save the current environment -- we’ll come back to it after the function call. • extend the environment of the closure, mapping the formal argument to the actual argument. • evaluate the body of the function within the extended environment -- this gives us our result value. • restore the old environment (saved in step 3) • return the result.

  39. Function Call Example fn z:int => x x : 2 x : current env let val x = 2 val f = fn z:int => xinlet val x = “bye” in f(size(x)) end 1. Evaluate e1, e2 “bye” f: nil

  40. Function Call Example fn z:int => x x : 2 x : saved env current env let val x = 2 val f = fn z:int => xinlet val x = “bye” in f(size(x)) end 1. Evaluate e1, e22. Save environ. “bye” f: nil

  41. Function Call Example x : 2 x : saved env let val x = 2 val f = fn z:int => xinlet val x = “bye” in f(size(x)) end 1. Evaluate e1, e22. Save environ.3. Extend env with actual “bye” f: fn z:int => x current env z : 3 nil

  42. Function Call Example x : 2 x : saved env let val x = 2 val f = fn z:int => xinlet val x = “bye” in f(size(x)) end 1. Evaluate e1, e22. Save environ.3. Extend env with actual 4. Evaluate body (result: 2) “bye” f: fn z:int => x current env z : 3 nil

  43. Function Call Example x : 2 x : current env let val x = 2 val f = fn z:int => xinlet val x = “bye” in f(size(x)) end 1. Evaluate e1, e22. Save environ.3. Extend env with actual 4. Evaluate body (result: 2) 5. Restore env. (result: 2) “bye” f: fn z:int => x nil

  44. Creating a cycle let val x = ref (fn x:int => x) val f = fn n:int => if n <= 1 then 1 else n * (!x)(n-1) in x := f; f(3) end nil current env

  45. Creating a cycle let val x = ref (fn x => x) val f = fn n => if n <= 1 then 1 else n * (!x)(n-1) in x := f; f(3) end fn x => x nil current env

  46. Creating a cycle let val x = ref (fn x => x) val f = fn n => if n <= 1 then 1 else n * (!x)(n-1) in x := f; f(3) end fn x => x nil current env

  47. Creating a cycle let val x = ref (fn x => x) val f = fn n => if n <= 1 then 1 else n * (!x)(n-1) in x := f; f(3) end current env x : fn x => x nil

  48. Creating a cycle let val x = ref (fn x => x) val f = fn n => if n <= 1 then 1 else n * (!x)(n-1) in x := f; f(3) end fn n => if n <= 1 then 1 else n * (!x)(n-1) current env x : fn x => x nil

  49. Creating a cycle fn x => x let val x = ref (fn x => x) val f = fn n => if n <= 1 then 1 else n * (!x)(n-1) in x := f; f(3) end fn n => if n <= 1 then 1 else n * (!x)(n-1) f : current env x : nil

  50. Creating a cycle fn x => x let val x = ref (fn x => x) val f = fn n => if n <= 1 then 1 else n * (!x)(n-1) in x := f; f(3) end fn n => if n <= 1 then 1 else n * (!x)(n-1) f : current env x : nil

More Related