Programmering?? Handlar mycket om att avbilda (modellera) objekt,fenomen och processer från den fysiska världen Vad har vi för byggstenar tillhands i detta arbete? 1 Anders Broberg, Programspråksteoridelen DVA Moment 2 Datatyper FORTRAN 1 (1956) - hade INTEGER, REAL, arrays Ada (1983) - Gav programmeraren möjlighet att skapa unika typer för varje kategori av variabel – Närmar oss abstrakta datatyper En deskriptor är en samling av attribut till en variabel (namn, typ,adress,..) – Om alla attributen är statiska behövs deskriptorn bara vid kompileringen annars så behövs hela eller delar av den under exekveringen. Designfrågor för alla datatyper – Hur skall man referera till variabler (syntaxen)? » X=3.14; » X:= 3.14; » Y = x+3; – Vilka operationer är definierade för och hur är de specificerade? 2 Anders Broberg, Programspråksteoridelen DVA Moment 2 Primitiva datatyper Sådana datatyper som inte kan definieras i termer av andra datatyper Heltal (integer) – Nästan alltid en exakt avbildning av hårdvaran så avbildningen är nästan trivial » 0001 0001 <=>17 » 0000 0000 <=> 0 Decimal (special flytal) – Används i ”busiess applications (COBOL?) » Lagrar ett fixt antal decimaler 3 Bättre noggrannhet Begränsat omfång minnesslöseri Anders Broberg, Programspråksteoridelen DVA Moment 2 Mer primitiva datatyper Flyttal – Modellerar reella tal, men är endast en aproximation – Språk för vetenskapliga beräkning brukar åtminstone ha två flyttalstyper ibland fler – Vanligtvis lika som hårdvaran men inte alltid en del språk så som Ada tillåter noggrannhets spec. i koden. » Type SPEED is digits 7 range 0.0..1000.0; » Type voltage is delta 0.1 range 12.0..34.5; – Implementationsmässigt så delas ett flyttal upp i en decimaldel och en exponentdel » Decimaldelen styr noggrannhet » Exponentdelen styr storleken Boolean -sanningsvärden – sant eller falskt, o eller 1 – Kan implementeras som bitas, men oftast används en hel byte – Ökar läsbarheten i koden om true/false finns 4 » Jämför med C där 0 är falskt och allt annat är sant i ett ”sanningsuttryck” Anders Broberg, Programspråksteoridelen DVA Moment 2 Mer primitiva datatyper Tecken – Lagras som numeriska värden (Heltal) – Olika koder » ASCII (0..127) A=65, B=66…a=97, 0..31 samt 127 är ej ”skrivbara” » Unicode innehåller fler tecken används i Java Strängar – Värdet är en sekvens av tecken – Designfrågor » Är strängar en primitivtyp eller bara en specialvariant av array? » Är objektets längs statisk eller dynamsik? – Vad kan man göra med strängar » » » » » » 5 Tilldelning Jämförelse (=,<, etc.) Sammanslagnng (”Hej”+san” -> ”Hejsan” Referera till delsträngar Mönstermatchning Få information om längden Anders Broberg, Programspråksteoridelen DVA Moment 2 Exempel på strängar i olika språk Pascal - Inte primitiv datatyp; tilldelning och jämförelse på strängar som är lagrade på som ”packed arrays” Ada, FORTRAN 77, FORTRAN 90, och BASIC – Primitiv datatyp, tilldelning, jämförelse, sammanslagning, samt delsträngsreferering finns – FORTRAN har även mönstermatchning C och C++ - Inte primitiv datatyp – Använder teckenarrayer och biblioteksfunktioner för operationerna SNOBOL4 (Ett språk för sträng manipulering) – Primitiv + många operationer på strängar inkl mönstermatchning Perl – Kraftfull mönstermatchning mha. Reguljära uttryck Java – String class (inte array av tecken som i C++) 6 Anders Broberg, Programspråksteoridelen DVA Moment 2 Mer om strängar (längd) Statisk längd - FORTRAN 77&90, Ada, COBOL, Pascal – Är alltid full alla tecknen är ockuperade Begränsad Dynamisk längd - C och C++ – Man använder en null-tecknet för att markera strängslut – Kan lagra mellan 0 och maxtecken Dynamisk längd - SNOBOL4 och Perl – Ingen maximal längd – Kräver mycket ”overhead” Utvärdering av strängar – En hjälp för skrivbarheten – Som primitiv typ med statisk längd, väldigt billig att hantera, så varför inte ha dem?? – Dynamisk längd är bra, men är det värt kostnaden? 7 Implementationfrågor Anders Broberg, Programspråksteoridelen DVA Moment 2 Ordnade typer (Användar definierade) En (ordnade typer) ordinaltyp är en typ som till omfånget av möjliga värden lätt kan avbildas på en mängd av heltal – Uppräkningsbara » En datatyp där användaren kan numrera alla möjlig värden, och värden är som symboliska konstanter » Designfråga Skall en och samma symbolisk konstant kunna finnas i flera typdefinitioner? » Utvärderingsfrågor Stöd för läsbarheten Stöd för tillförlitligheten - – Delområdes » En ordnad delmängd av en ordnad typ » Designfråga 8 Till vad och hur skall man kunna använda dem? Anders Broberg, Programspråksteoridelen DVA Moment 2 Arrayer (Fält) Ordnad samling av homogena dataobjekt Varje element är identifierad genom sin position i samlingen relativt det första elementet Varje element (variabel) har alltså inget eget namn (anonyma variabler) Designfrågor – – – – – – – 9 Vilka typer kan man ha på referensobjektet? Är omfånget på referensuttrycken kontrollerade? När binds referensomfånget? När allokeras minnesutrymmet för arrayen? Vad är den maximala dimensionen på en array? Är det möjligt att initiera arrayobjekt? Vilka snitt är möjliga att göra? Anders Broberg, Programspråksteoridelen DVA Moment 2 Arryer indexering Indexering: – Är en avbildning från indexmängden till värdemängden – Kan ses som en funktion(index)->värde Arrayer är en form av tabeller 0 1 2 3 4 5 6 10 34 12 15 36 4 10 12 5 4 1 0 6 3 2 Anders Broberg, Programspråksteoridelen DVA Moment 2 Arryer syntax mm. FORTRAN, PLI, Ada använder paranteser – A(1..45) De flesta andra använder hakparanteser – A[index] = 23; Exempel på referenstyper i olika språk – FORTRAN och C - bara heltal som index – Pascal - vilken ordnad typ som helst » (int, boolean, char, enum) – Ada - heltal och uppräkningsbara » inkluderat boolean och char – Java - endast heltal (Java har inte enum. typer) 11 Anders Broberg, Programspråksteoridelen DVA Moment 2 Typer av Arrayer På samma sätt som för variabler så delas arrayer in i fyra olika kategorier efter livslängd, så delas arrayer in i fyra kategorier baserad på bindning av minnes och indexeringområde Oftast tillåter ett språk endast en av dessa varianter – Statiska » Både områdes och minnet binds statiskt » Ingen allokering/deallokering under exekvering » FORTRAN och Ada – Fixed stackdynamisk » » » » 12 Indexeringsområdet binds statiskt Minnet binds när en deklarationssats påträffas/utförs under exekvering Lokala arrayer i Pascal, och lokals som inte är static i C Minneseffektivt, viss OH-för allokering/deallokering Anders Broberg, Programspråksteoridelen DVA Moment 2 Typer av Arrayer forts. Stackdynamisk – – – – – Heap (hög)-dynamisk – – – – – – 13 Minnet binds dynamiskt Indexeringsområdet binds dynamiskt Men båda är fix under hela livstiden Deklarations block i Ada Flexibelt - man behöver inte känna till storleken förrän arrayen skall användas i programmet Minnet binds dynamiskt Indexeringsområdet binds dynamiskt Och båda är dynamsika under hela livstiden Finns i FORTRAN 90 och Java Samt I APL och Perl så växer/minskar minnesutrymmet efter behov Anders Broberg, Programspråksteoridelen DVA Moment 2 Arrayer max antal dimensioner FORTAN 1 tillåter max 3 dimensioner FORTAN 77 upp till 7 dimensioner C, C++, och Java tillåter bara 1 dimension men elementen kan vara arrayer => obegränsat med dimensioner – Var int x[ 2][4 ][ 5]; Andra språk så som Pascal, Modula-2 har ingen begränsning – Var x[0..2,0..3,0..4] of integer; 14 Anders Broberg, Programspråksteoridelen DVA Moment 2 Arrayer - initiering av värden Vanligtvis beskriver man en lista av elementvärden som stoppas in i arrayen i den ordning som elementen står i listan Exempel – FORTRAN - använder en speciell DATA sats eller stoppar in värden i /…/ i delaratioen – C och C++ - anger man värden innanför {….} – Kompilatorn kan räkna dem » int stuff[]={2,4,5,6,0}; » Calloc(antal,storlek) nollställer alla element – Ada - positioner kan specificeras » SCORE: array(1..14,1..2) := (=>(24,10),2 =>(10,7) others=>(0,0) – Pascal och Modula-2 - tillåter ingen arrayinitiering 15 Anders Broberg, Programspråksteoridelen DVA Moment 2 Operationer på arrayer Operationer på arrayer som helheter brukar inte vara så vanliga, trots att arrayer är viktiga i många tillämpningar inom vetenskapliga beräkningar. – FORTRAN 77 - har inga arrayoperationer – Ada - tilldelning RHS kan vara en arraykonstant eller arraynamn » Sammanslagning på 1D samt = och /= – APL - ett exempel på språk med många operationer på arrayobjekt » » » » » » Reverserar element i en vektor Reverserar kolumn/rad vektor elementen i en matris Transponerar en matris Inversen på en matris Innerprodukten mm. Möjlighet att enkelt bygga egna mha • – FORTRAN 90 har en bred uppsättning av inbyggda (underprogram) för arrayoperationer » Matrismultiplikation » Vektor kryssprodukt, mm 16 Anders Broberg, Programspråksteoridelen DVA Moment 2 Arrayer - slices (snitt) Slices är ett sätt att referera till en del av en array – Det är en referensmekanism Exempel – FORTRAN 90 » INTEGER MAT(1:4,1:4) » MAT(1:4,1) -> första kolumnen » MAT(2,1:4) -andra kolumnen – Ada - fungera endast på 1D arrayer (vektorer) » LIST(4..35) Implementation (kursivt) – Accessfunktioen avbildar indexeringutrycken till adresser i arrayen – Rad-implementation » C, C++ – Kolumn-implemenation » FORTRAN 17 Anders Broberg, Programspråksteoridelen DVA Moment 2 Associativa arrayer Är en oordnad samling av dataelement (homogen) som är indexerade med en lika stor samling av värden (nycklar). – Lexicon » (Nyckel,värde) – Finns i » Java, Perl Designfrågor – På vilken form är referenserna till elementen? anka – Är storleken statisk eller dynamisk korp rödhake påfågel gås kråka stenbit 18 Anders Broberg, Programspråksteoridelen DVA Moment 2 34 12 15 36 4 10 0