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).