Plan: Parameter-overføring Alias Typer (Ghezzi&Jazayeri kap.3 frem til 3.3.1) Funksjonelle språk (Ghezzi&Jazayeri kap.7 frem til 7.4) Neste uke: ML Ark 1 av 16 Forelesning 16.10.2000
Parameteroverføring Parametre plasseres blant de lokale variablene. Det er imidlertid ulike teknikker for hva som skal plasseres der: Referanseparametre Kopiparametre Verdiparametre Resultatparametre Verdi-resultatparametre Navneparametre Definisjoner Formell parameter er den parameteren som forekommer i rutinedeklarasjonen. Aktuell parameter er den parameteren som forekommer i rutinekallet. Forelesning 16.10.2000 Ark 2 av 16
Referanseparametre Her sendes det over en referanse til hvilken lagercelle parameteren ligger i. Eksempel int a = 1; void f(int x) { x=x+1; } void main() { f(a); } ip f main C set D[D[0]+3], D[D[D[0]+3]]+1 set 1, D[0] set 0, D[D[0]+1] jump D[D[1]] set D[1], 11 set D[1]+1, D[0] set D[1]+2, D[0] set D[1]+3, 2 set 0, D[1] set 1, D[1]+4 jump 0 halt 0 1 2 3 4 5 6 7 8 9 10 11 D «current» = 6 «free» = 10 a = 1 «return» = 0 «dyn link» = 0 «stat link» = 0 «return» = 11 «dyn link» = 3 «stat link» = 3 x = 2 «globale» main f Referanseparametre brukes i C (for matriser), FORTRAN og Simula (for matriser og tekster). Forelesning 16.10.2000 Ark 3 av 16
Verdiparametre Her sender man med en kopi av parameteren. Det betyr at hvis den endres i rutinen, vil den aktuelle parameteren forbli uendret. ip f main C set D[0]+3, D[D[0]+3]+1 set 1, D[0] set 0, D[D[0]+1] jump D[D[1]] set D[1], 11 set D[1]+1, D[0] set D[1]+2, D[0] set D[1]+3, D[2] set 0, D[1] set 1, D[1]+4 jump 0 halt 0 1 2 3 4 5 6 7 8 9 10 11 D «current» = 6 «free» = 10 a = 1 «return» = 0 «dyn link» = 0 «stat link» = 0 «return» = 11 «dyn link» = 3 «stat link» = 3 x = 1 «globale» main Verdiparametre brukes i Java, C (for alt unntatt matriser) og Simula (for enkle variable). f Forelesning 16.10.2000 Ark 4 av 16
Resultatparametre Dette er det «motsatte» av verdiparametre: Den lokale kopien i rutinen kopieres over til den aktuelle parameteren når rutinen returnerer. ip f main C set D[0]+3, D[D[0]+3]+1 set 1, D[0] set 0, D[D[0]+1] jump D[D[1]] set D[1], 10 set D[1]+1, D[0] set D[1]+2, D[0] set 0, D[1] set 1, D[1]+4 jump 0 set 2, D[D[1]+3] halt 0 1 2 3 4 5 6 7 8 9 10 11 D «current» = 6 «free» = 10 a = 1 «return» = 0 «dyn link» = 0 «stat link» = 0 «return» = 10 «dyn link» = 3 «stat link» = 3 x =?? «globale» main f Forelesning 16.10.2000 Ark 5 av 16
Verdi-resultatparametre Dette er en kombinasjon av de to foregående, og effekten er nesten den samme som referanseparametre. ip f main C set D[0]+3, D[D[0]+3]+1 set 1, D[0] set 0, D[D[0]+1] jump D[D[1]] set D[1], 11 set D[1]+1, D[0] set D[1]+2, D[0] set D[1]+3, D[2] set 0, D[1] set 1, D[1]+4 jump 0 set 2, D[D[1]+3] halt 0 1 2 3 4 5 6 7 8 9 10 11 12 13 D «current» = 6 «free» = 10 a = 1 «return» = 0 «dyn link» = 0 «stat link» = 0 «return» = 11 «dyn link» = 3 «stat link» = 3 x = 1 «globale» main f Forelesning 16.10.2000 Ark 6 av 16
Navneparametre Dette er en gammel metode som minner om bruk av makro: «Selve uttrykket» sendes over, og det beregnes på nytt hver gang det brukes, og svarer til tekstlig substitusjon. Et kjent eksempel på hva man kan gjøre med navneparametre, er «Jensen s device». Hvis vi kjører programmet på neste ark, får vi følgende utskrift: Summen 1-10 av x^2: 385 Summen av a: 29 Antall oddetall i a: 3 Forelesning 16.10.2000 Ark 7 av 16
begin integer procedure Jensen(x, i, n); name x, i, n; integerx,i,n; begin integer index, sum; for index := 1 step 1 until n do begin i:=index; sum := sum + x; end for; Jensen := sum; end Jensen; integer ix, res1, res2, res3; integer array a(1:5); res1 := Jensen(ix*ix, ix, 10); OutText("Summen 1-10 av x^2: "); OutInt(res1,0); OutImage; a(1) := 7; a(2) := -1; a(3) := 11; a(4) := 8; a(5) := 4; res2 := Jensen(a(ix), ix, 5); OutText("Summen av a: "); OutInt(res2,0); OutImage; res3 := Jensen(if Rem(a(ix),2)<>0 then 1 else 0, ix, 5); OutText("Antall oddetall i a: "); OutInt(res3,0); OutImage; end Forelesning 16.10.2000 Ark 8 av 16
Navneparametre: Eksempel PROC Bytt(x,y) BEGIN VAR tmp := x; x := y; y :=tmp END Se på kallet Bytt(i, a[i]). Hvis parametrene overføres ved name kan kallet forstås slik: BEGIN VAR tmp := i; i := a[i]; a[i] := tmp END som ikke helt er det samme som å bytte om to tall! Forelesning 16.10.2000 Ark 9 av 16
Aliasing To variable (uttrykt i samme programenhet) kalles aliaser hvis deres verdier ligger på samme sted i lageret. Alias kan oppstå ved bruk av pekere: For eksempel, p1 : NEW C(...); p2 : p1 referanse-overføring: Gitt PROC p(x,y); BEGIN..x...y...END så vil kallet p(w, w) gi opphav til alias. name-overføring: for eksempel som over. ikke-lokale variable: Gitt PROC p(x); BEGIN... w...x...end så vil kallet p(w) gi opphav til alias. Verdi-parametre gir ikke opphav til alias. Forelesning 16.10.2000 Ark 10 av 16
Referanse-parametre: Alias-eksempel PROC Bytt2(x,y) kall: Bytt2(a,b) BEGIN a b x := x+y; a+b b y := x-y; a+b a x := x-y; b a END Denne vil vanligvis bytte om to tall (uten bruk av ekstra variable). Se på kallet Bytt(a, a). Hvis parametrene overføres ved referanse får vi: verdi på x ======================= a x := x+y; a+a y := x-y; 0 x := x-y; 0 som ikke helt er det samme som å bytte om to tall! Forelesning 16.10.2000 Ark 11 av 16
Prosedyrer som parametre BEGIN VAR c:int;... PROC A(x:Int,y:Bool); BEGIN...x...y..c..END; PROC B(p(Int,Bool),x:Int); BEGIN... CALL p(x,false)...end; CALL B(A,0); END IN 211 Programmeringsspråk Merk: Her er p en formell parameter. Siden parametertypene til p er eksplisitt gitt, kan vi gjøre type-analyse av kallet på p. Problem: Hvordan lage kode for kallet på p? Vi kjenner ikke starten på koden som skal utføres, ikke lengden av aktiveringsblokken som skal opprettes, og ikke statisk link. Løsning: Disse tre informasjonsbitene sendes som parametre! Dvs. en prosedyreparameter blir implementert ved et slikt trippel. Forelesning 16.10.2000 Ark 12 av 16
Typer En (data-)type består av: en verdimengde tilhørende operasjoner for å lage, se på og endre slike verdier Eksempel: Type: boolean Verdimengde: {true, false} Operatorer: NOT, AND, OR... Programmeringsspråk har vanligvis en del predefinerte typer, samt mekanismer for å lage mer komplekse datatyper fra disse. Forelesning 16.10.2000 Ark 13 av 16
Spesielle TYPE-mekanismer predefinerte typer, ofte integer, real, character, string oppramstyper, eks. {mandag, tirsdag, onsdag,...} intervall-typer, f.eks. tallene fra 1 til 100 lister, sekvenser predefinert i LISP, ML tabeller, arrayer gjerne predefinert i imperative språk Forelesning 16.10.2000 Ark 14 av 16
Generelle TYPE-mekanismer produkt-typer med flere komponenter Pascal/Ada: record C/C++: structure Java/Simula: klasser union-typer gir flere alternativer Eksempel (i ML-syntaks): datatype boolean = true false; Pascal/Ada: variant record C/C++: union Java/Simula: super-/subklasser rekursive typer inneholder noe av sin egen type Eksempel: liste av heltall class Node { int verdi; Node neste; } Node liste; parametriserte typer muliggjør datastrukturer over vilkårlige element -typer Eksempel: en generell liste Forelesning 16.10.2000 Ark 15 av 16
Abstrakte datatyper Innkapsling: Kan definere verdimengden og de tilhørende funksjonene i én modul. Beskyttelse: Skjule visse funksjoner og variable i en modul slik at de ikke kan brukes utenfor modulen. Eksempel: Rasjonale tall som data-type: Type RAT = modulebegin # Verdimengde/datastruktur: t, n : Int # Tilhørende funksjoner: FUNC mult(a,b:rat):rat == RETURN((a.t*b.t),(a.n*b.n))... endmodule RAT Forelesning 16.10.2000 Ark 16 av 16