27
Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming » June 18, 2001 Workshop on Multiparadigm Programming with OO Languages (MPOOL) European Conference on Object-Oriented Programming (ECOOP) Peter Van Roy UCL, Louvain-la-Neuve, Belgium SICS, Stockholm, Sweden Seif Haridi KTH + SICS, Stockholm, Sweden

Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

  • Upload
    leona

  • View
    33

  • Download
    1

Embed Size (px)

DESCRIPTION

Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming ». June 18, 2001 Workshop on Multiparadigm Programming with OO Languages (MPOOL) European Conference on Object-Oriented Programming (ECOOP) Peter Van Roy UCL, Louvain-la-Neuve, Belgium - PowerPoint PPT Presentation

Citation preview

Page 1: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Extracts from the upcoming book« Concepts, Techniques, and Models of

Computer Programming »

June 18, 2001Workshop on Multiparadigm Programming with OO Languages (MPOOL)

European Conference on Object-Oriented Programming (ECOOP)

Peter Van RoyUCL, Louvain-la-Neuve, Belgium

SICS, Stockholm, Sweden

Seif HaridiKTH + SICS, Stockholm, Sweden

Page 2: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Overview• Context of the book

– Computer science education– Multiple programming « paradigms »– Comprehensive treatment of programming techniques– Students should be taught concepts as well as languages

• Three illustrative examples– To show what can be gained by bringing concepts up front

• Concurrency made easy• User interface design made easy• Uses and limits of declarative programming

• Conclusions– We will be teach-testing the book next fall

Page 3: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Context• The current trend in CS education is to restrict the student to one or

two programming paradigms• The most extreme case is where a single rather complex paradigm,

object-oriented programming, and a single language, Java, are used as a general-purpose approach to solve all problems

• The purpose of the book is to be a counterweight to this trend. We want to teach programming concepts, not limited to languages, to show programming in its full richness.

• The book can be described as a successor to « Structure and Interpretation of Computer Programs » by Abelson & Sussman

• The latest draft is always available at http://www.info.ucl.ac.be/~pvr/book.pdf

Page 4: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

The book• The book organizes programming in three categories:

– Concepts: compositionality, encapsulation, lexical scoping, higher-orderness, capability property, concurrency, dataflow, laziness, state, inheritance, ...

– Techniques: how to write programs with these concepts– Computation models (« paradigms »): data entities, operations, and a

language• Paradigms emerge in a natural way (a kind of epiphenomenon) when

programming, depending on which concepts one uses and which properties hold of the program

• Each paradigm has its own properties and reasoning techniques, which is why the book is organized around them

• It is natural for programs to use several paradigms together

Page 5: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

The formalism

• The painful choice: using many languages or one language?– Previously, many languages was the only choice (Leda notwithstanding)– This has changed with the Oz work, making one language a reasonable alternative

• The book uses subsets of the Oz language to model the programming paradigms. There are four reasons:

– Oz was designed to integrate programming concepts into a coherent whole– Oz incorporates ten years of application development experience: its concepts and

techniques have been tested in real use (industrial projects, deployed applications)– Oz has a complete and simple formal semantics– Oz has a high-quality fully-featured implementation, the Mozart Programming

System (see http://www.mozart-oz.org)• Oz does not have a Java-compatible syntax

– We consider it an impossible task, but be our guest... – In any case, computer scientists should be familiar with several notations

• We do not know any other formalism that covers so much ground so well– But we could be mistaken: please let us know!

Page 6: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Concurrency• In an object-oriented setting, concurrency is always used in an

imperative style– This is complex and difficult to learn: observable nondeterminism, race

conditions, monitors, task layering– Concurrent programming is important. We would like to teach it to

second year students! Traditional techniques are a recipe for disaster.• There are simpler forms of concurrency

– Dataflow concurrency: add threads to a functional language and use dataflow to decouple independent calculations

– Active objects: each object executes sequentially in its own thread, objects communicate through asynchronous channels

• Both avoid most of the complexities while still giving the advantages of concurrent execution

• We will teach one or both in a second-year course next fall

Page 7: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Dataflow concurrency

• Dataflow = block on data availability• Add dataflow variables to functional

language

declare X0 X1 X2 X3 Y0 Y1 Y2 inY0=1+X0Y1=Y0+X1Y2=Y1+X2

thread X0=1 endthread X1=1 endthread X2=1 end

+

+

+

X01

X1

X2

Y0

Y1

Y2

X0=1

X1=1

X2=1

threads

Page 8: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Dataflow concurrency

• A system can be concurrent and still confluent• Dataflow concurrency has this property• Here is a simple example:

fun {Fibo N} if N=<2 then 1 else F1 F2 in thread {Fibo N-1 F1} end {Fibo N-2 F2} F1+F2 endend

Page 9: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Dataflow concurrency

• Producer-consumer with dataflow

fun {Prod N Max} if N<Max then N|{Prod N+1 Max} else nil endend

fun {Cons Xs A} case Xs of X|Xr then {Cons Xr A+X} [] nil then A endend

local Xs S in thread Xs={Prod 0 1000} end thread S={Cons Xs 0} endend

• Prod and Cons threads share list Xs• Dataflow behavior of case statement

(synchronizing on data availability) gives stream communication

• No other concurrency control neededXsProd Cons

Page 10: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Dataflow concurrency

• Lazy producer-consumer with dataflow

fun lazy {Prod N} N|{Prod N+1}end

fun {Cons Xs A Max} if Max>0 then case Xs of X|Xr then {Cons Xr A+X Max-1} end else A endendlocal Xs S in

thread Xs={Prod 0} end thread S={Cons Xs 0 1000} endend

• Lazy = demand-driven• Flow control: the consumer decides

how many list elements to create• Dataflow behavior ensures

concurrent stream communication

(note « lazy » annotation)

Page 11: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Active objects

• An active object is a concurrent entity to which any other active object can send messages

• The active object reads the messages in arrival order and sequentially executes an action for each message

• An active object’s behavior is defined by a class, just like a passive object

• Active objects can be considered either as primitive or as defined with a thread, a passive object, and a communication channel

• Creation: A={NewActive Class Init}

Page 12: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Event manager with active objects

• An event manager contains a set of event handlers• Each handler is a triple Id#F#S where Id identifies it, F is

the state update function, and S is the state• Reception of an event causes all triples to be replaced by Id#F#{F E S} (transition from F to {F E S})

• The manager EM is an active object with four methods:– {EM init} initializes the event manager– {EM event(E)} posts event E at the manager– {EM add(F S Id)} adds new handler with F, S, and returns Id– {EM delete(Id S)} removes handler Id, returns state

• This example taken from real use in Erlang

Page 13: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Defining the event manager• Mix of functional and object-oriented style

class EventManager attr handlers meth init handlers<-nil end meth event(E) handlers<- {Map @handlers fun {$ Id#F#S} Id#F#{F E S} end} end meth add(F S Id) Id={NewName} handlers<-Id#F#S|@handlers end meth delete(Did DS) handlers<-{List.partition @handlers fun {$ Id#F#S} DId==Id end [_#_#DS]} endend

State transition done usingfunctional programming

Page 14: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Using the event manager

• Simple memory-based handler keeps list of events

EM={NewActive EventManager init}

MemH=fun {$ E Buf} E|Buf endId={EM add(MemH nil $)}

{EM event(a1)}{EM event(a2)}...

• An event handler is purely functional, yet when put in the event manager, the latter is a concurrent imperative program. This is an example of impedance matching between paradigms.

Page 15: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Defining active objects

• Define NewActive in terms of existing New (passive object creation) by adding one port and one thread

fun {NewActive Class Init} S P Objin {NewPort S P} Obj={New Class Init} thread for M in S do {Obj M} end end proc {$ M} {Send P M} endend

For loop does dataflowsynchronization(like case statement)

Sending to a port causesmessage to appear on stream

Port is created togetherwith a stream (dataflow list)

Page 16: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Concurrency - conclusions

• Dataflow concurrency is the simplest: it has no observable nondeterminism (limited expressiveness)

• Dataflow concurrency permits stream communication• Active objects extend stream communication with many-

to-one communication, which makes them as expressive as the passive object / monitor approach

• Active objects can be used together with passive objects, where the active object is used as a serializer

• Both dataflow concurrency and active objects require cheap threads to be practical

Page 17: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

User interface design

• Three approaches:– Imperative approach (AWT, Swing, tcl/tk, …):

maximum expressiveness but also maximum development cost

– Interface builders: adequate for the part of the UI known before the application runs

– Declarative approach: reduced development cost but limited expressiveness

• All are unsatisfactory for dynamic user interfaces

Page 18: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Mixed declarative/imperativeapproach to UI design

• Using both approaches together is advantageous:– Declarative specification is a data structure. It is concise and can

be manipulated with all the power of the language.– Imperative specification is a program. It has maximum

expressiveness.

• This makes creating dynamic user interfaces particularly easy

• This is important for model-based UI design, an important design methodology in the Human-Computer Interface research community

Page 19: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Mixed approach

• Declarative part– A widget is a record. A full UI specification is a nested

record.– The nested record specifies interface structure and

resize behavior, and all widget types with their initial states

• Imperative part– External events cause action procedures to be executed

(sequentially, in the window’s thread)– Widgets have handler objects, which allows the

application to control them

Page 20: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Example user interface

W=td(lr(label(text:«Enter your name») entry(handle:E)) button(text:«Ok» action:P))...{Build W}...{E set(text:«Type here»)}...Result={E get(text:$)}

Nested record withhandler object E andaction procedure P

Call handler

Construct interface(window & handler)

Page 21: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Widgets

• Widget = rectangular area with particular behavior• Examples (as records):

– label(text:«Hello»)– text(handle:H tdscrollbar:true)– button(text:«Ok» action:P)– lr(W1 W2 ... Wn)– td(W1 W2 ... Wn)– placeholder(handle:H)

{H set(W)}

Compositional

Dynamic

Page 22: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Declarative resize behavior

• Resizing is dynamic but specified declaratively– This is a case where the limited expressiveness of the declarative

description is good enough• Declarative specification with « glue »• Consider widget W inside another:• W = <type>(... glue:<g>)

– nswe: stretch horizontal and vertical– we: stretch horizontal, centered vertical– w: left justified, centered vertical– (none): centered, keeps natural size

W

n

s

w e

Page 23: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Example dynamic interface

W=placeholder(handle:P)...{P set(label(text:«Hello»))}...{P set(entry(text:«World»))}

• Any UI specification can be put in the placeholder at run-time

Page 24: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Calculating interfaces (1)

• Calculate interface directly from internal data representation

Data=[«Name»#«Roger» «Surname»#«Rabbit»]

Result= {ListToRecord td {Map Data fun {$ L#E} lr(label(text:L) entry(init:E)) end}}

Result=td(lr(label(text:«Name») entry(init:«Roger»)) lr(label(text:«Surname») entry(init:«Rabbit»)))

Page 25: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Calculating interfaces (2)• Calculate several interfaces from the same data• Choose between representations according to run-time condition

Data

Editableinterface

Placeholderwidget

View-onlyinterface

• With language support (syntax and implementation) for record operations and functional programming this is very concise

Page 26: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Uses and limitsof declarative programming

• When is a declarative paradigm appropriate and when is state and/or concurrency needed?

– An important question that arouses strong religious feelings• Naive limits of declarative programming:

– Need for many small modifications of large structures (e.g., simulations)– Need for components that evolve independently (e.g., interactive behavior)– Need for components that have to learn from past behavior

• These limits can be overcome within the declarative paradigm:– State threading (e.g., monads) allows incremental modifications and learning– Dataflow concurrency allows independent components and learning, but not

observable nondeterminism– Feeding external nondeterminism allows observable nondeterminism

• A final limit remains:– The components of a declarative program are tied together, if the program needs state

threading or has observable nondeterminism. That is, the components are overspecified: their interfaces contain information that should be hidden.

– In these cases, the declarative program is not fully decomposable

Page 27: Extracts from the upcoming book « Concepts, Techniques, and Models of Computer Programming »

Conclusions• Combining programming paradigms is a natural and powerful way to

program– It corresponds most naturally to the underlying concepts– It does not impose artificial restrictions on what can be expressed

• Students should be taught starting from the underlying concepts– If they understand the concepts, then they can easily learn any language– They will see that many apparent difficulties are not due to the concepts,

but to design decisions specific to particular languages– We have given two examples. The book has many more examples and has

principled discussions on how to program with multiple paradigms.– The book covers many more paradigms than we could touch on in this

short talk: functional programming (strict and lazy), logic programming (deterministic and nondeterministic), concurrency (in many forms), state (including components and objects), constraint programming, distributed programming.

– We will be teach-testing the book throughout the next academic year