Sista delen av kursen handlar om hur program, delprogram och datatyper deklareras och vad det man åstadkommit egentligen betyder. Innehåll Syntaktisk (hur ser det ut) och semantisk (vad betyder det) beskrivning Paradigm (syn- och tankesätt och dess konsekvenser) Namn, variabler, värden, typer Bindningar och omgivningar Funktion- och procedurabstraktion Inkapsling Typsystem - monomorfism, något om polymorfism, subtypning, typkonvertering Villkorlig bearbetning - något om hopp och undantagshantering DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 1 / 29
Programspråkslingvistik Skiljer sig från lingvistik för naturliga(?) språk genom Enklare grammatik (kontextfri) Begränsat antal språkelement Entydig tolkning av satser Mindre redundans Mindre uttrycksfulla Båda har syntax (vilka satser är möjliga) och semantik (vad betyder en sats). Syntaxen beskrivs med syntaxdiagram eller BNF (EBNF). Semantiken kan beskrivas matematiskt, men beskrivs oftast ungefärligt med hjälp av exempel. DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 2 / 29
Ett programspråk Ett programspråk är en notation för abstrakt beskrivning av algoritmer i en viss paradigm. En paradigm är ett sätt att tänka och varje programspråk understödjer i allmänhet en paradigm (imperativ programmering, funktionell programmering, logikprogrammering, objektorienterad programmering). Varje programspråk är uppbyggt kring ett antal begrepp som dataabstraktion programabstraktion omgivning typning tillstånd rekursion iteration DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 3 / 29
De begrepp som ingår varierar från språk till språk, mest beroende på paradigm, men ett begrepp kan ingå i flera olika språk baserade på olika paradigm. Terminologin är hämtad från ett stort antal andra discipliner och begreppskollisioner uppstår mellan olika paradigm. DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 4 / 29
För att ett programspråk skall vara användbart måste det uppfylla några grundläggande krav. DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 5 / 29
För att ett programspråk skall vara användbart måste det uppfylla några grundläggande krav. Det skall vara universellt alla problem som kan lösas med hjälp av dator skall kunna lösas med språket DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 5 / 29
För att ett programspråk skall vara användbart måste det uppfylla några grundläggande krav. Det skall vara universellt alla problem som kan lösas med hjälp av dator skall kunna lösas med språket naturligt det skall vara rimligt begripligt DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 5 / 29
För att ett programspråk skall vara användbart måste det uppfylla några grundläggande krav. Det skall vara universellt alla problem som kan lösas med hjälp av dator skall kunna lösas med språket naturligt det skall vara rimligt begripligt implementerbart det skall gå att realisera språket på en dator så att enligt språket korrekta program kan exekveras DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 5 / 29
För att ett programspråk skall vara användbart måste det uppfylla några grundläggande krav. Det skall vara universellt alla problem som kan lösas med hjälp av dator skall kunna lösas med språket naturligt det skall vara rimligt begripligt implementerbart det skall gå att realisera språket på en dator så att enligt språket korrekta program kan exekveras effektivt det skall vara rimligt effektivt i förhållande till andra språk (??) DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 5 / 29
För att ett programspråk skall vara användbart måste det uppfylla några grundläggande krav. Det skall vara universellt alla problem som kan lösas med hjälp av dator skall kunna lösas med språket naturligt det skall vara rimligt begripligt implementerbart det skall gå att realisera språket på en dator så att enligt språket korrekta program kan exekveras effektivt det skall vara rimligt effektivt i förhållande till andra språk (??) konsekvent det skall inte understödja flera paradgim (en huvudparadigm, helst en enda) DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 5 / 29
Universalitet och implementerbarhet är inte svåra att uppnå. Naturlighet och konsekvens är sällan väl genomfört. Effektivitetsaspekten är tillfredsställd i olika avseenden (för olika typer av tillämpningar) i olika språk. DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 6 / 29
Assembler: start: move 1, reg1 move n, reg0 loop: jmpz exit mul reg0, reg1, reg1 decr reg0 jmp loop exit: stop DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 7 / 29
Assembler: start: move 1, reg1 move n, reg0 loop: jmpz exit mul reg0, reg1, reg1 decr reg0 jmp loop exit: stop Scheme: (define (fac n) (if (= n 0) 1 (* n (fac (- n 1))))) DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 7 / 29
ML: fun fac n = if n = 0 then 1 else n * fac (n - 1) DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 8 / 29
ML: fun fac n = if n = 0 then 1 else n * fac (n - 1) Pascal: FUNCTION fac(n: integer): integer; VAR i, res: integer; BEGIN res := 1; FOR i := 2 TO n DO res := res * i; fac := res; END; DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 8 / 29
Prolog: fac(0, 1). fac(n, N * X) :- N > 0, fac(n - 1, X). DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 9 / 29
Prolog: fac(0, 1). fac(n, N * X) :- N > 0, fac(n - 1, X). Syntax kommer inte vara föremål för diskussion, utan snarare utgångspunkt för diskussion om semantik. DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 9 / 29
Lite historia Fortran Algol60 Cobol Lisp Simula Algol68 PL/I Smalltalk Pascal C Prolog ML C++ Ada Scheme Miranda clpr Java Haskell DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 10 / 29
Värden och typer Datorprogram hanterar data och är i sig själva data. Värden och program representeras av data. Data är endast bitmönster och måste tolkas i enlighet med någon datatyp. DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 11 / 29
Värden och typer Datorprogram hanterar data och är i sig själva data. Värden och program representeras av data. Data är endast bitmönster och måste tolkas i enlighet med någon datatyp. Värden som är vanligt förekommande i program är primitiva (sanningsvärden, tecken, heltal, reella tal, strängar) sammansatta (poster, mängder, filer, par, listor) pekare (adress till... ) referenser (namn på... ) procedurer och funktioner (program) DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 11 / 29
Värden och typer... En datatyp är en mängd värden på vilka man opererar på ett uniformt sätt (en mängd värden och en mängd operatorer). Värden hanteras olika i olika språk. Scheme hanterar alla värden på samma sätt medan de flesta andra språk har olika grad av begränsningar i hanteringen. En typ (datatyp) är en mängd värden och en operationsmängd. DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 12 / 29
Värden och typer... En datatyp är en mängd värden på vilka man opererar på ett uniformt sätt (en mängd värden och en mängd operatorer). Värden hanteras olika i olika språk. Scheme hanterar alla värden på samma sätt medan de flesta andra språk har olika grad av begränsningar i hanteringen. En typ (datatyp) är en mängd värden och en operationsmängd. Ex (Pascal): typen Integer = {0, ±1,..., ±MaxInt}, med operationsmängden {+,,, DIV, MOD,ˆ}. typen Boolean = {TRUE, FALSE}, med operationsmängden {NOT, AND, OR, ANDALSO, ORELSE, =} Att a är av typen Integer skrivs a Integer. DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 12 / 29
Värden och typer... Alla programspråk har både primitiva och sammansatta typer. DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 13 / 29
Värden och typer... Alla programspråk har både primitiva och sammansatta typer. En typs värdemängd kallas typens domän. DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 13 / 29
Värden och typer... Alla programspråk har både primitiva och sammansatta typer. En typs värdemängd kallas typens domän. Ett värde är, i programspråkssammanhang, atomiskt om man inte behöver någon speciell struktur för att representera värdet. DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 13 / 29
Värden och typer... Alla programspråk har både primitiva och sammansatta typer. En typs värdemängd kallas typens domän. Ett värde är, i programspråkssammanhang, atomiskt om man inte behöver någon speciell struktur för att representera värdet. Atomiska typer kallas ofta primitiva. DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 13 / 29
Värden och typer... Alla programspråk har både primitiva och sammansatta typer. En typs värdemängd kallas typens domän. Ett värde är, i programspråkssammanhang, atomiskt om man inte behöver någon speciell struktur för att representera värdet. Atomiska typer kallas ofta primitiva. En typ kallas atomisk om alla värden i domänen är atomiska, t.ex: heltal, booleska värden,... DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 13 / 29
Värden och typer... Alla programspråk har både primitiva och sammansatta typer. En typs värdemängd kallas typens domän. Ett värde är, i programspråkssammanhang, atomiskt om man inte behöver någon speciell struktur för att representera värdet. Atomiska typer kallas ofta primitiva. En typ kallas atomisk om alla värden i domänen är atomiska, t.ex: heltal, booleska värden,... En typ som är primitiv i ett språk kan vara nödvändigt att representera som sammansatt i ett annat. DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 13 / 29
Värden och typer... Alla programspråk har både primitiva och sammansatta typer. En typs värdemängd kallas typens domän. Ett värde är, i programspråkssammanhang, atomiskt om man inte behöver någon speciell struktur för att representera värdet. Atomiska typer kallas ofta primitiva. En typ kallas atomisk om alla värden i domänen är atomiska, t.ex: heltal, booleska värden,... En typ som är primitiv i ett språk kan vara nödvändigt att representera som sammansatt i ett annat.därför måste en uppräkning vara språkberoende. DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 13 / 29
Värden och typer... En typ uppträder ofta under olika namn i olika språk. Typ Scheme Pascal ML Heltal integer Integer int Reella tal real Real real Teckensträng string string Sanningvärde boolean Boolean bool Delintervall a..b DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 14 / 29
Värden och typer... En typ uppträder ofta under olika namn i olika språk. Typ Scheme Pascal ML Heltal integer Integer int Reella tal real Real real Teckensträng string string Sanningvärde boolean Boolean bool Delintervall a..b Operationsmängderna är alltid fördefinierade. Man delar ofta in de primitiva typerna i kontinuerliga och diskreta (men de kontinuerliga måste representeras med en diskretisering). De primitiva typerna i Pascal är bl.a. Integer, Real, Char och Boolean. DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 14 / 29
Värden och typer... Sammansatta typer: DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 15 / 29
Värden och typer... Sammansatta typer: Kartesiska produkter. par, tripler,... av värden ur redan definierade typer (tupler). Ex: 3, abc Integer String DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 15 / 29
Värden och typer... Sammansatta typer: Kartesiska produkter. par, tripler,... av värden ur redan definierade typer (tupler). Ex: 3, abc Integer String Disjunkta unioner. Värden ur alternativa domäner. Ex: x Boolean String DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 15 / 29
Värden och typer... Sammansatta typer: Kartesiska produkter. par, tripler,... av värden ur redan definierade typer (tupler). Ex: 3, abc Integer String Disjunkta unioner. Värden ur alternativa domäner. Ex: x Boolean String Avbildningar. Ex: om namn = Kalle namn[5] = e så 5 e Integer Char DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 15 / 29
Värden och typer... Potensmängder. Ex: om a = {1, 2, 3} så blir potensmängden av a alla delmängder av a = {{}, {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}}. DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 16 / 29
Värden och typer... Potensmängder. Ex: om a = {1, 2, 3} så blir potensmängden av a alla delmängder av a = {{}, {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}}. Rekursiva typer. Ex: listor av heltal DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 16 / 29
Värden och typer... Potensmängder. Ex: om a = {1, 2, 3} så blir potensmängden av a alla delmängder av a = {{}, {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}}. Rekursiva typer. Ex: listor av heltal Subtyper Ex: a.. z DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 16 / 29
Kartesiska produkter Kartesiska produkter är en mängd av ordnade värden och S T betyder alla ordnade par s, t där s S och t T. Obs! att s och t kan vara sammansatta. Ex: S = {TRUE, FALSE}, T = {gul, cyan, purpur}. S T = { TRUE, gul, TRUE, cyan, TRUE, purpur, FALSE, gul, FALSE, cyan, FALSE, purpur } DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 17 / 29
Kartesiska produkter... Scheme kan återsända godtyckliga strukturer (define newsxt (lambda (news newt) (cons news newt))) (define spart (lambda (SxT) (car SxT))) (define tpart (lambda (SxT) (cdr SxT))) DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 18 / 29
Disjunkt union I disjunkta unioner måste värdena märkas för att det skall gå att veta vilken domän aktuellt värde tillhör. Ex: S = {TRUE, FALSE}, T = {gul, cyan, purpur}. Den disjunkta unionen S + T innehåller värdena {TRUE, FALSE, gul, cyan, purpur}, men för att kunna skilja mellan olika typer av värden i den disjunkta unionen måste vi deklarera namn som fungerar som etiketter. DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 19 / 29
Avbildningar är funktioner från en datamängd D till en annan datamängd R. Skrivs D R och kan realiseras med hjälp av antingen funktioner eller listor. I de flesta system finns funktioner och kontinuerliga listor (array) fördefinierade. Ex: D = {jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec} R = {winter, spring, summer, autumn} D R = {(jan winter), (feb winter), (mar winter), (apr spring), (may spring), (jun summer), (jul summer), (aug summer), (sep autumn), (oct autumn), (nov autumn), (dec winter)} DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 20 / 29
Avbildningar... I Scheme kan man göra en associationslista av par av månadsnummer, årstid (define season-list ((jan. winter) (feb. winter) (mar. winter) (apr. spring) (may. spring) (jun. summer) (jul. summer) (aug. summer) (sep. autumn) (oct. autumn) (nov. autumn) (dec. winter))) DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 21 / 29
Avbildningar... I Scheme kan man göra en associationslista av par av månadsnummer, årstid (define season-list ((jan. winter) (feb. winter) (mar. winter) (apr. spring) (may. spring) (jun. summer) (jul. summer) (aug. summer) (sep. autumn) (oct. autumn) (nov. autumn) (dec. winter))) (define (month->season month season-list) (cond ((null? season-list) undefined) ((eq? month (caar season-list)) (cdar season-list)) (else (month->season month (cdr season-list))))) month->season har typen (month seasonassociationlist) season DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 21 / 29
Avbildningar... (define (month->season month) ;; med array (let ((month-list #(jan feb mar apr may jun jul aug sep oct nov dec)) (season-list #(winter winter winter spring spring summer summer summer autumn autumn autumn winter))) (define (loop n) (cond ((> n 11) undefined) ((eq? month (vector-ref month-list n)) (vector-ref season-list n)) (else (loop (+ n 1))))) (loop 0))) DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 22 / 29
Avbildningar... (define (month->season month) ;; med array (let ((month-list #(jan feb mar apr may jun jul aug sep oct nov dec)) (season-list #(winter winter winter spring spring summer summer summer autumn autumn autumn winter))) (define (loop n) (cond ((> n 11) undefined) ((eq? month (vector-ref month-list n)) (vector-ref season-list n)) (else (loop (+ n 1))))) (loop 0))) (define (month->season month) ;; med case-uttryck (case month ((dec jan feb mar) winter) ((apr may) spring) ((jun jul aug) summer) ((sep oct nov) autumn) (else undefined))) DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 22 / 29
Potensmängd En potensmängd representerar mängden av alla värden som en mängd kan anta. De flesta språk har ingen inbyggd mekanism för att hantera mängder. Pascal är ett av få undantag. Ex.: Potensmängden 2 season ={{}, {winter}, {spring},..., {winter, spring}, {winter, summer},..., {winter, spring, summer},..., {winter, spring, summer, autumn}} 2 S ={a a S} DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 23 / 29
Potensmängd... I Pascal: TYPE season = (winter, spring, summer, autumn); period = SET OF season; DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 24 / 29
Potensmängd... I Pascal: TYPE season = (winter, spring, summer, autumn); period = SET OF season; I Scheme: (define set (1 2 3)) DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 24 / 29
Potensmängd... I Pascal: TYPE season = (winter, spring, summer, autumn); period = SET OF season; I Scheme: (define set (1 2 3)) (define (ps set) (if (null? set) (()) (let ((r (ps (cdr set)))) (append (map (lambda (s) (cons (car set) s)) r) r)))) DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 24 / 29
Rekursiva typer Rekursivt definierade typer är sådana typer som kan definieras i termer av sig själva. Ex: En lista med heltal kan definieras som: En lista med heltal = antingen tom eller ett heltal följt av en lista med heltal. nil står för den tomma listan. DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 25 / 29
Rekursiva typer Rekursivt definierade typer är sådana typer som kan definieras i termer av sig själva. Ex: En lista med heltal kan definieras som: En lista med heltal = antingen tom eller ett heltal följt av en lista med heltal. nil står för den tomma listan. heltalslista = nil (heltal heltalslista) Eller: L = nil + (S L) DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 25 / 29
Rekursiva typer... I Scheme () (cons 3 ()) (cons 2 (list 3)) (list 2 3) DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 26 / 29
Rekursiva typer... I Pascal krävs pekarstrukturer för att realisera sådana typer, men i ML finns möjlighet till rekursiv definition av typer och dessutom finns fördefinierat ett brett spektrum av listtyp-konstruktorer. DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 27 / 29
Rekursiva typer... I Pascal krävs pekarstrukturer för att realisera sådana typer, men i ML finns möjlighet till rekursiv definition av typer och dessutom finns fördefinierat ett brett spektrum av listtyp-konstruktorer. Ex: heltalslistor type integerlist = int list; datatype integerlist = nil of unit cons of int * integerlist; (* får skrivas som: *) datatype integerlist = nil cons of int * integerlist; DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 27 / 29
Rekursiva typer... I Pascal krävs pekarstrukturer för att realisera sådana typer, men i ML finns möjlighet till rekursiv definition av typer och dessutom finns fördefinierat ett brett spektrum av listtyp-konstruktorer. Ex: heltalslistor type integerlist = int list; datatype integerlist = nil of unit cons of int * integerlist; (* får skrivas som: *) datatype integerlist = nil cons of int * integerlist; med typkonstruktorn list har man tillgång till alla tänkbara listor i ML, ex: type realnumberlist = real list; DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 27 / 29
Subtyper Subtyper är restriktioner på en redan definierad typ (delmängd). Ex: A B, där B är t ex mängden av alla heltal I Pascal kan subtyper definieras av varje diskret typ, men bara som delintervall. Ex: TYPE smallint = -255..255; smallletter = a.. z ; fineseason = spring..autumn; Förutom i Pascal finns dessa i Modula (2, 3, 4) och ADA DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 28 / 29
Nästa gång: När upptäcks typfel? Vad är ett uttryck? DA2001 (Föreläsning 22) Datalogi 1 Hösten 2010 29 / 29