laziness by need
play

Laziness By Need Stephen Chang Northeastern University 3/19/2013 - PowerPoint PPT Presentation

Laziness By Need Stephen Chang Northeastern University 3/19/2013 ESOP 2013, Rome, Italy the most powerful tool for modularization the key to successful programming [Hughes90] Laziness is great. pragmatically important because


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

  2. “the most powerful tool for modularization … the key to successful programming” [Hughes90] Laziness is great. “pragmatically important because it enables the producer-consumer programming style” [HM76] ... Valid?

  3. “lazy programs can “monumentally difficult exhibit astonishing to reason about time” poor space behavior” [Harper11] [HHPJW07] Or is it? “in a lazy language, it’s much more difficult to predict the order of evaluation” [PJ11]

  4. I want the good without the bad.

  5. Solution: strict + lazy (when needed) via static analysis

  6. “languages should support both strict and lazy” [PJ2011] Combining lazy and strict has been done? “The question is: What’s the default? How easy is it to get the other? How do you mix them together?”

  7. Previous Approaches • Lenient evaluation: Id, pH [Nikhil91, NAH+95] • Eager Haskell [Maessen02] Adds strictness to lazy languages. All • Optimistic Evaluation [EPJ03] • Strictness analysis [Mycroft1981, BHA86, CPJ85] • Cheap Eagerness [Faxen00]

  8. How do real-world lazy programmers add strictness?

  9. seq

  10. “both before and after “most thunks are optimization, most unnecessary” thunks are evaluated” [EPJ03] [Faxen00] What about adding laziness to strict languages? “most Id90 programs “in our corpus of R require neither programs … the functional nor average evaluation conditional rate of promises is non-strictness” 90%” [SG95] [MHOV12]

  11. lenient lazy strict evaluation + + lazy strictness laziness + analysis by need optimistic evaluation strict lazy languages languages more laziness (placements not exact)

  12. Strict languages already have laziness

  13. So what’s the problem? • Lazy data structures are not enough. • Lazy annotations are hard to get right. • Laziness is a global property!

  14. Same Fringe Two binary trees have the same fringe if they have exactly the same leaves, reading from left to right. 0 1 1 2 ... ... 5,000,001 5,000,000 samefringe tree1 tree2 = ( flatten tree1) == ( flatten tree2)

  15. Same Fringe A (Tree X) is either a: - Leaf X - Node (Tree X) (Tree X) flatten t = flat t [] flat ( Leaf x) acc = x::acc flat ( Node t1 t2) acc = flat t1 ( flat t2 acc)

  16. Same Fringe (eager) let tree2 = let tree1 = 0 1 1 2 ... ... 5,000,001 5,000,000 samefringe tree1 tree2 => false 0m13.363s

  17. Same Fringe (with streams) A (Stream X) is either a: - Nil - Lcons X $ (Stream X)

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

  19. Same Fringe (with streams) streameq $ Nil $ Nil = true streameq $ ( Lcons x1 xs1) $ ( Lcons x2 xs2)= x1==x2 && streameq xs1 xs2 streameq _ _ = false

  20. Same Fringe (with streams) samefringe tree1 tree2 = streameq $ ( flatten tree1) $ ( flatten tree2) samefringe tree1 tree2 => false 0m17.277s (with lazy trees) 0m36.905s

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

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

  23. Same Fringe (properly lazy) samefringe tree1 tree2 => false 0m0.002s

  24. 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 . . .

  25. lcons x y ≡ cons x $y 5s 30s

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

  27. control flow analysis + laziness flow analysis

  28. control flow analysis + laziness flow analysis

  29. arguments that reach a lazy construct arguments that reach a strict context expressions to force

  30. Transformation • Delay all • Force all

  31. Abstract value tracks flow of functions arguments.

  32. Analysis specified with rules: Read: Sets approximate expression if and only if constraints hold.

  33. strict contexts contexts where a thunk should not appear examples : – arguments to primitives – if test expression – function position in an application

  34. We used our tool … … and found some bugs.

  35. 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.

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend