C. Varela; Adapted from S. Haridi and P. Van Roy1 Declarative Programming Techniques Lazy Execution (VRH 4.5) Carlos Varela RPI Adapted with permission.

Slides:



Advertisements
Similar presentations
C. Varela; Adapted w/permission from S. Haridi and P. Van Roy1 Declarative Programming Techniques Accumulators, Difference Lists (VRH ) Carlos Varela.
Advertisements

ML Lists.1 Standard ML Lists. ML Lists.2 Lists  A list is a finite sequence of elements. [3,5,9] ["a", "list" ] []  ML lists are immutable.  Elements.
More about functions Plus a few random things. 2 Tail recursion A function is said to be tail recursive if the recursive call is the very last thing it.
C. Varela; Adapted w/permission from S. Haridi and P. Van Roy1 Declarative Computation Model From kernel to practical language (CTM 2.6) Exceptions (CTM.
0 PROGRAMMING IN HASKELL Chapter 12 – Lazy evaluation and infinite lists Slides not from Hutton.
C. Varela; Adapted w/permission from S. Haridi and P. Van Roy1 Declarative Computation Model Defining practical programming languages Carlos Varela RPI.
C. Varela; Adapted w/permission from S. Haridi and P. Van Roy1 Declarative Computation Model Memory management, Exceptions, From kernel to practical language.
מבוא מורחב - שיעור 15 1 Lecture 15 Streams. מבוא מורחב - שיעור 15 2 Streams: Motivation (define (sum-primes a b) (define (iter count accum) (cond ((>
C. Varela; Adapted w/permission from S. Haridi and P. Van Roy1 Declarative Computation Model Single assignment store Kernel language syntax Carlos Varela.
C. Varela; Adapted w/permission from S. Haridi and P. Van Roy1 Data Abstraction and State Abstract Data Types (3.7) State/Data Abstraction(6.1, 6.3, 6.4.1,
C. Varela; Adapted with permission from S. Haridi and P. Van Roy1 Oz, Declarative Concurrency, and Active Objects (VRH 4, 7.8) Carlos Varela RPI Adapted.
C. Varela; Adapted w. permission from S. Haridi and P. Van Roy1 Introduction to Programming Concepts Carlos Varela RPI Adapted with permission from: Seif.
Welcome to the CIS Seminar Laziness is good for you!
C. Varela; Adapted w/permission from S. Haridi and P. Van Roy1 Declarative Computation Model Kernel language semantics Carlos Varela RPI Adapted with permission.
C. Varela; Adapted from S. Haridi and P. Van Roy1 Object-Oriented Programming Active Objects (VRH 7.8) Carlos Varela RPI Adapted with permission from:
C. Varela; Adapted from S. Haridi and P. Van Roy1 Object-Oriented Programming Objects, Classes and Inheritance (VRH 7.1-4) Polymorphism (VRH 6.4.3) Carlos.
C. Varela; Adapted with permission from S. Haridi and P. Van Roy1 Declarative Concurrency (VRH4) Carlos Varela RPI Adapted with permission from: Seif Haridi.
C. Varela; Adapted w/permission from S. Haridi and P. Van Roy1 Declarative Computation Model Memory management, Exceptions, From kernel to practical language.
C. Varela; Adapted w/permission from S. Haridi and P. Van Roy1 Declarative Programming Techniques Non-declarative needs (VRH 3.8) Program design in the.
C. Varela; Adapted w/permission from S. Haridi and P. Van Roy1 Declarative Programming Techniques Declarativeness, iterative computation (VRH 3.1-2) Higher-order.
S. Haridi and P. Van Roy1 Declarative Concurrency Seif Haridi KTH Peter Van Roy UCL.
9/10/2015CS2104, Lecture 81 Programming Language Concepts, COSC Lecture 8 (Multiple) Threads Semantics.
Slides prepared by Rose Williams, Binghamton University ICS201 Lecture 19 : Recursion King Fahd University of Petroleum & Minerals College of Computer.
1 COMP313A Functional Programming (1). 2 Main Differences with Imperative Languages Say more about what is computed as opposed to how Pure functional.
C. Varela; Adapted w/permission from S. Haridi and P. Van Roy1 Declarative Computation Model Memory management (CTM 2.5) Carlos Varela RPI April 6, 2015.
S. Haridi and P. Van Roy1 Lazy Execution Seif Haridi KTH Peter Van Roy UCL.
Introduction to Programming (in C++) Loops Jordi Cortadella, Ricard Gavaldà, Fernando Orejas Dept. of Computer Science, UPC.
Advanced Functional Programming 2009 Ulf Norell (lecture by Jean-Philippe Bernardy)
C. Varela1 Programming Languages (CSCI 4430/6430) Part 1: Functional Programming: Summary Carlos Varela Rennselaer Polytechnic Institute September 29,
C. Varela; Adapted w. permission from S. Haridi and P. Van Roy1 Functional Programming: Lists, Pattern Matching, Recursive Programming (CTM Sections ,
COMP313A Functional Programming (1)
S. Haridi and P. Van Roy1 Introduction to Programming Seif Haridi KTH Peter Van Roy UCL.
Inside LINQ to Objects How LINQ to Objects work Inside LINQ1.
Lee CSCE 314 TAMU 1 CSCE 314 Programming Languages Haskell: More on Functions and List Comprehensions Dr. Hyunyoung Lee.
1 Lecture 4: Concurrency Per Brand. 2 Threads and the store Store f Thread 1Thread 2Thread 3 Thread 4 ‘|’ Two runnable and two suspended threads Execution.
C. Varela1 Logic Programming (CTM ) Constraint Programming: Constraints and Computation Spaces Carlos Varela Rennselaer Polytechnic Institute.
C. Varela1 Logic Programming (PLP 11, CTM 9.3) Prolog Imperative Control Flow: Backtracking, Cut, Fail, Not Lists, Append Carlos Varela Rennselaer Polytechnic.
CS321 Functional Programming 2 © JAS Programming with Streams A stream is never finite and could be defined as special polymorphic type data stream.
Advanced Functional Programming 2010
Higher-Order Programming: Iterative computation (CTM Section 3
Functional Programming
Functional Programming: Lists, Pattern Matching, Recursive Programming (CTM Sections , 3.2, , 4.7.2) Carlos Varela RPI September 12,
Carlos Varela Rennselaer Polytechnic Institute September 27, 2016
6.001 SICP Variations on a Scheme
Higher-Order Programming: Iterative computation (CTM Section 3
Carlos Varela RPI September 22, 2017 Adapted with permission from:
Declarative Programming Techniques Accumulators (CTM 3. 4
Closures and Streams cs784(Prasad) L11Clos
Carlos Varela Rensselaer Polytechnic Institute November 17, 2017
Carlos Varela Rensselaer Polytechnic Institute December 5, 2017
Declarative Computation Model Kernel language semantics (Non-)Suspendable statements (VRH ) Carlos Varela RPI October 11, 2007 Adapted with.
Declarative Programming Techniques Declarativeness, iterative computation (CTM ) Higher-order programming (CTM 3.6) Abstract data types (CTM.
Streams Sections 3.5.1,3.5.2 Pages
Objective caml Daniel Jackson MIT Lab for Computer Science 6898: Advanced Topics in Software Design March 18, 2002.
Object-Oriented Programming Encapsulation Control/Visibility (VRH 7. 3
Iteration Implemented through loop constructs (e.g., in C++)
Higher-Order Programming: Closures, procedural abstraction, genericity, instantiation, embedding. Control abstractions: iterate, map, reduce, fold, filter.
Declarative Concurrency (CTM 4)
CSCE 314: Programming Languages Dr. Dylan Shell
Delayed Evaluation Special forms in Scheme (e.g., if and cond) do not use applicative order evaluation Only one of two or more expressions is actually.
Declarative Programming Techniques Accumulators (CTM 3. 4
Lazy Programming Lazy evaluation:
CSE 3302 Programming Languages
Introduction to Programming Concepts (VRH )
Declarative Computation Model Single assignment store (VRH 2
Introduction to Programming Concepts
Declarative Programming Techniques Accumulators (CTM 3. 4
Carlos Varela Rennselaer Polytechnic Institute November 15, 2016
Presentation transcript:

C. Varela; Adapted from S. Haridi and P. Van Roy1 Declarative Programming Techniques Lazy Execution (VRH 4.5) Carlos Varela RPI Adapted with permission from: Seif Haridi KTH Peter Van Roy UCL

C. Varela; Adapted from S. Haridi and P. Van Roy2 Overview What is declarativeness? –Classification, advantages for large and small programs Control Abstractions –Iterative programs Higher-order programming –Basic operations, loops, data-driven techniques, laziness, currying Modularity and non-declarative needs –File and window I/O, large-scale program structure Limitations and extensions of declarative programming Lazy Evaluation

C. Varela; Adapted from S. Haridi and P. Van Roy3 Lazy evaluation The functions written so far are evaluated eagerly (as soon as they are called) Another way is lazy evaluation where a computation is done only when the result is needed declare fun lazy {Ints N} N|{Ints N+1} end Calculates the infinite list: 0 | 1 | 2 | 3 |...

C. Varela; Adapted from S. Haridi and P. Van Roy4 Lazy evaluation (2) Write a function that computes as many rows of Pascal’s triangle as needed We do not know how many beforehand A function is lazy if it is evaluated only when its result is needed The function PascalList is evaluated when needed fun lazy {PascalList Row} Row | { PascalList {AddList Row {ShiftRight Row}}} end

C. Varela; Adapted from S. Haridi and P. Van Roy5 Lazy evaluation (3) Lazy evaluation will avoid redoing work if you decide first you need the 10 th row and later the 11 th row The function continues where it left off declare L = {PascalList [1]} {Browse L} {Browse L.1} {Browse L.2.1} L [1] [1 1]

C. Varela; Adapted from S. Haridi and P. Van Roy6 Lazy execution Without lazyness, the execution order of each thread follows textual order, i.e., when a statement comes as the first in a sequence it will execute, whether or not its results are needed later This execution scheme is called eager execution, or supply-driven execution Another execution order is that a statement is executed only if its results are needed somewhere in the program This scheme is called lazy evaluation, or demand-driven evaluation

C. Varela; Adapted from S. Haridi and P. Van Roy7 Example B = {F1 X} C = {F2 Y} D = {F3 Z} A = B+C Assume F1, F2 and F3 are lazy functions (see Haskell) B = {F1 X} and C = {F2 Y} are executed only if and when their results are needed in A = B+C D = {F3 Z} is not executed since it is not needed

C. Varela; Adapted from S. Haridi and P. Van Roy8 Example In lazy execution, an operation suspends until its result are needed The suspended operation is triggered when another operation needs the value for its arguments In general multiple suspended operations could start concurrently B = {F1 X}C = {F2 Y} A = B+C Demand

C. Varela; Adapted from S. Haridi and P. Van Roy9 Example II In data-driven execution, an operation suspends until the values of its arguments results are available In general the suspended computation could start concurrently B = {F1 X}C = {F2 Y} A = B+C Data driven

C. Varela; Adapted from S. Haridi and P. Van Roy10 Using Lazy Streams fun {Sum Xs A Limit} if Limit>0 then case Xs of X|Xr then {Sum Xr A+X Limit-1} end else A end end local Xs S in Xs={Ints 0} S={Sum Xs } {Browse S} end

C. Varela; Adapted from S. Haridi and P. Van Roy11 How does it work? fun {Sum Xs A Limit} if Limit>0 then case Xs of X|Xr then {Sum Xr A+X Limit-1} end else A end end fun lazy {Ints N} N | {Ints N+1} end local Xs S in Xs = {Ints 0} S={Sum Xs } {Browse S} end

C. Varela; Adapted from S. Haridi and P. Van Roy12 Improving throughput Use a lazy buffer It takes a lazy input stream In and an integer N, and returns a lazy output stream Out When it is first called, it first fills itself with N elements by asking the producer The buffer now has N elements filled Whenever the consumer asks for an element, the buffer in turn asks the producer for another element

C. Varela; Adapted from S. Haridi and P. Van Roy13 The buffer example producerbufferconsumer N producerbufferconsumer N

C. Varela; Adapted from S. Haridi and P. Van Roy14 The buffer fun {Buffer1 In N} End={List.drop In N} fun lazy {Loop In End} In.1|{Loop In.2 End.2} end in {Loop In End} end Traversing the In stream, forces the producer to emit N elements

C. Varela; Adapted from S. Haridi and P. Van Roy15 The buffer II fun {Buffer2 In N} End = thread {List.drop In N} end fun lazy {Loop In End} In.1|{Loop In.2 End.2} end in {Loop In End} end Traversing the In stream, forces the producer to emit N elements and at the same time serves the consumer

C. Varela; Adapted from S. Haridi and P. Van Roy16 The buffer III fun {Buffer3 In N} End = thread {List.drop In N} end fun lazy {Loop In End} E2 = thread End.2 end In.1|{Loop In.2 E2} end in {Loop In End} end Traverse the In stream, forces the producer to emit N elements and at the same time serves the consumer, and requests the next element ahead

C. Varela; Adapted from S. Haridi and P. Van Roy17 Larger Example: The Sieve of Eratosthenes Produces prime numbers It takes a stream 2...N, peals off 2 from the rest of the stream Delivers the rest to the next sieve Sieve FilterSieve Xs Xr X Ys Zs X|Zs

C. Varela; Adapted from S. Haridi and P. Van Roy18 Lazy Sieve fun lazy {Sieve Xs} X|Xr = Xs in X | {Sieve {LFilter Xr fun {$ Y} Y mod X \= 0 end }} end fun {Primes} {Sieve {IntsFrom 2}} end

C. Varela; Adapted from S. Haridi and P. Van Roy19 Lazy Filter For the Sieve program we need a lazy filter fun lazy {LFilter Xs F} case Xs of nil then nil [] X|Xr then if {F X} then X|{LFilter Xr F} else {LFilter Xr F} end end

C. Varela; Adapted from S. Haridi and P. Van Roy20 Define streams implicitly Ones = 1 | Ones Infinite stream of ones 1 cons Ones

C. Varela; Adapted from S. Haridi and P. Van Roy21 Define streams implicitly Xs = 1 | {LMap Xs fun {$ X} X+1 end} What is Xs ? 1 cons +1 Xs?

C. Varela; Adapted from S. Haridi and P. Van Roy22 The Hamming problem Generate the first N elements of stream of integers of the form: 2 a 3 b 5 c with a,b,c  0 (in ascending order) *3*2 *5

C. Varela; Adapted from S. Haridi and P. Van Roy23 The Hamming problem Generate the first N elements of stream of integers of the form: 2 a 3 b 5 c with a,b,c  0 (in ascending order) *3*2 *5 Merge

C. Varela; Adapted from S. Haridi and P. Van Roy24 The Hamming problem Generate the first N elements of stream of integers of the form: 2 a 3 b 5 c with a,b,c  0 (in ascending order) *3*2 *5 Merge 1 cons H

C. Varela; Adapted from S. Haridi and P. Van Roy25 Lazy File Reading fun {ToList FO} fun lazy {LRead} L T in if {File.readBlock FO L T} then T = {LRead} else T = nil {File.close FO} end L end {LRead} end This avoids reading the whole file in memory

C. Varela; Adapted from S. Haridi and P. Van Roy26 List Comprehensions Abstraction provided in lazy functional languages that allows writing higher level set-like expressions In our context we produce lazy lists instead of sets The mathematical set expression –{x*y | 1  x  10, 1  y  x} Equivalent List comprehension expression is –[X*Y | X = ; Y = 1..X] Example: –[1*1 2*1 2*2 3*1 3*2 3* *10]

C. Varela; Adapted from S. Haridi and P. Van Roy27 List Comprehensions The general form is [ f(x,y,...,z) | x  gen(a1,...,an) ; guard(x,...) y  gen(x, a1,...,an) ; guard(y,x,...).... ] No linguistic support in Mozart/Oz, but can be easily expressed

C. Varela; Adapted from S. Haridi and P. Van Roy28 Example 1 z = [x#x | x  from(1,10)] Z = {LMap {LFrom 1 10} fun{$ X} X#X end} z = [x#y | x  from(1,10), y  from(1,x)] Z = { LFlatten {LMap {LFrom 1 10} fun{$ X} {LMap {LFrom 1 X} fun {$ Y} X#Y end } end } }

C. Varela; Adapted from S. Haridi and P. Van Roy29 Example 2 z = [x#y | x  from(1,10), y  from(1,x), x+y  10] Z ={LFilter { LFlatten {LMap {LFrom 1 10} fun{$ X} {LMap {LFrom 1 X} fun {$ Y} X#Y end } end } } fun {$ X#Y} X+Y=<10 end} }

C. Varela; Adapted from S. Haridi and P. Van Roy30 Implementation of lazy execution  s  ::= skip empty statement |... | thread  s 1  end thread creation |{ByNeed fun {$}  e  end  x  } by need statement The following defines the syntax of a statement,  s  denotes a statement zero arity function variable

C. Varela; Adapted from S. Haridi and P. Van Roy31 Implementation some statement fxfx {ByNeed fun {$}  e  end X,E } stack store A function value is created in the store (say f) the function f is associated with the variable x execution proceeds immediately to next statement f

C. Varela; Adapted from S. Haridi and P. Van Roy32 Implementation some statement f x : f {ByNeed fun {$}  e  end X,E } stack store A function value is created in the store (say f) the function f is associated with the variable x execution proceeds immediately to next statement f ( fun {$}  e  end X,E)

C. Varela; Adapted from S. Haridi and P. Van Roy33 Accessing the ByNeed variable X = {ByNeed fun{$} 111*111 end} (by thread T0) Access by some thread T1 –if X > 1000 then {Browse hello#X} end or –{Wait X} –Causes X to be bound to (i.e. 111*111)

C. Varela; Adapted from S. Haridi and P. Van Roy34 Implementation Thread T1 1.X is needed 2.start a thread T2 to execute F (the function) 3.only T2 is allowed to bind X Thread T2 1.Evaluate Y = {F} 2.Bind X the value Y 3.Terminate T2 4.Allow access on X

C. Varela; Adapted from S. Haridi and P. Van Roy35 Lazy functions fun lazy {From N} N | {From N+1} end fun {From N} fun {F} N | {From N+1} end in {ByNeed F} end

C. Varela; Adapted from S. Haridi and P. Van Roy36 Exercises Write a lazy append list operation LazyAppend. Can you also write LazyFoldL? Why or why not? Exercise VRH (pg 339) Exercise VRH (pg 341) Exercise VRH (pg 342) Exercise VRH (pg 342) Read VRH Sections 6.4.3, 7.1 and 7.2