210 likes | 227 Views
Simple Concurrent Object-Oriented Programming. Nati Fuks. SCOOP Outline. SCOOP Introduction. Generator. SCOOP vs Java. PRODUCER-CONSUMER example. SCOOP Semantics. Mapping from SCOOP to Eiffel+THREADs. Concurrency. Concurrent programming is difficult e.g. Java Memory Flaw circa 1999
E N D
SCOOP Outline • SCOOP Introduction • Generator • SCOOP vs Java • PRODUCER-CONSUMER example • SCOOP Semantics • Mapping from SCOOP to Eiffel+THREADs
Concurrency • Concurrent programming is difficult • e.g. Java Memory Flaw circa 1999 • A variety of mechanisms must be mastered • Thread class, synchronize, wait, notify, mutexes, monitor, critical regions • Problems such as deadlock, safety and liveness properties, inheritance anomaly
SCOOP A single new keyword (separate) provides for a full-fledged concurrency mechanism !!!
SCOOP SCOOP: Simple Concurrent Object-Oriented Programming. Defined by Bertrand Meyer in OOSC in 1997 • Compton. Changes in the open source SmallEiffel compiler Implementations: • 2. This work • 3. SCOOP in the .NET framework
SCOOP Generator Why SCOOP Generator? Object-Oriented Design Design By Contract Simple and intuitive concurrency model of SCOOP What do we achieve? Concurrent programs using SCOOP
SCOOP Generator • Eiffel SCOOP -> Eiffel + THREAD • Standard Eiffel code (mutexes and THREADs) • Eiffel Studio 5.4 Advantages • Pure Eiffel • Independence • Target code is cross-platform Disadvantage – Debugging on a target code
Producer-Consumer SCOOP Solution - same behaviour as the Java solution - only one extra keyword separate is used (||) - uses contracts with all the benefits of DbC
ROOT_CLASS class ROOT_CLASS creation make feature b: separate BUFFER p: PRODUCER -- declared separate c: CONSUMER -- declared separate makeis -- Creation procedure. do create b.make create p.make(b) create c.make(b) end end
Bounded BUFFER class BUFFER creation make feature put (x:INTEGER) is require count <= 3 do q.put(x) ensure count = old count + 1 and q.has (x) end removeis require count > 0 do q.remove ensure count = old count - 1 end …
PRODUCER separateclass PRODUCER creation make feature buffer: separate BUFFER make (b: separate BUFFER) is do …keep_producing … end keep_producingisdo … produce(buffer,i) … end produce (b : separate BUFFER; i:INTEGER) is require b.count <= 2 do b.put(i) ensureb.has(i) end end
CONSUMER separateclass CONSUMER creation make feature buffer: separate BUFFER make (b: separate BUFFER) is do …keep_consuming… end keep_consumingis do …consume(buffer)… end consume (b: separate BUFFER) is require b.count > 0 do b.remove ensureb.count = old b.count - 1 end end
Synchronization in SCOOP A call to the routineproduce with a separate will block until: (a) the producer gets sole access to the buffer + (b) the buffer must not be full as indicated in the precondition
Preconditions in SCOOP ifnot buffer.full then buffer.put(value) • produce (b: separate BUFFER; i: INTEGER) isrequire b.count <= 2 • i >= 0do b.put (i)end
Mapping to Eiffel + THREAD class ROOT_CLASS inherit THREAD_CONTROL separate class ROOT_CLASS feature feature request_pended: INTEGER_REF requests_pended_mutex:MUTEX b:separateBUFFER p:PRODUCER b:BUFFER b_mutex: MUTEX p:PRODUCER
Mapping to Eiffel 2 make is do requests_pended := 1 make is do createb.make b_mutex.lock create b.make b_mutex.unlock
Mapping to Eiffel 3 create p.make (b, b_mutex, requests_pended, requests_pended_mutex) create p.make (b) p.launch set_feature_to_do ([Current, "KEEP_PRODUCING_ROUTINE"])
Mapping to Eiffel 4 same as p.make… create c.make (b) requests_pended_mutex.lock requests_pended.copy(requests_pended-1) requests_pended_mutex.unlock end join_all end
Contributions • Analysis of Meyer’s SCOOP with a view to implementation – semantics of SCOOP via Compton’s subsystems • Based on the semantics of SCOOP – provided a mapping from SCOOP to Eiffel + Threads. • Generator parses SCOOP programs, flags syntax errors and automatically translates to portable executable code based on the mapping. • First full implementation of SCOOP • contracts • routine calls with multiple separate objects