Geavanceerde Programmeertechnologie Les 5: Gevorderde Programmeertechnieken Prof. dr. Kris Luyten Jo Vermeulen
Doel van deze les • Programmeerparadigma’s uitdieping • Closures • InspecDe en reflecDe
Uit les 1: Programmeertalen
hHp://people.ku.edu/~nkinners/LangList/Extras/classif.htm hHp://oreilly.com/news/graphics/prog_lang_poster.pdf
• Talen: Postscript, Oberon, Tcl/Tk, Fortran, Prolog, Pascal, Delphi, Python, Cobol, Modula, Ada, Rexx, ISO C, C#, Javascript, ANSI/ISO C++, Ruby, Self, Eiffel, PHP, Perl, ML, Lisp, ObjecDve-‐C, VB, Scheme, Haskell, Caml, Smalltalk, Miranda, PL/1, Simula, Java... • Belangrijkste klassen: imperaDef, funcDoneel, object-‐georiënteerd en logisch
Wat kan je nu? • ImperaDef programmeren ( C ) • Object-‐georiënteerd programmeren ( C++, Java) • FuncDoneel programmeren ( Haskell ) • Gebruik van mulD-‐paradigma talen ( Python )
Diepgaand overzicht programmeerparadigma’s • Programming Paradigms for Dummies: What Every Programmer Should Know, Peter Van Roy, in New Computa?onal Paradigms for Computer Music, G. Assayag and A. Gerzso (eds.), IRCAM/Delatour France, 2009, hBp://www.info.ucl.ac.be/~pvr/ paradigms.html Lezen: secDes 1, 2.1 en 4
!!! niet voor dummies !!!
Van Roy
Figure 1. Languages, paradigms, and concepts
record Descriptive declarative programming
XML, S−expression
Data structures only Turing equivalent Observable nondeterminism? Yes No
The principal programming paradigms "More is not better (or worse) than less, just different." v1.08 © 2008 by Peter Van Roy
+ procedure First−order functional programming
+ cell (state)
Imperative programming
Pascal, C + closure
Imperative search programming
Functional programming
+ unification (equality)
+ continuation
Deterministic logic programming
Continuation programming
+ search Relational & logic programming
Scheme, ML
+ by−need synchron. Prolog, SQL Lazy embeddings functional + solver programming Constraint (logic) Haskell
SNOBOL, Icon, Prolog
+ name (unforgeable constant) ADT functional programming
+ cell
ADT imperative programming
Scheme, ML Haskell, ML, E CLU, OCaml, Oz + thread + single assign. + nondeterministic + port choice (channel) Monotonic
dataflow Nonmonotonic Multi−agent programming dataflow dataflow programming programming Declarative programming concurrent Concurrent logic Oz, Alice, AKL programming programming CLP, ILOG Solver Pipes, MapReduce Oz, Alice, Curry, Excel, + thread + thread + by−need AKL, FGHC, FCP Concurrent + single assignment synchronization + synch. on partial termination constraint Lazy programming Functional reactive dataflow programming (FRP) LIFE, AKL programming Weak synchronous + by−need synchronization Lazy programming Lazy concurrent declarative FrTime, SL constraint concurrent programming programming + instantaneous computation Oz, Alice, Curry Oz, Alice, Curry Strong synchronous programming Logic and Esterel, Lustre, Signal Dataflow and Functional constraints message passing
Unnamed state (seq. or conc.) More declarative
+ search
Nondet. state
+ port (channel)
+ cell (state)
Event−loop programming
E in one vat + thread Multi−agent programming Message−passing concurrent programming
Erlang, AKL + local cell Active object programming Object−capability programming
+ closure
Sequential object−oriented programming Stateful functional programming
Java, OCaml + thread Concurrent object−oriented programming Shared−state concurrent programming
Smalltalk, Oz, Java, Alice + log
CSP, Occam, E, Oz, Alice, publish/subscribe, tuple space (Linda)
SQL embeddings
Message passing
Shared state
Software transactional memory (STM)
Named state Less declarative
Source: hHp://www.info.ucl.ac.be/~pvr/paradigms.html
Eigenschap 1: Observable Nondeterminism Determinism = er is één en slechts één uitvoering van het programma, waarbij de mogelijke program flows volledig door de ontwikkelaar bepaald worden
Eigenschap 1: Observable Nondeterminism Nondeterminism = Djdens de programma-‐ uitvoering zijn er momenten waarop een systeem (scheduler) kiest wat de volgende stap is uit verscheidene mogelijkheden. De keuze kan niet voorspeld worden.
Eigenschap 1: Observable Nondeterminism Observable Nondeterminism = de gebruiker (ontwikkelaar) kan zien dat, gegeven eenzelfde startconfiguraDe, de programmauitvoering een verschillend resultaat kan hebben.
Eigenschap 2: Named State State = de invulling van alle variabelen op opeenvolgende DjdsDppen Djdens de uitvoering van het programma
Programming Paradigms for Dumm Eigenschap 2: Named State
Declarative paradigms (relational and functional)!
Expressiveness of state! Less!
unnamed, deterministic, sequential!
named, deterministic, sequential!
unnamed, deterministic, concurrent!
Imperative programming!
Deterministic concurrency!
named, nondeterministic, sequential!
unnamed, nondeterministic, concurrent!
Guarded command programming!
Concurrent logic programming!
named, nondeterministic, concurrent! More!
Message-passing and shared-state concurrency!
Figure 3. Di↵erent levels of support for state
Eigenschap 3: Record Datastructuur die verschillende data-‐elementen groepeert en indexeert.
langue:allemand)
The record is referenced by the identifier R. Members can be references through the operation, e.g., R.nom returns a reference to the string "Le Roi des Aulnes". record is the foundation of symbolic programming. A symbolic programming langua able to calculate with records: create new records, decompose them, and examine th Many important data structures such as arrays, lists, strings, trees, and hash tables be derived from records. When combined with closures (see next section), records be used for component-based programming.
Eigenschap 4: Lexically Scoped Closure • Een closure is een procedure (funcDe) samen 4.2 Lexically scoped closure met referen?es buiten de scope van de procedure Context D state Context C x Definition of procedure P x Call of procedure P
Context D Context C
1. Definition
2. Call
Eigenschap 4: Lexically Scoped Closure • FuncDe + “set van” variabelen die in de funcDe gebruikt worden maar niet in de funcDe-‐scope zelf ziHen (niet-‐lokale of vrije variabelen). – Variabelen zijn nodig aan de uitvoering
• Vrije variabelen blijven “geldig” voor de uitvoering van de funcDe. • Oorspronkelijk voor funcDonele programmeeertalen (Lisp, ML) maar ook in andere paradigma’s.
Closures prakDsch • Twee toepassingen van closures: – Lambda funcDes (funcDes zonder naam die “inline” uitgevoerd kunnen worden) en anonieme classes. – FuncDes die funcDes maken en afleveren.
• Een closure zorgt er voor dat de “lokale omgeving” voor de uitvoering van een funcDe volledig is.
Closure in Haskell • Lambda funcDe
> (\x y -‐> x + y) 3 5 > 8
> map (\x -‐> x + 1) lst
• Closure: variabele x buiten de scope van de funcDe, maar kan toch gebruikt worden
f x = (\y -‐> x + y)
Closure in JavaScript • Typisch gebruikt voor “generator” funcDes: funcDes die andere funcDes produceren var createFuncDon = funcDon () { var x = 3; return funcDon () { return 4 + x; }; }; var telop = createFuncDon(); document.write(telop()); // 7
Closure in Python def counter(): x = 0 def increment(): nonlocal x x += 1 print(x) return increment
counter1_increment = counter() counter2_increment = counter() counter1_increment() # 1 counter1_increment() # 2 counter2_increment() # 1 counter1_increment() # 3
Bron: hHp://en.wikipedia.org/wiki/Closure_(computer_science)
Closure-‐like construcDes in Java: anonymous classes AcDonListener listener = new AcDonListener() { public void ac?onPerformed(Ac?onEvent ae) { System.out.println("Anonymous"); } }; …
myWidget.addAcDonListener(listener);
Closure-‐like construcDes in Java: anonymous classes myWidget.addAcDonListener(new AcDonListener() { public void ac?onPerformed(Ac?onEvent ae) { System.out.println("Anonymous"); } }; )
Closure-‐like construcDes in Java: anonymous classes myWidget.addAcDonListener(new AcDonListener() { public void ac?onPerformed(Ac?onEvent ae) { System.out.println("Anonymous"); } Gedeclareerd en geïnstanDeerd }; ) “ter plekke” Class definiDe zit in de constructor
Closure-‐like construcDes in Java: anonymous classes public class Magic{ public staDc void main(String[] args) { Trick t = new Trick(){ public void execute(){ System.out.println(“sim sala bim”); } } t.execute(); } public interface Trick{ void execute(); } }
Closures opdrachten & materiaal • Lesmateriaal:
– hHp://www.marDnfowler.com/bliki/Closure.html – Programming Paradigms for Dummies: What Every Programmer Should Know, secDe 4 – Crossing Bordurer: Closures (hHps://www.ibm.com/ developerworks/java/library/j-‐cb01097/)
• Opdrachten: zoek twee veel voorkomende redenen om closures te gebruiken
– Tip 1: zoek twee situaDes op waarin de code korter en leesbaarder of efficienter wordt door closures te gebruiken. – Tip 2: Ruby is een programmeertaal waarin closures nu}g gebruikt kunnen worden…
Eigenschap 5: Independence (concurrency) • Cfr. Processes en threads in OSes
InspecDe en ReflecDe • Uitvoerbare code die zichzelf kan ondervragen mbt de code structuur • Dynamische uitvoering van code • Vooral aanwezig bij talen die op een virtual machine werken • Via een aparte API kan men objecten en classes “ondervragen” – In Java: java.lang.reflect package
ReflecDe in Java • InspecDe van een object: – Van welke class is dit object? – Van welke classes is dit object afgeleid? – Welke methods biedt het aan? Met welke variabelen?
• Dynamische uitvoering: – Gegeven de naam van een method als een string, invoke deze – Gegeven de naam van een member variabele als een string, verander de waarde van deze variabele
ReflecDe in Java • De Class Class
hHp://download.oracle.com/javase/1.5.0/docs/api/java/lang/ Class.html
• Alle methods om dynamisch klasses te ondervragen en te manipuleren
ReflecDe in Java void printClassName(Object obj) { System.out.println("The class of " + obj + " is " + obj.getClass().getName()); } Class c = Class.forName(“java.lang.String”); Class c = int.class;
ReflecDe in Java Class c = Class.forName("java.lang.String"); Method m[] = c.getDeclaredMethods(); for(int i=0; i<m.length; i++) System.out.println(m[i].toString());
ReflecDe in Java import java.lang.reflect.*; public class constructor2 { public constructor2() { } public constructor2(int a, int b) { System.out.println( "a = " + a + " b = " + b); } public staDc void main(String args[]) { try { Class cls = Class.forName("constructor2"); Class partypes[] = new Class[2]; partypes[0] = Integer.TYPE; partypes[1] = Integer.TYPE; Constructor ct = cls.getConstructor(partypes); Object arglist[] = new Object[2]; arglist[0] = new Integer(37); arglist[1] = new Integer(47); Object retobj = ct.newInstance(arglist); } catch (Throwable e) { System.err.println(e); } } }
ReflecDe in Java: opdracht • Schrijf een Java programma waar je via de command line een class name kan ingeven, en die je dan een lijst van methods voor die klasse toont. >java MethodPrinter Class name? java.lang.Math Fields: public staDc double E public staDc double PI Methods: public staDc double abs(double); Public staDc float abs(float); ….
ReflecDe in Java: opdracht • Schrijf een Java programma dat toelaat via de command line methods van een arbitraire klasse uit te voeren. Dit hoe‚ enkel te werken voor classes met een constructor zonder parameters, voor staDc methods of voor staDc classes. • Na een vraagteken verwacht je programma input • Je tracht de input voor de parameters automaDsch om te zeHen naar een van de ondersteunde types (volgorde van proberen mag je zelf kiezen). Als geen enkel type lukt stop je met een foutmelding. • Schrijf het resultaat van de uitvoering van de method naar de output • Schrijf vervolgens ook de waarde van de toString method naar de output van het gebruikte object (indien het geen staDc class betrof)
ReflecDe in Java: opdracht
>java MethodExecutor What method to invoke? java.lang.StringBuffer.append Needs maximum 3 parameters. How many will you provide? 1 parameter 1? “De kat krrrrabt de krrrrrollen van de trrrrap” Uitvoering gelukt! De kat krrrrabt de krrrrrollen van de trrrrap ….