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