Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University...

39
Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

Transcript of Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University...

Page 1: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

Laziness By Need

Stephen ChangNortheastern University

3/19/2013

ESOP 2013, Rome, Italy

Page 2: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

Laziness is great.

“pragmatically important because it enables the producer-consumer programming style”

[HM76]

“the most powerful tool for modularization … the key to successful programming”

[Hughes90]

... Valid?

Page 3: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

Or is it?

“in a lazy language, it’s much more difficult to predict the order of evaluation”

[PJ11]

“lazy programs can exhibit astonishing poor space behavior”

[HHPJW07]

“monumentally difficult to reason about time”

[Harper11]

Page 4: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

I want the good without the bad.

Page 5: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

Solution: strict + lazy(when needed)

via static analysis

Page 6: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

“languages should support both strict and lazy”

[PJ2011]

“The question is:What’s the default?

How easy is it to get the other?How do you mix them together?”

Combining lazy and strict has been done?

Page 7: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

Previous Approaches

• Lenient evaluation: Id, pH [Nikhil91, NAH+95]

• Eager Haskell [Maessen02]

• Optimistic Evaluation [EPJ03]

• Strictness analysis [Mycroft1981, BHA86, CPJ85]

• Cheap Eagerness [Faxen00]

All Adds strictness to lazy languages.

Page 8: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

How do real-world lazy programmers add

strictness?

Page 9: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

seq

Page 10: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

What about adding laziness to strict languages?

“most thunks are unnecessary”[EPJ03]

“both before and after optimization, most thunks are evaluated”

[Faxen00]

“most Id90 programs require neither functional nor conditionalnon-strictness”

[SG95]

“in our corpus of R programs … the average evaluation rate of promises is

90%”[MHOV12]

Page 11: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

strictlanguages

lazylanguages

lazy+

strictnessanalysis

lazy+

optimisticevaluation

strict+

lazinessby need

more laziness (placements not exact)

lenientevaluation

Page 12: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

Strict languages already have laziness

Page 13: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

So what’s the problem?

• Lazy data structures are not enough.

• Lazy annotations are hard to get right.

• Laziness is a global property!

Page 14: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

Same FringeTwo binary trees have the same fringe if they have exactly the same leaves, reading from left to right.

samefringe tree1 tree2 =

(flatten tree1) == (flatten tree2)

1

2

5,000,001...

0

1

5,000,000...

Page 15: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

Same Fringe

flat (Leaf x) acc = x::acc

flat (Node t1 t2) acc = flat t1 (flat t2 acc)

flatten t = flat t []

A (Tree X) is either a:- Leaf X- Node (Tree X) (Tree X)

Page 16: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

Same Fringe (eager)

1

2

5,000,001...

0

1

5,000,000...

let tree1 = let tree2 =

samefringe tree1 tree2 => false

0m13.363s

Page 17: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

Same Fringe (with streams)

A (Stream X) is either a:- Nil- Lcons X $(Stream X)

Page 18: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

Same Fringe (with streams)

flatten t = flat t Nil

flat (Leaf x) acc = Lcons x $acc

flat (Node t1 t2) acc = flat t1 (flat t2 acc)

Page 19: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

Same Fringe (with streams)

streameq $Nil $Nil = true

streameq $(Lcons x1 xs1) $(Lcons x2 xs2)=

x1==x2 && streameq xs1 xs2

streameq _ _ = false

Page 20: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

Same Fringe (with streams)

samefringe tree1 tree2 => false

0m17.277s

samefringe tree1 tree2 =

streameq $(flatten tree1) $(flatten tree2)

(with lazy trees)0m36.905s

Page 21: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

Same Fringe (naïvely lazy)

flatten t = flat t Nil

flat (Leaf x) acc = Lcons x $acc

flat (Node t1 t2) acc = flat t1 (flat t2 acc)

Page 22: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

Same Fringe (properly lazy)

flatten t = flat t Nil

flat (Leaf x) acc = Lcons x $acc

flat (Node t1 t2) acc = flat t1 $(flat t2 acc)

Page 23: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

Same Fringe (properly lazy)

samefringe tree1 tree2 => false

0m0.002s

Page 24: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

Takeaway

• Using lazy data structures is not enough.

• Additional annotations are needed but can be tricky.

• If only there was a tool that could help with the process . . .

Page 25: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

lcons x y

cons x $y

30s 5s

Page 26: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

Same Fringe (naïvely lazy)

flatten t = flat t Nil

flat (Leaf x) acc = Lcons x $acc

flat (Node t1 t2) acc = flat t1 (flat t2 acc)

Page 27: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

control flow analysis

+

laziness flow analysis

Page 28: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

control flow analysis

+

laziness flow analysis

Page 29: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

arguments that reach a lazy construct

arguments that reach a strict context

expressions to force

Page 30: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

Transformation

• Delay all

• Force all

Page 31: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

Abstract value

tracks flow of functions arguments.

Page 32: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

Read: Sets

if and only if constraints

approximate expression

Analysis specified with rules:

hold.

Page 33: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy
Page 34: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy
Page 35: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy
Page 36: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

examples:

– arguments to primitives

– if test expression

– function position in an application

strict contextscontexts where a thunk should not appear

Page 37: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy
Page 38: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

We used our tool …

… and found some bugs.

Page 39: Laziness By Need · 2020. 9. 4. · Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy

Conclusions

• Get the benefits of laziness by starting strict and adding laziness by need.

• A flow-analysis-based tool can help in adding laziness to strict programs.

Thanks.