2D1361
Programmeringsparadigm
Lars Arvestad
Adress: Roslagsbacken 35
Albanova
Tfn:
5537 8565
mejl:
[email protected]
Andra inblandade
I
I
I
I
Alexander Baltatzis (C, Inet)
Ann Bengtsson (handl)
Inge Frick (handl)
Flera D3-studenter
2D1361 Programmeringsparadigm
En kurs om...
I hur man beskriver beräkningar
I hur man löser programmeringsproblem
I några programmeringsspråk
2D1361 Programmeringsparadigm,
kursmål
Kursens mål är att ge
I en systematisk genomgång av de viktigaste
programmeringsparadigmen,
...
2D1361 Programmeringsparadigm,
kursmål
Kursens mål är att ge
I en systematisk genomgång av de viktigaste
programmeringsparadigmen,
I en systematisk genomgång av
grundläggande programmeringsbegrepp
och centrala programspråkselement,
...
2D1361 Programmeringsparadigm,
kursmål
... för att studenterna ska
I få ett bredare perspektiv på
programmering,
2D1361 Programmeringsparadigm,
kursmål
... för att studenterna ska
I få ett bredare perspektiv på
programmering,
I kunna bedöma vilket paradigm och vilket
programspråk som är lämpligt för att lösa
en viss uppgift,
2D1361 Programmeringsparadigm,
kursmål
... för att studenterna ska
I få ett bredare perspektiv på
programmering,
I kunna bedöma vilket paradigm och vilket
programspråk som är lämpligt för att lösa
en viss uppgift,
I kunna använda adekvat programmeringsstil
i valt programmeringsparadigm.
2D1361 Programmeringsparadigm,
innehåll
I
Funktionell programmering i Haskell
2D1361 Programmeringsparadigm,
innehåll
I
I
Funktionell programmering i Haskell
Logikprogrammering i Prolog
2D1361 Programmeringsparadigm,
innehåll
I
I
I
Funktionell programmering i Haskell
Logikprogrammering i Prolog
Imperativ programmering med C
2D1361 Programmeringsparadigm,
innehåll
I
I
I
I
Funktionell programmering i Haskell
Logikprogrammering i Prolog
Imperativ programmering med C
Internetprogrammering med Java
2D1361 Programmeringsparadigm,
innehåll
I
I
I
I
I
Funktionell programmering i Haskell
Logikprogrammering i Prolog
Imperativ programmering med C
Internetprogrammering med Java
Grammatiker och syntaxanalys
2D1361 Programmeringsparadigm,
kursfordringar
I
I
Tenta, värd 3 poäng
21 november 8.00–13.00
6 laborationer, 2 poäng
Redovisning i tid ger bonuspoäng
2D1361 Programmeringsparadigm,
kursmaterial
Hutton, Programming in Haskell och
Hudak et al, A gentle introduction to Haskell 98
Brna, Prolog programming: A first course
Kusoffsky, Lite grann om syntaxanalys
Kusoffsky och Arvestad, Labbhäfte
2D1361 Programmeringsparadigm,
kursmaterial
Hutton, Programming in Haskell och
Hudak et al, A gentle introduction to Haskell 98
(tillsammans, 60 kr)
Brna, Prolog programming: A first course (70 kr)
Kusoffsky, Lite grann om syntaxanalys
(20 kr)
Kusoffsky och Arvestad, Labbhäfte
(gratis)
Totalt 150 kr
2D1361 Programmeringsparadigm,
kursmaterial
För den intresserade:
I
I
Paul Hudak, The Haskell School of
Expression, (376 kr?)
Simon Peyton Jones, Tackling the awkward
squad: monadic input/output, concurrency,
exceptions, and foreign-language calls in
Haskell. Fritt på nätet!
Paradigmer
Paradigmer används...
I när man kodar
I bestämmer programstruktur (modellering)
I konstruerar programmeringsspråk
Paradigmer
Några erkända paradigmer
I Imperativ
I Objektiorienterad
Paradigmer
Några erkända paradigmer
I Imperativ
I Objektiorienterad
I Funktionell
Paradigmer
Några erkända paradigmer
I Imperativ
I Objektiorienterad
I Funktionell
I Logisk
Paradigmer
Några erkända paradigmer
I Imperativ
I Objektiorienterad
I Funktionell
I Logisk
I Händelsestyrd (event driven)
Paradigmer
Några erkända paradigmer
I Imperativ
I Objektiorienterad
I Funktionell
I Logisk
I Händelsestyrd (event driven)
I Jämlöpande (concurrent)
Paradigmer: Imperativ
Rötter:
Idag:
+
+
Fortran, Algol
C, C++, C#, Java, mmfl
Nära hårdvara → ”enkel” kompilator
Lätt att lära
Paradigmer: Imperativ
Rötter:
Idag:
+
+
-
Fortran, Algol
C, C++, C#, Java, mmfl
Nära hårdvara → ”enkel” kompilator
Lätt att lära
Nära hårdvara → svårt att abstrahera
Spaghettivarning
Paradigmer: Objektorientering
Rötter:
Idag:
+
+
+
+
Simula, Smalltalk
C++, Java, C#, mfl
Högre abstraktioner
Betonar modularitet
Bra koppling till datamodellering
För återanvändning av kod mha arv
Paradigmer: Objektorientering
Rötter:
Idag:
+
+
+
+
-
Simula, Smalltalk
C++, Java, C#, mfl
Högre abstraktioner
Betonar modularitet
Bra koppling till datamodellering
För återanvändning av kod mha arv
Komplexa språk?
Komplexa program?
Paradigmer: Funktionell
Rötter: λ-kalkyl, Lisp, ML
Idag: Scheme, Standard ML, Haskell,
Erlang, mfl
+ Abstraktion
+ Uttrycksfullhet
+ Verifierbarhet
+ Kodtransformering? ”Optimering på
hög nivå”
Paradigmer: Funktionell
Rötter: λ-kalkyl, Lisp, ML
Idag: Scheme, Standard ML, Haskell,
Erlang, mfl
+ Abstraktion
+ Uttrycksfullhet
+ Verifierbarhet
+ Kodtransformering? ”Optimering på
hög nivå”
- Beräkningsmodell långt ifrån
maskinen
- Nya uttryckssätt — svårt
Paradigmer: Logisk
Rötter:
Idag:
+
+
+
+
+
Prolog
Prolog
Abstraktion
Uttrycksfullhet
Verifierbarhet
Kodtransformering?
Stark ”kombinatorisk motor”
Paradigmer: Logisk
Rötter:
Idag:
+
+
+
+
+
-
Prolog
Prolog
Abstraktion
Uttrycksfullhet
Verifierbarhet
Kodtransformering?
Stark ”kombinatorisk motor”
Beräkningsmodell långt ifrån
maskinen
- Nya uttryckssätt — svårt
- Udda beräkningsmodell
Paradigmer och språk: Liten tidslinje
1956
1958
1962-68
1972
1983
1990
1995
Idag?
Fortran
Lisp
Simula
Smalltalk
Prolog
C
C++
Haskell
Java
John W. Backus
John McCarthy
Nygaard, Dahl, mfl
Alan Kay mfl
Colmerauer, Kowalski
Ritchie
Stroustrup
Gosling
Paradigmer och språk: Liten tidslinje
1956
1958
1962-68
1972
1983
1990
1995
Fortran
Lisp
Simula
Smalltalk
Prolog
C
C++
Haskell
Java
John W. Backus
John McCarthy
Nygaard, Dahl, mfl
Alan Kay mfl
Colmerauer, Kowalski
Ritchie
Stroustrup
Idag?
Webb-tillämpningar, AJAX?
Gosling
Varför Haskell/Prolog/Annat?
Allmänbildning! Ni är de som ska föra
programmering framåt.
Varför Haskell/Prolog/Annat?
Allmänbildning! Ni är de som ska föra
programmering framåt.
Inspiration, insikt! Ny programmeringsstil kan
användas även i andra
programmeringsspråk.
Varför Haskell/Prolog/Annat?
Allmänbildning! Ni är de som ska föra
programmering framåt.
Inspiration, insikt! Ny programmeringsstil kan
användas även i andra
programmeringsspråk.
Hammare till spik, skruvmejsel för skruv! Vilka
kriterier ska man ha? Bra bibliotek?
Många kolleger som kan språket?
Garanterat effektiva program? Snabb
utveckling?
Utvikning: Turingfullständighet
I
Turingmaskin: Tidig beräkningsmodell
(Alan Turing, 1936).
Motsvarar digital krets med en enkel
I/O-enhet.
Utvikning: Turingfullständighet
I
I
Turingmaskin: Tidig beräkningsmodell
(Alan Turing, 1936).
Motsvarar digital krets med en enkel
I/O-enhet.
Universell Turingmaskin: läser och
exekverar program
Utvikning: Turingfullständighet
I
I
I
Turingmaskin: Tidig beräkningsmodell
(Alan Turing, 1936).
Motsvarar digital krets med en enkel
I/O-enhet.
Universell Turingmaskin: läser och
exekverar program
Ett programmeringspråk/system är
Turing-fullständigt om det kan beräkna
samma funktioner som en universell
Turing-maskin.
Utvikning: Turingfullständighet
I
I
I
I
Turingmaskin: Tidig beräkningsmodell
(Alan Turing, 1936).
Motsvarar digital krets med en enkel
I/O-enhet.
Universell Turingmaskin: läser och
exekverar program
Ett programmeringspråk/system är
Turing-fullständigt om det kan beräkna
samma funktioner som en universell
Turing-maskin.
Hypotes: Programmeringsspråk är (i
allmänhet) Turingfullständiga.
Exempel: Viaweb
Från Beating the Averages av Paul Graham
In the summer of 1995, my friend Robert
Morris and I started a startup called Viaweb.
Our plan was to write software that would let
end users build online stores. What was novel
about this software, at the time, was that it ran
on our server, using ordinary Web pages as the
interface. [. . . ]
Another unusual thing about this software
was that it was written primarily in a programming language called Lisp."
Exempel: Viaweb
Från Beating the Averages av Paul Graham
A new competitor seemed to emerge out of
the woodwork every month or so. The first thing
I would do, after checking to see if they had a
live online demo, was look at their job listings.
After a couple years of this I could tell which
companies to worry about and which not to. The
more of an IT flavor the job descriptions had, the
less dangerous the company was.
...
Exempel: Viaweb
Från Beating the Averages av Paul Graham
...
The safest kind were the ones that wanted Oracle experience. You never had to worry
about those. You were also safe if they said they
wanted C++ or Java developers. If they wanted
Perl or Python programmers, that would be a bit
frightening– that’s starting to sound like a company where the technical side, at least, is run
by real hackers. If I had ever seen a job posting looking for Lisp hackers, I would have been
really worried.
Exempel: Erlang
Ericsson saknade språk med särdrag för
telekom-tillämpningar. (80-talet)
Några krav:
I Inbyggd parallelism, IPC
I Realtidskrav
I Garbage collection
I Ladda ny programversion utan att avbryta
exekvering
I Robusthet: Uptime > 99.999%
Exempel: Erlang
Lösning: Erlang, ett funktionellt språk med
rötter i prolog.
Användning: Switchar och annat från Ericsson.
Idag ett akademiskt, industriellt och
kommersiellt språk.
Exempel: Erlang
Lösning: Erlang, ett funktionellt språk med
rötter i prolog.
Användning: Switchar och annat från Ericsson.
Idag ett akademiskt, industriellt och
kommersiellt språk.
Lärdom: Enligt Ulf Wiger: 4x produktivitet,
4x färre fel från
Erlang-programmerare jämfört med
C++/Java.
Exempel: Produktivitet
Jämförande studie av Amerikanska flottan 1989:
Implementera en begränsad ”geo-server” (del
av vapensystemet Aegis) i flera
programmeringsspråk.
(Från Haskell vs. Ada vs. C++ vs. Awk vs. ... An
Experiment in Software Prototyping Productivity
av Hudak och Jones.)
Exempel: Produktivitet
Språk
LOC LOD Impl.Tid
Haskell
85 465
10 h
Ada
767 714
23 h
C++
1105 130
?
Haskell, student 156 112
8h
Exempel: Mitrionics
Produktidé: Kompilator för FPGA-kort
(”rekonfigurerbart chip”)
Tidigare arbetsgång:
1. Skriv program i VHDL
2. Konvertera VHDL till
FPGA-beskrivning
Exempel: Mitrionics
Produktidé: Kompilator för FPGA-kort
(”rekonfigurerbart chip”)
Tidigare arbetsgång:
1. Skriv program i VHDL
2. Konvertera VHDL till
FPGA-beskrivning
Ny arbetsgång:
1. Skriv ditt program i ”Mitrion-C”
2. Kompilera till VHDL
3. Konvertera VHDL till FPGA
Exempel: Mitrionics
I
I
I
I
Mitrion-C är ett förtäckt funktionellt
programmeringsspråk. ”Vi vill inte skrämma
iväg folk.”
Använd igenkännandets glädje: syntaxen är
lik C/Java
Inga bieffekter i funktionsanrop gör att
beräkningar är lätta att parallellisera.
Lärdom: Att tänka annorlunda gav
Mitrionics ett försteg!
Traditionella invändningar
Långsamma, ty interpreterade, ej kompilerade!
Ibland sant, sant också för första
Java-systemen. Styrka: Interaktiv
programmering.
Traditionella invändningar
Långsamma, ty interpreterade, ej kompilerade!
Ibland sant, sant också för första
Java-systemen. Styrka: Interaktiv
programmering.
Långsamma i alla fall! Titta på ”The Great
Computer Language Shootout”.
Några av de vanligaste språken idag
är långsammare än Haskell.
Traditionella invändningar
Långsamma, ty interpreterade, ej kompilerade!
Ibland sant, sant också för första
Java-systemen. Styrka: Interaktiv
programmering.
Långsamma i alla fall! Titta på ”The Great
Computer Language Shootout”.
Några av de vanligaste språken idag
är långsammare än Haskell.
Svåra att använda! För alla tillämpningar?
Kräver kanske mer planering?
Kodexempel: Hello World
Java
class HelloWorldApp {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
Haskell
module Main where
main = putStrLn("Hello World!")
Prolog
hello :- display(’Hello World!’) , nl .
Kodexempel: Quicksort i Java
public class QuickSort {
public static void quicksort(double[] a) {
quicksort(a, 0, a.length - 1);
}
public static void quicksort(double[] a, int left, int right) {
if (right <= left) return;
int i = partition(a, left, right);
quicksort(a, left, i-1);
quicksort(a, i+1, right);
}
private static int partition(double[] a, int left, int right) {
int i = left - 1;
int j = right;
while (true) {
while (a[++i] < a[right]) // find item on left to swap
;
// a[right] acts as sentinel
while (a[right] < a[--j]) // find item on right to swap
if (j == left) break; // don’t go out-of-bounds
if (i >= j) break;
// check if pointers cross
exch(a, i, j);
// swap two elements into place
}
exch(a, i, right);
// swap with partition element
return i;
}
// exchange a[i] and a[j]
private static void exch(double[] a, int i, int j) {
double swap = a[i];
a[i] = a[j];
a[j] = swap;
}
}
Kodexempel: QuickSort i Haskell
qsort []
= []
qsort (x:xs) = qsort (filter (< x) xs)
++ [x]
++ qsort (filter (>= x)
Kodexempel: QuickSort i Prolog
split(H, [A|X], [A|Y], Z) :order(A, H), split(H, X, Y, Z).
split(H, [A|X], Y, [A|Z]) :not(order(A, H)), split(H, X, Y, Z).
split(_, [], [], []).
quicksort([], X, X).
quicksort([H|T], S, X) :split(H, T, A, B),
quicksort(A, S, [H|Y]),
quicksort(B, Y, X).