Polymorfi (många skepnader) är egentligen en mängd olika abstraktionsmekanismer och en indelning skulle kunna se ut så här: polymorfi

Relevanta dokument
Lagring... DA2001 (Föreläsning 23) Datalogi 1 Hösten / 68

Sista delen av kursen

Programspråkslingvistik. Sista delen av kursen. Ett programspråk

Pascal. reserverade ord fördefinierade funktioner och procedurer egendefinierade funktioner, procedurer och objekt

Pascal... Pascal. Pascal... Pascal...

Sista delen av kursen

Några saker till och lite om snabbare sortering

Omgivningar. Omgivningar är viktiga eftersom de avgör vilka namn som är synliga och därmed dessas innebörd och de värden som är förknippade med dem.

GOTO och lägen. Några saker till och lite om snabbare sortering. GOTO och lägen (3) GOTO och lägen (2)

Typsystem. DA2001 (Föreläsning 23) Datalogi 1 Hösten / 19

Typsystem. Typsystem... Typsystem... Typsystem... 2 *

Deklarationer/definitioner/specifikationer

Abstraktion. procedurabstraktion. DA2001 (Föreläsning 26) Datalogi 1 Hösten / 27

Abstraktion. Abstraktion... Abstraktion... Abstraktion...

Imperativ programmering. Föreläsning 2

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Dagens föreläsning Programmering i Lisp. - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning

Objektorienterade programmeringsspråk. Objektorienterade språk. Den objekt-orienterade modellen. Jämför med icke-oo

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

GRUNDER I VHDL. Innehåll. Komponentmodell Kodmodell Entity Architecture Identifierare och objekt Operationer för jämförelse

Föreläsning 5: Introduktion av pekare

Föreläsning 6: Introduktion av listor

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson

Standardfilerna Input och Output

Standardfilerna Input och Output. Filer... Filer... vanlig utbyggnad för ökad dynamik. Filer... filtyper

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Introduktion till Jasmine 1.2 ODQL

Programmeringsteknik med C och Matlab

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Bakgrund och motivation. Definition av algoritmer Beskrivningssätt Algoritmanalys. Algoritmer. Lars Larsson VT Lars Larsson Algoritmer 1

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Datalogi, grundkurs 1. Lösningsförslag till tentamen

Föreläsning 2 Programmeringsteknik och C DD1316. Programmering. Programspråk

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

DAT043 Objektorienterad Programmering

Språket Python - Del 1 Grundkurs i programmering med Python

Tentamen Grundläggande programmering

Föreläsning 15: Parallella subrutiner. Parallellitet. Varför parallella underprogram?

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

1/15/2013. DD1310/DD1314/DA3009 Programmeringsteknik. Lärandemål... Vilka läser kursen? ...fler lärandemål VARFÖR? Föreläsning 1

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

F4. programmeringsteknik och Matlab

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Kontinuerliga listor. Fält (listor) Kontinuerliga listor... Kontinuerliga listor...

Datalogi I, grundkurs med Java 10p, 2D4112, Fiktiv tentamen, svar och lösningar och extra kommentarer till vissa uppgifter 1a) Dividera förs

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

DD1314 Programmeringsteknik

Introduktion till programmering SMD180. Föreläsning 2: Variabler, uttryck och satser

Föreläsning 3-4 Innehåll

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

Grundkurs Programmering

Datalogi, grundkurs 1. Lösningsförslag till tentamen

Imperativ programmering. Föreläsning 4

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

Imperativ programmering. Föreläsning 3

Klassdeklaration. Metoddeklaration. Parameteröverföring

DD1310/DD1314/DA3009 Programmeringsteknik LÄRANDEMÅL... Vilka läser kursen? ...FLER LÄRANDEMÅL. Föreläsning 1

Några saker till och lite om snabbare sortering

Föreläsning 2 sept 05 (Onsdag v 36). DD Chapter 2.

Objektorienterad programmering

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Föreläsning 2. Täcker material från lektion 1, 2, 3 och 4:

Funktioner, Procedurer och Parametrar. Funktioner, Procedurer och Parametrar... Funktioner, Procedurer och Parametrar procedurspecifikation

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Objektorienterad Programmering (TDDC77)

Repetition i Pascal. Exemplen fac. Exemplen fac i Pascal. Exemplen fac motivering. Orginalet

Variabler, värden och typer

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

Enkla datatyper minne

Digitalitet. Kontinuerlig. Direkt proportionerlig mot källan. Ex. sprittermometer. Elektrisk signal som representerar ljud.

Programmering A. Johan Eliasson

Typkonvertering. Java versus C

Programmeringsteknik med C och Matlab

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Grundläggande datalogi - Övning 1

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

Hjälpmedel för kompilatorkonstruktion, DVB004

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Testning av program. Verklig modell för programutveckling

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Ingenjörsfirman Stéen Java Sida 1 av 1

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

Variabler, värden och typer

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Strukturdiagram. Styra. Algoritmer. Val

Sökning och sortering

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

1 Comparator & Comparable

Twincat: PLC Control

Översikt. Varför lära sig detta? Motivering Syntax och semantik Imperativa språkets byggstenar och Python. PL-boken Kap 1 (repetition):

Generics och polymorfism. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Laboration 1: Figurer i hierarki

Introduktion till formella metoder Programmeringsmetodik 1. Inledning

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

Några inbyggda funktioner (med resultat!) Introduktion till programmering D0009E. Föreläsning 4: Villkor och rekursion. Modulus-operatorn.

Transkript:

Polymorfi Polymorfi (många skepnader) är egentligen en mängd olika abstraktionsmekanismer och en indelning skulle kunna se ut så här: polymorfi universell ad hoc parametrisk inclusion coersion overloading DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 1 / 28

Parametrisk polymorfi Parametrisk polymorfi är svår att skilja från generik, men det finns en skillnad. Parametrisk polymorfi betyder att en funktion (procedurer) accepterar ett antal olika typer av parametrar, medan en generisk funktion/procedur/datastruktur vid instansiering ger en ny funktion/procedur/datastruktur som är specialanpassad till den aktuella typen. Parametrisk polymorfi har vi i fördefinierade funktioner i många språk, där den aktuella typen ger val av funktion som till slut hanterar problemet. Write/WriteLn i Pascal accepterar godtyckliga utskrivbara värden, vilka konverteras till text och skrivs på fil/skärm. En hel mängd med olika procedurer finns i bakgrunden för att konvertering skall ske på rätt se. Parametrisk polymorfi finns i ML, som accepterar godtyckliga typer som argument till funktioner om ingen bearbetning av värden sker. DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 2 / 28

Parametrisk polymorfi... Exempel: fun id x = x; fun first (x,y) = x; fun first (x::y) = x; fun second (x,y) = y; fun second (x::y) = y; DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 3 / 28

Generik Generiska funktioner och procedurer och även typer finns i många språk, t.ex. Java och ADA. Enklast är ett exempel med en tänkt utbyggnad av Pascal. FUNCTION id <T>(i: T): T; VAR t1 : T; BEGIN id := i END; FUNCTION f<t>(i:t; PROCEDURE todo(var j:t)): T; BEGIN todo(i); f := i END; DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 4 / 28

Generik... FUNCTION intid := id <Integer>; FUNCTION RealF := f <Real>; DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 5 / 28

Monomorfi Parametrisk polymorfi innebär abstraktioner där information om parametertypen inte är uttömmande. Motsatsen till polymorfi är monomorfi. Monomorfi föreligger i statiskt typade språk som Pascal, C. Undantag är fördefinierade procedurer och funktioner som abs, eof, eoln (Pascal). Övriga statiskt typade språk har i huvudsak monomorfi, men många har mekaismer för parametrisk polymorfi. Tex har Simula viss, begränsad parametrisk polymorfi, ML kräver inte att en typ skall bestämmas om inte typberoende operationer ingår i algoritmen till en funktion, Scheme har parametrisk polymorfi (define (f x) (cond ((atom? x)...) ((number? x)...) (...))) DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 6 / 28

Overloading (överladdning) samma namn för många olika funktioner. Systemet avgör vilken funktion som skall anropas baserat på indatatypen. T. ex. fungerar +, och på alla typer av tal (i de flesta av språken) och mängder (Pascal). I vissa varianter av Standard ML finns overloading (NJSML) och det finns även i ADA, C++ och Java. Exempel: (Pascal) heltalsnegering (int int) flyttalsnegering (real real) heltalssubtraktion (int int int) flyttalssubtraktion (real real real) mängddifferens (set set set) DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 7 / 28

Omgivningsoberoende överladdning Inparametrarnas typ avgör vilken funktion som anropas vid varje enskilt anrop. Tillämpas i t.ex. Pascal och ML, exempel: Abs(i) (int int) Abs(r) (real real) Omgivningsberoende överladdning: I ADA gäller normalt för / att (int int int) eller (real real real) beroende på inparametertyperna men man kan i någon omgivning deklarera / t ex som (int int real) varvid denna lokala överladdning av funktionen anropas istället för (int int int)-varianten i den aktuella omgivningen. DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 8 / 28

Parametriserade typer Parametriserade typer är typer som accepterar typer som argument och genererar en ny typ. Parametriserade typer är abstraktioner av abstraktioner, vars instanser är abstraktioner där en familj av typer ersatts av en typ. Det som ligger närmast till hands för exempel är Pascals filer: FILE OF Integer, File of Char, TEXT, o.s.v. eller de generiska listorna i ML: type intlist = int list; där intlist är en instans av den inbyggda generiska listtypen a list. I Java finns det inbyggt i språket att alla datatyper "ärver" typen Object. Allt är m a o subtyper (i någon mening) till denna typ. Fullt polymorfa lagringsstrukturer tillhandahålls för listor, träd, stackar, köer,... DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 9 / 28

Typinferens Monomorf typinferens: fun even n = n mod 2 = 0; fun plus m n = m + n; int bool even n? = plus mod 0 int m? n + n 2 int m n DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 10 / 28

Typinferens... fun incr m = m + 1; incr m + m 1 Polymorf typinferens = operationen OK trots att entydig info om inparametertyper inte finns, men det finns en entydig relation mellan in- och utdata. Exempel: fun id x = x; fun fst x y = x; id fst x x x y x DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 11 / 28

Typkonvertering måste ske (om möjligt) då en operation kräver en viss typ av argument men erhåller ett värde av en annan typ. Pascal har automatisk konvertering från integer till real i ett antal fall. Exempel: VAR r: Real; i: Integer; i := 12; r := i / 5; Här konverteras i s värde till 12.0 och 5 till 5.0 eftersom flyttalsdivision kräver att operanderna är flyttal. Resultatet läggs i variabeln som r refererar till. i := r / 5 blir fel eftersom 5 konverteras till 5.0 och r / 5.0 ger ett flyttal, men någon automatisk konvertering till heltal finns inte i Pascal. DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 12 / 28

Typkonvertering... I Simula hade det gått bra eftersom resultatet trunkeras till ett heltal. I ML går ingendera varianten eftersom typkonvertering sker explicit: real int genom floor som trunkerar och int real genom funktionen real. I ADA finns en mängd funktioner med samma namn som typen för konvertering till en viss typ, men ingen implicit konvertering. DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 13 / 28

Subtyper Subtyper finns i en mängd olika skepnader. Den enklaste är den som finns i Pascal. TYPE weekday = (mon, tue, wed, thu, fri, sat, sun); workday = mon.. fri; weekendday = sat.. sun; natural = 0.. MaxInt; smallint = -255.. 255; smallletter = a.. z ; Man kan i Pascal definiera subtyper till alla diskreta typer. Alla sådana blir då delintervall av den ursprungliga domänen. Alla operationer som finns i den ursprungliga typen finns även tillgängliga för subtypen. Man säger att subtypen ärvt alla operationer. I vissa språk kan man lägga till attribut (egenskaper) och modifiera operationsmängden (Simula, Smalltalk, C++, Borland Pascal, Eiffel, m fl). DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 14 / 28

Hopp och avbrott Hittills har vi studerat programkonstruktioner vars semantik inte är svårförståelig. "Utför a och b och c och...", "utför a eller b beroende på c", "utför a tills b", "utför a så länge b gäller", "utför a b ggr"... Det är enkelt att följa skeendet, sematiken är klar, men man kan inte skapa avbrott som hoppar över/eller ut ur en programmodul vid plötsliga felsituationer. Därför finns i de flesta programspråk kommandon för att avbryta ett program eller en del av ett program eller för att hoppa till en annan plats i programmet. DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 15 / 28

Hopp och avbrott... Normalt programflöde beskrivs av begreppen sekvens, val och upprepning. Alla tre är väldefinierade. Alla tre förutsätter att programflödet fortsätter utan hinder. Ett hopp är ett direkt kommando till programmet att fortsätta exekvera någon annanstans. Vanligast: goto label där label är en identifierare, ett radnummer, eller en speciellt deklarerad etikett. I Scheme finns inte hopp av detta slag. I Pascal finns hopp, men det finns restriktioner avseende användningen. DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 16 / 28

Hopp och avbrott... Ex: PROGRAM jumptest(input, Output); LABEL 999; <övriga deklarationer> BEGIN... goto 999;... 999:...... END; Etiketter eller lägen av detta slag måste vara numeriska och måste deklareras. Man får inte hoppa in i ett block eller en slinga. Man får hoppa ut ur block och slingor. Man kan hoppa vart som helst så länge man inte bryter mot ovanstående. DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 17 / 28

Hopp och avbrott... Följande är alltså förbjudet: PROGRAM a; LABEL 3; VAR q, r: Char; BEGIN q := a ; r := x ; GOTO 3; WHILE q < r DO BEGIN q := succ(q); 3: WriteLn( hej hopp ) END END. DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 18 / 28

Hopp och avbrott... Men detta är tillåtet: PROGRAM a; LABEL 3, 4, 5; VAR q, r: Char; BEGIN q := a ; r := x ; GOTO 3; 4: IF q >= r THEN GOTO 5; q := Succ(q); 3: WriteLn(q, : hej hopp ); GOTO 4; 5: END. DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 19 / 28

Hopp och avbrott... Med hopp framåt och bakåt i koden försvåras förståelsen av programmet och semantiken blir mycket komplicerad. Det är tungt för systemet att avveckla ett eller flera block p g a ett hopp, men det kan bli nödvändigt. Normalt undviker man hopp bakåt i koden eftersom det enkelt går att göra slingor som eliminerar behovet. De enda hopp framåt som man brukar tillåta är uthopp för att åtgärda fel eller avbryta programmet om ett fatalt fel uppstått. Exempel: PROGRAM feluthopp(input, Output); LABEL 998,999;... PROCEDURE fatalerror(msg: errormsg); BEGIN WriteLn(msg); GOTO 999; END; DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 20 / 28

Hopp och avbrott... PROCEDURE nonfatalerror(msg: errormsg); BEGIN WriteLn(msg); GOTO 998; END; BEGIN {Huvudprogram} WHILE status <> quit DO BEGIN... IF <villkor1> THEN fatalerror(... );... IF <villkor2> THEN nonfatalerror(... );... 998:... END {WHILE}; 999:... END. DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 21 / 28

Hopp och avbrott... Ex: (fult och onödigt)... 1:...... IF <villkor> THEN GOTO 1 ELSE GOTO 2; 2:... Med sådana program blir livet inte lätt (men de finns!). Ex: FORTRAN: 1...... 65...... IF v 65, 1, 2... 2... DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 22 / 28

Hopp och avbrott... I Simula behöver man inte deklarera lägen men kan göra det. Och värre - de kan sändas som parametrar: PROCEDURE recx(exit, i); NAME exit; LABEL exit; INTEGER i; BEGIN exit: IF i > 10 THEN GOTO exit ELSE recx(exit, i+1); END; Vilket av alla lägen exit skall man hoppa till vid anropet recx(quit,10)? Skall man hoppa till något globalt läge som heter quit? Ibland ser man maskerade goto, som kallas escape, exit, continue, cycle,... Dessa är naturligtvis goto med speciell semantik. FOR i := 1 TO 25 DO BEGIN exit WHEN v1; continue WHEN v2; sats; END; DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 23 / 28

Hopp och avbrott... Efter en berömd artikel av Donald Knuth kallad: Goto considered harmful? började försök att hitta mer strukturerade sätt att hantera problemet med att extraordinära åtgärder ibland är ofrånkomliga. Knuth pekade bland annat på att struktureringsmekanismer och grafiska hjälpmedel uppmuntrade spagettiprogrammering. Flödesplaner, som används flitigt, ansågs vara ett bra sätt att erhålla spagettiprogram. Pseudokod är bättre, men bäst är att inte använda goto, utan se sig om efter effektivare verktyg. DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 24 / 28

Hopp och avbrott... EXCEPTIONS Införande av hantering av exceptionella situationer har i vissa språk helt eliminerat behovet av goto. Ex: (ADA) PROCEDURE divide (x,y: Integer): Integer; DivideException: EXCEPTION; BEGIN IF y = 0 THEN RAISE DivideException ELSE divide := x DIV y; EXCEPTION WHEN DivideException => PUT_LINE ("försök att dividera med 0"); raise; -- låt systemet avsluta programmet END; {divide} DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 25 / 28

Hopp och avbrott... Man kan låta bli det sista raise-kommandot. Då anses felet hanterat på tillfredsställande sätt. Det sista raise-kommandot säger till systemet att sända vidare DivideException tills en till hanterare påträffas. I det här fallet finns ingen eftersom avbrottet deklarerats lokalt och programmet avslutas då. DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 26 / 28

Hopp och avbrott... I Java: try { try { this; this; that; that; } } catch (Exception e) { catch (IOException e) { cleanup; fixproblem(e) ; } } finally { always; } DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 27 / 28

SLUT! DA2001 (Föreläsning 27) Datalogi 1 Hösten 2010 28 / 28