1 2 TDDC66 Datorsystem och programmering TDDC67 Funktionell programmering Programmering i Lisp, examinator TDDC67 föreläsare i Lisp Peter Dalenius examinator TDDC66 kursassistent i Lisp + ett stort antal labbassistenter Mer info http: //www.ida.liu.se/~tddc66 //www.ida.liu.se/~tddc67 Kan göras på många olika sätt och man kan ta ställning till: Val av programmeringsparadigm, sätt att programmera: Imperativ programmering Objektorienterad programmering Funktionell programmering Logikprogrammering Val av programmeringsspråk: C/C++ Java Python, Ruby Ada Lisp/Scheme Haskell Problemlösning Problemområden som man programmerar: Enkla problem-> större problem Algoritmiska problem Programmering runt bibliotek (detaljer göms) Skriptprogrammering med web Grafikprogrammering 3 4 Vi har för C- och D-programmen valt följande strategi: Programmeringsparadigmer: Funktionell programmering (Termin 1 åk 1) -> Imperativ programmering (Termin 2 åk 1) -> Objektorienterad programmering (Termin 3 åk 2) Programmeringsspråk: Lisp (Termin 1 åk 1) -> Ada, C/C++ (Termin 2 åk 1) -> Java, C++ (Termin 3 åk 2) Problemlösning Vi börjar med enkla problem och löser successivt större problem. Vi avslutrar denna kurs med ett projekt. Efter många års lärare i programmering är det viktigaste i en första kurs att lära sig: Bryt ned ett stort problem till små enheter / funktioner. Princip: En enhet löser ett problem Ge bra namn på enheten och de ingående data som skall bearbetas. Princip: Abstraktion, program skall vara läsbara och förståeliga i sitt sammanhang Sedan kan man gå vidare me mer specifika programmeringssätt och programmeringsspråk.
5 6 Om man läser en datautbildning med mycket matematik och speciellt Diskret matematik är det speciellt lämpat att börja med den funktionella programmeringsparadigmen. Vår erfarenhet och nästan alla studenterna har under alla år tyckt att detta är ett bra sätt att börja programmeringsundervisning, och senare gå vidare med ytterligare ett antal mer specifika programmeringskurser. Efter de första 3 åren har ni fått stor erfarenhet av programmering och tillämpat detta i många andra kurser. Då skall ni kunna lösa stora klasser av problem och i stort kunna använda vilket programmeringsspråk som helst. Att börja med funktionell programmering, vad innebär detta? Innehåller ett antal svårigheter, i början kommer vi att direkt arbeta med begreppet rekursion, där vi visar många olika modeller och likheten med matematiken. Kräver mycket övning, och när man kommit över tröskeln så är det ju lätt och självklart. Vad är LISP? Ett egentligen gammalt språk, som möjliggör att illustrera många olika programmeringsparadigmer och programmeringskonstruktioner. Många konstruktioner i Lisp har dock återkommit i nya språk som Python och Ruby. 7 8 Funktionell programmering + Lisp medför att modellen att programmera blir nytt för alla studenterna. Vi börjar från början med mycket enkla exempel, programmeringen byggs upp allt eftersom. Kräver mycket övning. För nybörjare: Lyssna på oss lärare, följ bok och laborationsanvisningarna. För de som har programmerat tidigare: RISK! Detta är troligen nytt även för er och ni får inte underskatta svårigheterna i sättet att programmera och slarva med laborationerna. Varför har vi två kurser i programmering under höstterminen Delvis beroende på reformer där kurser inte skulle bli för stora i poängomfång och dels att moment har flyttats mellan kurser. Men Lisp-delen börjar i första kursen och går sedan (mer eller mindre) osynligt över i andra kursen i slutet av period 1. Ge akt på scheman. Alla Lisp-laborationer finns i samma labb-häfte. Kursen ger något nytt för ALLA studenterna. Många lärosäten i Sverige använder denna modell som första språk. Som alternativ till Lisp använder en del ML och Haskel (t ex Chalmers). På Y-programmet används Lisp-dialekten Scheme i sin första kurs: PRAM - Programmering, abstraktion och modellering.
9 10 Vad har vi gjorde sedan förra året. Vi hade sedan några år sedan senarelagt moment i laborationsserien, så att det hamnade i period 2, vilket medförde att belastningen blev fört stor i period 2 och man tyckte att man skulle flytta över moment till första perioden. Vi har även i år startat tidigare i prop-perioden med datorintroduktion. Vi börjar tidigare med Lisp-föreläsningarna, har flyttat en laboration (almanackan) till period 1. Dessutom passar det bra eftersom man gjort förändringar i matematiken, som läses parallellt under hösten. All den diskreta matematiken läses i period 1, med bättre möjlighet till samordning med den funktionella programmeringen. Vissa smärre förändringar i labbserien, bättre fokus på testning i en av laborationerna. Gruppstorlek: Lisplaborationer 1 och 2 i TDDC66 gör enskilt. Nytt för i år är att laborationerna fr o m labb 3 kan göras i labbgrupper om 2. Mål för Programmering i Lisp programmering, principer, problemlösning * strukturera program i mindre delar * bryta ned problem * läsbarhet av program huvudsaklig metodik * funktionell programmering, rekursion * abstrakta datatyper * bearbeta strukturerade dataobjekt, sekvenser, trädstrukturer mm datavetenskapliga begrepp och strukturer, likheter med matematiska begrepp i Diskret matematik (som ni läser parallellt) generella programspråksbegrepp språket Lisp - dialekten Common Lisp * listhantering * högre ordningens funktioner * imperativa konstruktioner programutveckling och hjälpmedel med Allegro * editor * felsökning projektuppgift * självständig programmering * gruppdiskussioner * dokumentation 11 12 Allegro Common Lisp Emacs (programeditor) Lispsystem på skolan Föreläsningar - introducerar begreppen - ger översikt - sammanfattar och reflekterar - ligger alltid lite före Lispsystem på egna datorer Följ länkar från kursens www-sidor. Speciellt finns Allegro CL för Windows och Linux från Franz. Kurslitteratur Haraldsson, Programmering i Lisp, Studentlitteratur Kursmaterial i Funktionell programmering och Lisp - laborationer - Allegro CL via Emacs Gruppövning/Lektioner - systemgenomgångar - laborationsförberedelser - frågor, diskussioner - övningar Laborationer - frågor, diskussioner - övningar - arbeta med de obligatoriska uppgifterna - redovisa laborationer Egen tid - läs bok, torröva - lös många problem - öva, testa, experimentera på systemen - arbeta med de obligatoriska uppgifterna Framför allt - kom igång nu på en gång, bli inte efter - det räcker inte med de schemalagda laborationerna
13 14 Examination i Programmering i Lisp I kursen TDDC66 Datorsystem och programmering skall de tre första laborationerna redovisas tillsammans med två duggor. Momentet benämns: LAB1 Inledande laborationskurs (U, G), 2 hp. I kursen TDDC67 Funktionell programmering och Lisp skall resterande laborationer utföras samt en projektuppgift. Skriftlig tentamen på hela delen Programmering i Lisp, dvs moment från båda kurserna. Momenten benämns: TEN1 Skriftlig tentamen efter andra perioden (U,3,4,5), 3 hp. LAB1 Laborationer (U,G), 3 hp UPG1 Projektuppgift (U, G), 2 hp Lisp historik 1959 John McCarthy - Lisp 1.5 LISP = LISt Processing language utvecklats inom forskningsmiljön inom artificiell intelligens INTERLISP/Medley (BBN, Xerox, Lispmaskiner) MacLISP (MIT) Scheme (används i Data och programstrukturer) I samband med kommersialisering av språket togs ny standard fram: Common Lisp Lisp/Scheme används idag bl a som inbyggt programspråk i tillämpningar: - emacs bygger på elisp - cadsystem, autocad - utvecklingsmiljöer för spelindustrin Se gärna Franz www-sidor (som tillhandahåller Allegro Lispsystem) och som grundläggande programmeringsspråk i många datautbildningar. 15 16 Egenskaper i Lisp - enkel syntax (men mycket parenteser) - interaktion med språket sker genom en REPL (Read-Eval-Print-Loop) - språket är i grund interpretativt, dvs program beräknas av en intepretator - program kan kompileras till maskinkod - möjlighet att själv anropa de centrala interpretatorfunktionerna eval och apply (funcall) - man kan själv under beräkning skapa nya program som ges till beräkning, som används för sk makroutveckling - en delmängd pure Lisp kan enkelt beskrivas i Lisp, funktionen eval. Beskriver språkets semantik Lisp s påverkan på andra språk Ett stort antal konstruktioner har sitt ursprung från Lisp-språket - listor - extern notation av dataobjekt - rekursion - minneshantering - garbage collection - eval-modell - funktioner som data, lambda-uttryck Många nya programspråk idag har idag inkluderat många konstruktioner från Lisp inbyggt i språket symboler och listor (Python, Ruby) Funktioner som dataobjekt, lambda-uttryck, closure (Python, Ruby, C++) Top loop (REPL) (Python, Ruby)
17 Funktionell programmering Har nu kommit på ropet igen. Microsoft kommer med F#. Ett Ericsson-utvecklat språk Haskell används idag av många företag (t ex Klarna) Nu är det för att få enkla program som lättare går att kompilera till parallellitet, tex när vi har fler kärnor i en dator. Man vill komma ifrån den imperativa modellen där man i programmet där man lägger satser sekventiellt (efter varandra) vilket gör det svårare att utnyttja parallelliteten.