340 likes | 349 Views
Explore the features and benefits of Multilisp, a dialect of the Scheme language that supports concurrent functional programming. Discover how Multilisp offers explicit concurrency constructs, minimal additional syntax, and maximum flexibility for parallel function application.
E N D
Ed Walters and Tim Richards University of Massachusetts Amherst Multilisp: Concurrent Functional Programming
Overview What is Multilisp? Overview of Scheme Features of Multilisp Where is Multilisp Now?
Overview What is Multilisp? Overview of Scheme Features of Multilisp Where is Multilisp Now?
What is Multilisp? Dialect of Scheme language Functional Programming Limited Side-effects Garbage Collection Extensions for Concurrency Parallel Function Application Futures Reference: R. Halstead, TOPLAS, Vol. 7, No. 4, 1985.
Goal of Multilisp Explicit Constructs for Concurrency Adhere to Scheme Philosophy No Additional Syntax Minimal Additional Semantics Maximum Flexibility Granularity Backwards-compatibility
Overview What is Multilisp? Overview of Scheme Features of Multilisp Where is Multilisp Now?
The Scheme Language Descendent of Lisp (LISt Processing) Created by Steele and Sussman (1975) Important Features: Extended Lambda Calculus Lexical Scoping Functions are first-class
Important Terms Expression: Basic unit of Scheme code (e.g., List or integer) Evaluation: Scheme expressions evaluate to a value upon execution Application: Function call on a list, i.e. apply first element to rest of list (f a b c) => f(a, b, c)
Brief Scheme Syntax Function definition (define f (lambda (x) … )) Function application (f x) Conditionals (if x y z) Symbols and Atomic Elements ‘x, 3
Scheme Example: Fib (define fib (lambda (x) (if (= x 1) 1 (if (= x 2) 2 (+ (fib (- x 1)) (fib (- x 2))))))) (fib 10) => 89
Scheme Example: Fib (define fib (lambda (x) (if (= x 1) 1 (if (= x 2) 2 (+ (fib (- x 1)) (fib (- x 2))))))) (fib 10) => 89
Scheme Example: Fib (define fib (lambda (x) (if (= x 1) 1 (if (= x 2) 2 (+ (fib (- x 1)) (fib (- x 2))))))) (fib 10) => 89
Scheme Example: Fib (define fib (lambda (x) (if (= x 1) 1 (if (= x 2) 2 (+ (fib (- x 1)) (fib (- x 2))))))) (fib 10) => 89
Scheme Example: Fib (define fib (lambda (x) (if (= x 1) 1 (if (= x 2) 2 (+ (fib (- x 1)) (fib (- x 2))))))) (fib 10) => 89
Scheme Example: Fib (define fib (lambda (x) (if (= x 1) 1 (if (= x 2) 2 (+ (fib (- x 1)) (fib (- x 2))))))) (fib 10) => 89
Scheme Example: Fib (define fib (lambda (x) (if (= x 1) 1 (if (= x 2) 2 (+ (fib (- x 1)) (fib (- x 2))))))) (fib 10) => 89
Overview What is Multilisp? Overview of Scheme Features of Multilisp Where is Multilisp Now?
Parallel Calls pcall: Parallel function application Syntax: (pcall F A B C) Semantics: Evaluate F, A, B, C in parallel Apply F to A, B, C (F A B C)
Parallel Calls: Example (define div-and-conq (lambda (x) (if (base-case x) x (pcall combine-results (div-and-conq (- x 1)) (div-and-conq (- x 5))))))
Parallel Calls: Example (define div-and-conq (lambda (x) (if (base-case x) x (pcall combine-results (div-and-conq (- x 1)) (div-and-conq (- x 5))))))
Parallel Calls: Example (define div-and-conq (lambda (x) (if (base-case x) x (pcall combine-results (div-and-conq (- x 1)) (div-and-conq (- x 5))))))
Parallel Calls: Example (define div-and-conq (lambda (x) (if (base-case x) x (pcall combine-results (div-and-conq (- x 1)) (div-and-conq (- x 5))))))
Parallel Calls: Example (define div-and-conq (lambda (x) (if (base-case x) x (pcall combine-results (div-and-conq (- x 1)) (div-and-conq (- x 5))))))
Futures future: contract to deliver parallel computation Syntax: (future <exp>) Semantics: Evaluate <exp> concurrently with calling program Return reference to future immediately Block if value of <exp> is required
Futures: Example (define fib (lambda (x) (if (= x 1) 1 (if (= x 2) 2 (+ (future (fib (- x 1))) (future (fib (- x 2)))) )))) (fib 10) => 89
Futures: Example (define fib (lambda (x) (if (= x 1) 1 (if (= x 2) 2 (+ (future (fib (- x 1))) (future (fib (- x 2)))) )))) (fib 10) => 89
Futures: Example (define fib (lambda (x) (if (= x 1) 1 (if (= x 2) 2 (+ (future (fib (- x 1))) (future (fib (- x 2)))) )))) (fib 10) => 89
Futures: Example (define fib (lambda (x) (if (= x 1) 1 (if (= x 2) 2 (+ (future (fib (- x 1))) (future (fib (- x 2)))) )))) (fib 10) => 89
Futures: Example (define fib (lambda (x) (if (= x 1) 1 (if (= x 2) 2 (+ (future (fib (- x 1))) (future (fib (- x 2)))) )))) (fib 10) => 89
More Details pcall can be implemented using future Facilitates multiple concurrent programming paradigms: Cilk-style Message Passing Futures somewhat resemble Lazy Evaluation Evaluation delayed but guaranteed No infinite data structures
Implementation Notes Each future/pcall element is a thread pcall fork/join parallelism future asynchronous thread block on read
Overview What is Multilisp? Overview of Scheme Features of Multilisp Where is Multilisp Now?
Where is Multilisp Now? No current Scheme compilers implement futures We had to implement our own interpreter! However: THEY LIVE on in Java! Transparent Proxies for Java Futures, Pratikakis, Spacco, and Hicks, OOPSLA 2004. Safe Futures for Java, Welc, Jagannathan, and Hosking, OOPSLA 2005.
Conclusion Like much of the Scheme World: Elegant, Flexible Solution Deader than a Doornail Not Java