1 / 31

Principles of Programming Languages

Principles of Programming Languages. Lecture 06 Parameters. Parameter Passing Modes. Definitional Modes (call time binding) Call as constant CAC Call by reference CBR Copying Modes (call time copying) Call by value CBV Call by copy CBC Copy-in/copy-out Call by value-result CBVR

lcolby
Download Presentation

Principles of Programming Languages

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Principles of ProgrammingLanguages Lecture 06 Parameters C SC 520 Principles of Programming Languages

  2. Parameter Passing Modes • Definitional Modes (call time binding) • Call as constant CAC • Call by reference CBR • Copying Modes (call time copying) • Call by value CBV • Call by copy CBC • Copy-in/copy-out • Call by value-result CBVR • Delay Modes (reference time copying) • Call by text CBT • Call by name CBN • Call by need • R-value CBNeed-R • L-Value CBNeed-L C SC 520 Principles of Programming Languages

  3. Example Program { local i,j local a[1..12] proc P( X , Y ) { local j j = 2 i = i + 1 print X X = X + 2 print Y i--; print Y } a[1]=1; a[2]=2; … ; a[12]=12; i = 1 j = 3 P( i , a[i*j] ) print i print a[9] } C SC 520 Principles of Programming Languages

  4. Program Execution Sequence i = 1 j = 3 P( i , a[i*j] ) X , Y j = 2 // this j is local i = i + 1 print X X = X + 2 print Y i--; print Y print i print a[9] C SC 520 Principles of Programming Languages

  5. i = 1 j = 3 P( i , a[i*j] ) X , Y j = 2 i = i + 1 print X X = X + 2 print Y i--; print Y print i print a[9] rewrite proc body X -> i Y -> a[i*j] j = 2 // j==2 i=i+1 // i==2 print i 2 i = i+2 //i==4 print a[i*j] //a[4*2]8 i--; print a[i*j] 6 print i 3 print a[9] 9 Call by text (macrosubstitution) C SC 520 Principles of Programming Languages

  6. i = 1 j = 3 P( i , a[i*j] ) X , Y j = 2 i = i + 1 print X X = X + 2 print Y i--; print Y print i print a[9] Rename locals j->j’ & rewrite X -> i Y -> a[i*j] j = 2 //j’==2 j==3 i=i+1 //i == 2 print i 2 i = i+2 //i==4 print a[i*j]//a[4*3]12 i--; print a[i*j] 9 ! print i 3 print a[9] 9 Call by name (copy rule) C SC 520 Principles of Programming Languages

  7. Algol 60 “Copy Rule” • 4.7.3.2. Name replacement (call by name) Any formal parameter not quoted in the value list is replaced, throughout the procedure body, by the corresponding actual parameter . . . Possible conflicts between identifiers inserted through this process and other identifiers already present within the procedure body will be avoided by suitable systematic changes of the formal or local identifiers involved . . . Finally the procedure body, modified as above, is inserted in place of the procedure statement [the call] and executed . . . –Report on the Algorithmic Language ALGOL 60, CACM, May 1960 C SC 520 Principles of Programming Languages

  8. integer procedure f(x); integer x; begin integer y; y := 1; f := x + y; end; begin integer y, w; y := 2; w := 10; w := f(y + w + 1); end; begin integer y,w; y :=2; w := 10; begin integer z; z := 1; w :=(y+w+1)+z; end; end; Algol 60 “Copy Rule” (cont.) Copy rule C SC 520 Principles of Programming Languages

  9. thunk: a 0-arg. Procedure encapsulating actual argument plus environment of caller, called at site of each formal. Used to implement CBN and delayed evaluation in general integer procedure f(x); integer x; begin integer y; y := 1; f := x + y; end; begin integer y, w; y := 2; w := 10; w := f(y + w + 1); end; int function f(int x); { int y; y = 1; f = *x() + y; } { int y,w; int& function x() {int t=y+w+1;return &t;} y = 2; w = 10; w =f(y+w+1); } Algol 60 “Copy Rule” (cont.): Thunks C SC 520 Principles of Programming Languages

  10. i = 1 j = 3 P( i , a[i*j] ) X , Y j = 2 i = i + 1 print X X = X + 2 print Y i--; print Y print i print a[9] thunk: 0-ary function encapsulating argument text int& X(){return &i} int& Y(){return &a[i*j]} j = 2 // j’==2 j==3 i=i+1 // i == 2 print *X() 2 X()=*X()+2 //i==4 print *Y() //a[i*j]==a[4*3]12 i--; print *Y() 9 ! print i 3 print a[9] 9 Call by name—implemented by thunk C SC 520 Principles of Programming Languages

  11. i = 1 j = 3 P( i , a[i*j] ) X , Y j = 2 i = i + 1 print X X = X + 2 print Y i--; print Y print i print a[9] lval(X)==lval(i) lval(Y)==lval(a[1*3]) j = 2 //j’==2 j==3 i=i+1 //i== 2 print i 2 i = i+2 //i==4 print a[1*3] 3 i--; print a[1*3] 3 print i 3 print a[9] 9 Call by reference aliased C SC 520 Principles of Programming Languages

  12. i = 1 j = 3 P( i , a[i*j] ) X , Y j = 2 i = i + 1 print X X = X + 2 print Y i--; print Y print i print a[9] X = i //X==1 Y =a[i*j])//Y==a[1*3] j = 2 //j’==2 j==3 i=i+1 //i == 2 print X 1 X = X+2 //i==2 X==3 print Y 3 i--; print Y 3 print i 1 print a[9] 9 Call by value (copy-in) C SC 520 Principles of Programming Languages

  13. i = 1 j = 3 P( i , a[i*j] ) X , Y j = 2 i = i + 1 print X X = X + 2 print Y i--; print Y print i print a[9] X =i Y =a[i*j])//Y==a[1*3] j = 2 // j’==2 j==3 i=i+1 // i == 2 print X 1 X = X+2 //i==2 X==3 print Y 3 i--; print Y 3 Use names of actuals for copy-out i = X //i==3 a[i*j] = Y //a[3*3]==3 print i 3 print a[9] 3 Call by value–result (Algol W) C SC 520 Principles of Programming Languages

  14. i = 1 j = 3 P( i , a[i*j] ) X , Y j = 2 i = i + 1 print X X = X + 2 print Y i--; print Y print i print a[9] px=lvalue(i) X=*px py=lvalue(a[1*3]) Y=*py j = 2 // j’==2 j==3 i=i+1 // i == 2 print X 1 X = X+2 //i==2 X==3 print Y 3 i--; print Y 3 Use originallvals for copy-out *px = X //i==3 *py = Y //a[3]==3 print i 3 print a[9] 9 Call by copy (copy-in/copy-out) C SC 520 Principles of Programming Languages

  15. i = 1 j = 3 P( i , a[i*j] ) X , Y j = 2 i = i + 1 print X X = X + 2 print Y i--; print Y print i print a[9] Use thunk once on 1st refto assign local; then use local int& X(){return &i} int& Y(){return &a[i*j]} j = 2 // j’==2 j==3 i=i+1 // i == 2 print X = *X() 2 //X==2 X = X+2 //i==2 X==4 print Y = *Y() //Y==a[i*j]==a[2*3]6 i--; print Y 6 print i 1 print a[9] 9 Call by need, r-value (“normal”, lazy) C SC 520 Principles of Programming Languages

  16. i = 1 j = 3 P( i , a[i*j] ) X , Y j = 2 i = i + 1 print X X = X + 2 print Y i--; print Y print i print a[9] At 1st ref, alias actual lval to formal int& X(){return &i} int& Y(){return &a[i*j]} j = 2 // j’==2 j==3 i=i+1 // i == 2 lval(X)==X() //X aliases i print X //X==2 2 X = X+2 //i==4 X==4 lval(Y)==Y()//Y aliases a[4*3] print Y //Y==a[12]}12 i--; print Y 12 print i 3 print a[9] 9 Call by need, l-value C SC 520 Principles of Programming Languages

  17. Call by Name vs. Call by Need • Assume Xis the formal and ethe corresponding actual expression • CBN • Delays evaluation of arguments past call until a reference to the formal • Re-evaluates argument e on each reference to X in environment of caller • No local variable X is allocated • Implemented by call to thunk • CB Need • Delays evaluation of arguments past call until a reference to the formal • Evaluates e on 1st reference in environment of caller& loads local variable X; no re-evaluation: subsequent references use local X • Implemented by call to “memoized thunk” C SC 520 Principles of Programming Languages

  18. i = 1 j = 3 P( i , a[i*j] ) X , Y j = 2 i = i + 1 print X X = X + 2 print Y i--; print Y print i print a[9] const X =i const Y =a[1*3] j = 2 // j’==2 j==3 i=i+1 // i == 2 print X 1 X = X+2 error print Y (3) i--; print Y (3) print i (1) print a[9] (9) Call by constant C SC 520 Principles of Programming Languages

  19. Modes Differ • Definitional Modes (call time binding) example • Call as constant CAC 1 error • Call by reference CBR 2 3 3 3 9 • Copying Modes (call time passing) • Call by value CBV 1 3 3 1 9 • Call by copy CBC 1 3 3 3 9 • Copy-in/copy-out • Call by value-result CBVR 1 3 3 3 3 • Delay Modes (reference time passing) • Call by text CBT 2 8 6 3 9 • Call by name CBN 2 12 9 3 9 • Call by need • R-value CBNeed-R 2 6 6 1 9 • L-Value CBNeed-L 2 12 12 3 9 C SC 520 Principles of Programming Languages

  20. Modes in Programming Languages • Call as constant Algol 68, C/C++ const • Call by reference Pascal var, Fortran, Cobol, PL/I, Ada arrays, C arrays • Call by value Algol 60, Algol 68 (has ref x), Simula, C, C++ (has &x), Pascal, PL/I, APL, LISP, Snobol4, Ada (scalar in variables) • Call by copy Ada (scalar out or in-out) • Call by value-result Algol W • Call by text LISP Macros • Call by name Algol 60, Simula • Call by need, R-value Haskell, Scheme (delay x) &(force x) • Call by need, L-value imperative + lazy eval? C SC 520 Principles of Programming Languages

  21.         in in out out in-out in-out Ada Parameters • Attempt at orthogonality of use vs implementation copy-in copy-out copy-in-copy-out copy iplementationm scalar parameters CBC required ref use copy implementation CBC/CBR option composite Parameters (arrays &c) ref use C SC 520 Principles of Programming Languages

  22. Arrays: by ref or by copy? a[] void function P(int x[]) { … x[i1] … x[i2] . . . x[in] … } n references to elements of formal x[] at RT (n known at RT) • Call by reference: copy a pointer to a[] into AR for P(a[]) • Each reference x[i] becomes indirect address through pointer to original argument a[] in caller; loads and stores reflected immediately in original array • Call by copy: copy argument a[] into AR for P(a[])& overwrite original a[] from copy on return • Each reference x[i] directly addresses copy; stores and loads made to copy s elements C SC 520 Principles of Programming Languages

  23. Q calls P(a[]) by copy: # of memory references at RT: C = 4s + n by ref or copy? (cont.) Code of P(int x[]) =x[i] . . . x[j]= P n refs a[] call Q a[] s return C SC 520 Principles of Programming Languages

  24. Q calls P(a[]) by reference: # of memory references at RT: Assume a[0] is at known fp+offset at CT R = 1 + 2n by ref or copy? (cont.) Code of P(int x[]) =x[i] . . . x[j]= @ P n refs @ call Q a[] s C SC 520 Principles of Programming Languages

  25. by ref or copy? (cont.) • R > C  1 + 2n > 4s + n  n > 4s - 1  n  4s • Reference density: n / s = ave. # references per element • Copying less expensive than reference: R > C n / s  4 s size R C s = n/4 R > C n references C SC 520 Principles of Programming Languages

  26. More on Call By Name Most curious mode ever invented. Pros and Cons. • CBN’s main characteristics: • Defers evaluation of actual argument expressions • Re-evaluates the argument expression at each use of formal • So arg value can actually change from one ref to another • Can simulate lazy evaluation example: short circuit booleans boolean procedure cand(p,q); boolean p, q; if p then cand := q else cand := false; end • Cannot be written as a procedure in an “eager” programming language (like Scheme) C SC 520 Principles of Programming Languages

  27. CBN (cont.) • “Jensen’s Device” –weird sort of polymorphism Example: real procedure sigma(x, j, n); value n; real x; integer j, n; begin real s; s := 0; for j := 1 step 1 until n do s := s + x; sigma := s end • sigma( a(i), i, 3)  a(1) + a(2) + a(3) • sigma( a(k)*b(k), k, 2)  a(1)*b(1) + a(2)*b(2) C SC 520 Principles of Programming Languages

  28. CBN (cont.) Example: begin comment zero vector procedure zero(elt, j, lo, hi); value lo, hi; integer elt, j, lo, hi; begin for j := lo step 1 until hi do elt := 0; end integer i; integer array a[1:10], b[1:5, 1:5]; zero(a[i], i, 1, 10); zero(b[i, i], i, 1, 5); end C SC 520 Principles of Programming Languages

  29. Limitations of CBN: the obvious “swap” algorithm fails begin procedure swap(a, b); integer a, b; begin integer t; t := b; b := a; a := t; end; integer array a[1:10]; integer i; i := 1; a[i] := 2; // i=1 a[1]=2 swap(a[i], i); //(a[1],i)=(2,1) end swap(a[i],i) //i==2 & //a[1]==2 t:= i // t==1 i:=a[i] // i==2 a[i]:=t // a[2]==1 //(a[1],i)==(2,2) Reordering code doesn’t help; swap(i, a[i]) fails CBN (cont.) C SC 520 Principles of Programming Languages

  30. CBN (cont.) • Proposed “solution”: assume in t:=s that the target l-value is computed before the source r-value procedure swap(a, b); integer a, b; begin integer procedure testset(t,s); integer t,s; begin testset := t; //ret. old r-val of target t := s; //assign source r-val to target end; a := testset(b, a); end swap(a[i], i) a[i]:=testset(i,a[i]) ts:=i; i:=a[i]; a[i]:=ts C SC 520 Principles of Programming Languages

  31. CBN (cont.) • Problem: proposed “solution” has a bug. • Difficulty is the re-evaluation of actual on each use of formal • Can arrange an actual that yields a distinct l-value on each use begin integer array a[1:10]; integer j; integer procedure i; comment return next integer; begin j:= j + 1; i := j end; j := 0; swap(a[i], a[i]) end • a[i] := testset(a[i], a[i]) ts :=a[i]; a[i]:=a[i]; a[i]:=ts; ts :=a[1]; a[2]:=a[3]; a[4]:=ts; C SC 520 Principles of Programming Languages

More Related